about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-07-16T21·00+0100
committertazjin <mail@tazj.in>2020-07-16T21·03+0000
commitd470ec0d2946d77b0e4c4b9a0a1e383c0a817167 (patch)
tree832f3e215b4f21438d7bc5f4a8ce08ae7af7e236
parent1b42504a12aa42fbb080c4be1182c3ee9df21fc6 (diff)
refactor(3p/nix/libexpr): Use Abseil collection types for parser state r/1325
Replaces the previous uses of the (ordered!) std::map and std::set
with absl::flat_hash_{map|set}.

After some careful reading it seems that there is actually no
ordering dependency on these types, and the (drop-in) replacements
perform slightly better.

Overall this is not fixing a bottleneck, just a driveby thing.

Change-Id: Ided695dc75676bd58515aa9382df0be0a09c565e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1220
Reviewed-by: glittershark <grfn@gws.fyi>
Reviewed-by: isomer <isomer@tvl.fyi>
Tested-by: BuildkiteCI
-rw-r--r--third_party/nix/src/libexpr/nixexpr.hh10
-rw-r--r--third_party/nix/src/libexpr/symbol-table.hh5
2 files changed, 13 insertions, 2 deletions
diff --git a/third_party/nix/src/libexpr/nixexpr.hh b/third_party/nix/src/libexpr/nixexpr.hh
index 3bf9e4a1a77a..4b2bd86ef966 100644
--- a/third_party/nix/src/libexpr/nixexpr.hh
+++ b/third_party/nix/src/libexpr/nixexpr.hh
@@ -3,6 +3,7 @@
 #include <map>
 #include <optional>
 #include <variant>
+#include <absl/container/flat_hash_map.h>
 
 #include "libexpr/symbol-table.hh"
 #include "libexpr/value.hh"
@@ -183,6 +184,7 @@ struct ExprOpHasAttr : Expr {
 
 struct ExprAttrs : Expr {
   bool recursive;
+
   struct AttrDef {
     bool inherited;
     Expr* e;
@@ -192,16 +194,20 @@ struct ExprAttrs : Expr {
         : inherited(inherited), e(e), pos(pos){};
     AttrDef(){};
   };
-  typedef std::map<Symbol, AttrDef> AttrDefs;
+
+  typedef absl::flat_hash_map<Symbol, AttrDef> AttrDefs;
   AttrDefs attrs;
+
   struct DynamicAttrDef {
     Expr *nameExpr, *valueExpr;
     Pos pos;
     DynamicAttrDef(Expr* nameExpr, Expr* valueExpr, const Pos& pos)
         : nameExpr(nameExpr), valueExpr(valueExpr), pos(pos){};
   };
+
   typedef std::vector<DynamicAttrDef> DynamicAttrDefs;
   DynamicAttrDefs dynamicAttrs;
+
   ExprAttrs() : recursive(false){};
   COMMON_METHODS
 };
@@ -336,7 +342,7 @@ struct ExprPos : Expr {
 struct StaticEnv {
   bool isWith;
   const StaticEnv* up;
-  typedef std::map<Symbol, unsigned int> Vars;
+  typedef absl::flat_hash_map<Symbol, unsigned int> Vars;
   Vars vars;
   StaticEnv(bool isWith, const StaticEnv* up) : isWith(isWith), up(up){};
 };
diff --git a/third_party/nix/src/libexpr/symbol-table.hh b/third_party/nix/src/libexpr/symbol-table.hh
index dcb44d32f623..3542f0eadad1 100644
--- a/third_party/nix/src/libexpr/symbol-table.hh
+++ b/third_party/nix/src/libexpr/symbol-table.hh
@@ -26,6 +26,11 @@ class Symbol {
   bool empty() const { return s->empty(); }
 
   friend std::ostream& operator<<(std::ostream& str, const Symbol& sym);
+
+  template <typename H>
+  friend H AbslHashValue(H h, const Symbol& c) {
+    return H::combine(std::move(h), c.s);
+  }
 };
 
 // SymbolTable is a hash-set based symbol-interning mechanism.