aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc9
-rw-r--r--src/libexpr/eval.hh2
-rw-r--r--src/libexpr/parser.y6
3 files changed, 10 insertions, 7 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 0296afe60..b4156ffec 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -272,7 +272,14 @@ void EvalState::cloneAttrs(Value & src, Value & dst)
void EvalState::evalFile(const Path & path, Value & v)
{
startNest(nest, lvlTalkative, format("evaluating file `%1%'") % path);
- Expr e = parseExprFromFile(*this, path);
+
+ Expr e = parseTrees.get(toATerm(path));
+
+ if (!e) {
+ e = parseExprFromFile(*this, path);
+ parseTrees.set(toATerm(path), e);
+ }
+
try {
eval(e, v);
} catch (Error & e) {
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index eba97dd73..7369892fb 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -135,6 +135,8 @@ private:
bool allowUnsafeEquality;
+ ATermMap parseTrees;
+
public:
EvalState();
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 2f0c9db3f..3a56c2627 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -526,12 +526,6 @@ Expr parseExprFromFile(EvalState & state, Path path)
{
assert(path[0] == '/');
-#if 0
- /* Perhaps this is already an imploded parse tree? */
- Expr e = ATreadFromNamedFile(path.c_str());
- if (e) return e;
-#endif
-
/* If `path' is a symlink, follow it. This is so that relative
path references work. */
struct stat st;