From 57d18df7d0005cf822368d9f1d0c33396c6b9f9f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 2 Sep 2013 18:34:04 +0200 Subject: [PATCH] Add some support code for nix-repl --- src/libexpr/eval.cc | 9 ++++++++- src/libexpr/eval.hh | 15 ++++++++------- src/libexpr/parser.y | 14 ++++++++++---- 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); }