aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-08 15:19:59 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-08 15:36:10 +0200
commit9deb822180fb80638559fe3c45c6a77a2b56ff40 (patch)
treeaa11694219d4ce88f028de4c8acd18cbd4f8b975
parentb1e3b1a4ac8c276f503713f6002c3b42efef2ae8 (diff)
Deduplicate filenames in Pos
This saves ~4 MiB of RAM for NixOS system instantiation, and ~18 MiB for "nix-env -qa".
-rw-r--r--src/libexpr/eval.cc1
-rw-r--r--src/libexpr/nixexpr.hh8
-rw-r--r--src/libexpr/parser.y4
3 files changed, 7 insertions, 6 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index b54f32faf..df129eda6 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -636,7 +636,6 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v)
if (state.countCalls && pos) state.attrSelects[*pos]++;
}
-
state.forceValue(*vAttrs);
} catch (Error & e) {
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index f5cc69801..2178c016e 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -23,14 +23,16 @@ MakeError(UndefinedVarError, Error)
struct Pos
{
- string file;
+ Symbol file;
unsigned int line, column;
Pos() : line(0), column(0) { };
- Pos(const string & file, unsigned int line, unsigned int column)
+ Pos(const Symbol & file, unsigned int line, unsigned int column)
: file(file), line(line), column(column) { };
bool operator < (const Pos & p2) const
{
- int d = file.compare(p2.file);
+ if (!line) return p2.line;
+ if (!p2.line) return false;
+ int d = ((string) file).compare((string) p2.file);
if (d < 0) return true;
if (d > 0) return false;
if (line < p2.line) return true;
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 6a282e905..dab71546f 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -29,7 +29,7 @@ namespace nix {
SymbolTable & symbols;
Expr * result;
Path basePath;
- Path path;
+ Symbol path;
string error;
Symbol sLetBody;
ParseData(EvalState & state)
@@ -486,7 +486,7 @@ Expr * EvalState::parse(const char * text,
yyscan_t scanner;
ParseData data(*this);
data.basePath = basePath;
- data.path = path;
+ data.path = data.symbols.create(path);
yylex_init(&scanner);
yy_scan_string(text, scanner);