1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-27 08:31:16 +02:00

* Refactoring: move parseExprFromFile() and parseExprFromString() into

the EvalState class.
This commit is contained in:
Eelco Dolstra 2011-08-06 13:02:55 +00:00
parent c8606664ab
commit 54945a2950
10 changed files with 37 additions and 52 deletions

View file

@ -6,7 +6,7 @@ libexpr_la_SOURCES = \
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

View file

@ -1,7 +1,6 @@
#include "common-opts.hh"
#include "../libmain/shared.hh"
#include "util.hh"
#include "parser.hh"
namespace nix {
@ -25,7 +24,7 @@ bool parseOptionArg(const string & arg, Strings::iterator & i,
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);

View file

@ -1,5 +1,4 @@
#include "eval.hh"
#include "parser.hh"
#include "hash.hh"
#include "util.hh"
#include "store-api.hh"
@ -427,14 +426,10 @@ void EvalState::evalFile(const Path & path, Value & v)
{
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);

View file

@ -218,6 +218,13 @@ public:
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 @@ private:
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

View file

@ -1,21 +0,0 @@
#ifndef __PARSER_H
#define __PARSER_H
#include "eval.hh"
namespace nix {
/* Parse a Nix expression from the specified file. If `path' refers
to a directory, then "/default.nix" is appended. */
Expr * parseExprFromFile(EvalState & state, Path path);
/* Parse a Nix expression from the specified string. */
Expr * parseExprFromString(EvalState & state, const string & s, const Path & basePath);
}
#endif /* !__PARSER_H */

View file

@ -450,11 +450,11 @@ formal
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 @@ static Expr * parse(EvalState & state, const char * text,
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 @@ static Expr * parse(EvalState & state, const char * text,
}
Expr * parseExprFromFile(EvalState & state, Path path)
Expr * EvalState::parseExprFromFile(Path path)
{
assert(path[0] == '/');
@ -493,15 +493,21 @@ Expr * parseExprFromFile(EvalState & state, Path path)
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);
}

View file

@ -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 @@ void EvalState::createBaseEnv()
/* 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