diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 08b685fd0..4692bfd27 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -41,6 +41,8 @@ struct EvalState bool cacheTerms; bool strictMode; + ATermMap parsings; /* path -> expr mapping */ + EvalState(); void addPrimOps(); diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 82b24cd07..b1284b4b0 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -383,8 +383,13 @@ Expr parseExprFromFile(EvalState & state, Path path) if (S_ISDIR(st.st_mode)) path = canonPath(path + "/default.nix"); + Expr cached = state.parsings.get(toATerm(path)); + if (cached) return cached; + /* Read and parse the input file. */ - return parse(state, readFile(path).c_str(), path, dirOf(path)); + cached = parse(state, readFile(path).c_str(), path, dirOf(path)); + state.parsings.set(toATerm(path), cached); + return cached; }