about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc9
-rw-r--r--src/libexpr/eval.hh15
-rw-r--r--src/libexpr/parser.y14
3 files changed, 26 insertions, 12 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index e5c7226c1b..6ac07eed6c 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -143,8 +143,8 @@ EvalState::EvalState()
     , sIgnoreNulls(symbols.create("__ignoreNulls"))
     , repair(false)
     , baseEnv(allocEnv(128))
-    , baseEnvDispl(0)
     , staticBaseEnv(false, 0)
+    , baseEnvDispl(0)
 {
     nrEnvs = nrValuesInEnvs = nrValues = nrListElems = 0;
     nrAttrsets = nrOpUpdates = nrOpUpdateValuesCopied = 0;
@@ -456,6 +456,13 @@ void EvalState::evalFile(const Path & path, Value & v)
 }
 
 
+void EvalState::resetFileCache()
+{
+    fileEvalCache.clear();
+    parseTrees.clear();
+}
+
+
 void EvalState::eval(Expr * e, Value & v)
 {
     e->eval(*this, baseEnv, v);
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index f7b21f7a38..98ac0bdb45 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -130,12 +130,15 @@ public:
     Expr * parseExprFromFile(Path path);
 
     /* Parse a Nix expression from the specified string. */
+    Expr * parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv);
     Expr * parseExprFromString(const string & s, const Path & basePath);
 
     /* Evaluate an expression read from the given file to normal
        form. */
     void evalFile(const Path & path, Value & v);
 
+    void resetFileCache();
+
     /* Look up a file in the search path. */
     Path findFile(const string & path);
 
@@ -184,21 +187,19 @@ public:
        path.  Nothing is copied to the store. */
     Path coerceToPath(Value & v, PathSet & context);
 
-private:
+public:
 
     /* The base environment, containing the builtin functions and
        values. */
     Env & baseEnv;
 
-    unsigned int baseEnvDispl;
-
-public:
-
     /* The same, but used during parsing to resolve variables. */
     StaticEnv staticBaseEnv; // !!! should be private
 
 private:
 
+    unsigned int baseEnvDispl;
+
     void createBaseEnv();
 
     void addConstant(const string & name, Value & v);
@@ -212,8 +213,8 @@ private:
     friend class ExprAttrs;
     friend class ExprLet;
 
-    Expr * parse(const char * text,
-        const Path & path, const Path & basePath);
+    Expr * parse(const char * text, const Path & path,
+        const Path & basePath, StaticEnv & staticEnv);
 
 public:
 
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 60ad3f0792..623ac641cc 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -481,7 +481,7 @@ namespace nix {
 
 
 Expr * EvalState::parse(const char * text,
-    const Path & path, const Path & basePath)
+    const Path & path, const Path & basePath, StaticEnv & staticEnv)
 {
     yyscan_t scanner;
     ParseData data(*this);
@@ -496,7 +496,7 @@ Expr * EvalState::parse(const char * text,
     if (res) throw ParseError(data.error);
 
     try {
-        data.result->bindVars(staticBaseEnv);
+        data.result->bindVars(staticEnv);
     } catch (Error & e) {
         throw ParseError(format("%1%, in `%2%'") % e.msg() % path);
     }
@@ -527,7 +527,7 @@ Expr * EvalState::parseExprFromFile(Path path)
        tree cache. */
     Expr * e = parseTrees[path];
     if (!e) {
-        e = parse(readFile(path).c_str(), path, dirOf(path));
+        e = parse(readFile(path).c_str(), path, dirOf(path), staticBaseEnv);
         parseTrees[path] = e;
     }
 
@@ -535,9 +535,15 @@ Expr * EvalState::parseExprFromFile(Path path)
 }
 
 
+Expr * EvalState::parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv)
+{
+    return parse(s.c_str(), "(string)", basePath, staticEnv);
+}
+
+
 Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
 {
-    return parse(s.c_str(), "(string)", basePath);
+    return parseExprFromString(s, basePath, staticBaseEnv);
 }