aboutsummaryrefslogtreecommitdiff
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 e5c7226c1..6ac07eed6 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 f7b21f7a3..98ac0bdb4 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 60ad3f079..623ac641c 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);
}