Author: eelco
Date: Sat Aug 6 13:02:55 2011
New Revision: 28192
URL: https://svn.nixos.org/websvn/nix/?rev=28192&sc=1
Log:
* Refactoring: move parseExprFromFile() and parseExprFromString() into
the EvalState class.
Deleted:
nix/trunk/src/libexpr/parser.hh
Modified:
nix/trunk/src/libexpr/Makefile.am
nix/trunk/src/libexpr/common-opts.cc
nix/trunk/src/libexpr/eval.cc
nix/trunk/src/libexpr/eval.hh
nix/trunk/src/libexpr/parser.y
nix/trunk/src/libexpr/primops.cc
nix/trunk/src/nix-env/nix-env.cc
nix/trunk/src/nix-env/user-env.cc
nix/trunk/src/nix-instantiate/nix-instantiate.cc
Modified: nix/trunk/src/libexpr/Makefile.am
==============================================================================
--- nix/trunk/src/libexpr/Makefile.am Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/libexpr/Makefile.am Sat Aug 6 13:02:55 2011 (r28192)
@@ -6,7 +6,7 @@
names.cc
pkginclude_HEADERS = \
- nixexpr.hh eval.hh parser.hh lexer-tab.hh parser-tab.hh \
+ nixexpr.hh eval.hh lexer-tab.hh parser-tab.hh \
get-drvs.hh attr-path.hh value-to-xml.hh common-opts.hh \
names.hh symbol-table.hh
Modified: nix/trunk/src/libexpr/common-opts.cc
==============================================================================
--- nix/trunk/src/libexpr/common-opts.cc Sat Aug 6 10:33:52 2011
(r28191)
+++ nix/trunk/src/libexpr/common-opts.cc Sat Aug 6 13:02:55 2011
(r28192)
@@ -1,7 +1,6 @@
#include "common-opts.hh"
#include "../libmain/shared.hh"
#include "util.hh"
-#include "parser.hh"
namespace nix {
@@ -25,7 +24,7 @@
autoArgs.push_back(Attr(state.symbols.create(name), v));
if (arg == "--arg")
- state.mkThunk_(*v, parseExprFromString(state, value, absPath(".")));
+ state.mkThunk_(*v, state.parseExprFromString(value, absPath(".")));
else
mkString(*v, value);
Modified: nix/trunk/src/libexpr/eval.cc
==============================================================================
--- nix/trunk/src/libexpr/eval.cc Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/libexpr/eval.cc Sat Aug 6 13:02:55 2011 (r28192)
@@ -1,5 +1,4 @@
#include "eval.hh"
-#include "parser.hh"
#include "hash.hh"
#include "util.hh"
#include "store-api.hh"
@@ -427,14 +426,10 @@
{
startNest(nest, lvlTalkative, format("evaluating file `%1%'") % path);
- Expr * e = parseTrees[path];
-
- if (!e) {
- e = parseExprFromFile(*this, path);
- parseTrees[path] = e;
- }
+ Expr * e = parseExprFromFile(path);
try {
+ /* !!! Maybe we should cache the evaluation result. */
eval(e, v);
} catch (Error & e) {
addErrorPrefix(e, "while evaluating the file `%1%':\n", path);
Modified: nix/trunk/src/libexpr/eval.hh
==============================================================================
--- nix/trunk/src/libexpr/eval.hh Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/libexpr/eval.hh Sat Aug 6 13:02:55 2011 (r28192)
@@ -218,6 +218,13 @@
EvalState();
~EvalState();
+ /* Parse a Nix expression from the specified file. If `path'
+ refers to a directory, then "/default.nix" is appended. */
+ Expr * parseExprFromFile(Path path);
+
+ /* Parse a Nix expression from the specified string. */
+ 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);
@@ -296,6 +303,9 @@
friend class ExprAttrs;
friend class ExprLet;
+ Expr * parse(const char * text,
+ const Path & path, const Path & basePath);
+
public:
/* Do a deep equality test between two values. That is, list
Modified: nix/trunk/src/libexpr/parser.y
==============================================================================
--- nix/trunk/src/libexpr/parser.y Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/libexpr/parser.y Sat Aug 6 13:02:55 2011 (r28192)
@@ -450,11 +450,11 @@
namespace nix {
-static Expr * parse(EvalState & state, const char * text,
+Expr * EvalState::parse(const char * text,
const Path & path, const Path & basePath)
{
yyscan_t scanner;
- ParseData data(state.symbols);
+ ParseData data(symbols);
data.basePath = basePath;
data.path = path;
@@ -466,7 +466,7 @@
if (res) throw ParseError(data.error);
try {
- data.result->bindVars(state.staticBaseEnv);
+ data.result->bindVars(staticBaseEnv);
} catch (Error & e) {
throw ParseError(format("%1%, in `%2%'") % e.msg() % path);
}
@@ -475,7 +475,7 @@
}
-Expr * parseExprFromFile(EvalState & state, Path path)
+Expr * EvalState::parseExprFromFile(Path path)
{
assert(path[0] == '/');
@@ -493,15 +493,21 @@
if (S_ISDIR(st.st_mode))
path = canonPath(path + "/default.nix");
- /* Read and parse the input file. */
- return parse(state, readFile(path).c_str(), path, dirOf(path));
+ /* Read and parse the input file, unless it's already in the parse
+ tree cache. */
+ Expr * e = parseTrees[path];
+ if (!e) {
+ e = parse(readFile(path).c_str(), path, dirOf(path));
+ parseTrees[path] = e;
+ }
+
+ return e;
}
-Expr * parseExprFromString(EvalState & state,
- const string & s, const Path & basePath)
+Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
{
- return parse(state, s.c_str(), "(string)", basePath);
+ return parse(s.c_str(), "(string)", basePath);
}
Modified: nix/trunk/src/libexpr/primops.cc
==============================================================================
--- nix/trunk/src/libexpr/primops.cc Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/libexpr/primops.cc Sat Aug 6 13:02:55 2011 (r28192)
@@ -5,7 +5,6 @@
#include "util.hh"
#include "archive.hh"
#include "value-to-xml.hh"
-#include "parser.hh"
#include "names.hh"
#include <sys/types.h>
@@ -1059,7 +1058,7 @@
/* Add a wrapper around the derivation primop that computes the
`drvPath' and `outPath' attributes lazily. */
string s = "attrs: let res = derivationStrict attrs; in attrs // { drvPath
= res.drvPath; outPath = res.outPath; type = \"derivation\"; }";
- mkThunk_(v, parseExprFromString(*this, s, "/"));
+ mkThunk_(v, parseExprFromString(s, "/"));
addConstant("derivation", v);
// Paths
Modified: nix/trunk/src/nix-env/nix-env.cc
==============================================================================
--- nix/trunk/src/nix-env/nix-env.cc Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/nix-env/nix-env.cc Sat Aug 6 13:02:55 2011 (r28192)
@@ -3,7 +3,6 @@
#include "globals.hh"
#include "misc.hh"
#include "shared.hh"
-#include "parser.hh"
#include "eval.hh"
#include "help.txt.hh"
#include "get-drvs.hh"
@@ -129,7 +128,7 @@
if (hasSuffix(attrName, ".nix"))
attrName = string(attrName, 0, attrName.size() - 4);
attrs.attrs[state.symbols.create(attrName)] =
- ExprAttrs::AttrDef(parseExprFromFile(state, absPath(path2)),
noPos);
+ ExprAttrs::AttrDef(state.parseExprFromFile(absPath(path2)),
noPos);
}
else
/* `path2' is a directory (with no default.nix in it);
@@ -141,7 +140,7 @@
static Expr * loadSourceExpr(EvalState & state, const Path & path)
{
- if (isNixExpr(path)) return parseExprFromFile(state, absPath(path));
+ if (isNixExpr(path)) return state.parseExprFromFile(absPath(path));
/* The path is a directory. Put the Nix expressions in the
directory in an attribute set, with the file name of each
@@ -354,7 +353,7 @@
Expr * e1 = loadSourceExpr(state, instSource.nixExprPath);
foreach (Strings::const_iterator, i, args) {
- Expr * e2 = parseExprFromString(state, *i, absPath("."));
+ Expr * e2 = state.parseExprFromString(*i, absPath("."));
Expr * call = new ExprApp(e2, e1);
Value v; state.eval(call, v);
getDerivations(state, v, "", instSource.autoArgs, elems);
Modified: nix/trunk/src/nix-env/user-env.cc
==============================================================================
--- nix/trunk/src/nix-env/user-env.cc Sat Aug 6 10:33:52 2011 (r28191)
+++ nix/trunk/src/nix-env/user-env.cc Sat Aug 6 13:02:55 2011 (r28192)
@@ -5,7 +5,6 @@
#include "globals.hh"
#include "shared.hh"
#include "eval.hh"
-#include "parser.hh"
#include "profiles.hh"
@@ -24,7 +23,7 @@
if (pathExists(manifestFile)) {
Value v;
- state.eval(parseExprFromFile(state, manifestFile), v);
+ state.evalFile(manifestFile, v);
Bindings bindings;
getDerivations(state, v, "", bindings, elems);
} else if (pathExists(oldManifestFile))
@@ -113,7 +112,7 @@
/* Get the environment builder expression. */
Value envBuilder;
- state.eval(parseExprFromFile(state, nixDataDir +
"/nix/corepkgs/buildenv"), envBuilder);
+ state.evalFile(nixDataDir + "/nix/corepkgs/buildenv", envBuilder);
/* Construct a Nix expression that calls the user environment
builder with the manifest as argument. */
Modified: nix/trunk/src/nix-instantiate/nix-instantiate.cc
==============================================================================
--- nix/trunk/src/nix-instantiate/nix-instantiate.cc Sat Aug 6 10:33:52
2011 (r28191)
+++ nix/trunk/src/nix-instantiate/nix-instantiate.cc Sat Aug 6 13:02:55
2011 (r28192)
@@ -1,7 +1,6 @@
#include "globals.hh"
#include "shared.hh"
#include "eval.hh"
-#include "parser.hh"
#include "get-drvs.hh"
#include "attr-path.hh"
#include "value-to-xml.hh"
@@ -28,7 +27,7 @@
startNest(nest, lvlTalkative, format("parsing standard input"));
string s, s2;
while (getline(std::cin, s2)) s += s2 + "\n";
- return parseExprFromString(state, s, absPath("."));
+ return state.parseExprFromString(s, absPath("."));
}
@@ -139,7 +138,7 @@
foreach (Strings::iterator, i, files) {
Path path = absPath(*i);
- Expr * e = parseExprFromFile(state, path);
+ Expr * e = state.parseExprFromFile(path);
processExpr(state, attrPaths, parseOnly, strict, autoArgs,
evalOnly, xmlOutput, xmlOutputSourceLocation, e);
}
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits