libexpr: remove EvalState parse caches
nothing needs these any more. the CLI calls evalFile, but only in places
where it'll only be called *once* per process lifetime. __import does so
too, but import doesn't care about the parse tree, only the eval result.
interestingly this improves eval performance by 6% on system eval unless
GC never occurs. no idea why this makes a GCing eval faster, but it does
Change-Id: I8289528550244e0a8b5ebc7284d8fb9aaac59e20
This commit is contained in:
parent
f815b966c4
commit
66d7128512
|
@ -941,51 +941,24 @@ void EvalState::evalFile(const SourcePath & path_, Value & v, bool mustBeTrivial
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("evaluating file '%1%'", resolvedPath);
|
debug("evaluating file '%1%'", resolvedPath);
|
||||||
Expr * e = nullptr;
|
Expr & e = parseExprFromFile(checkSourcePath(resolvedPath));
|
||||||
|
|
||||||
auto j = fileParseCache.find(resolvedPath);
|
|
||||||
if (j != fileParseCache.end())
|
|
||||||
e = j->second;
|
|
||||||
|
|
||||||
if (!e)
|
|
||||||
e = &parseExprFromFile(checkSourcePath(resolvedPath));
|
|
||||||
|
|
||||||
cacheFile(path, resolvedPath, e, v, mustBeTrivial);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EvalState::resetFileCache()
|
|
||||||
{
|
|
||||||
fileEvalCache.clear();
|
|
||||||
fileParseCache.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EvalState::cacheFile(
|
|
||||||
const SourcePath & path,
|
|
||||||
const SourcePath & resolvedPath,
|
|
||||||
Expr * e,
|
|
||||||
Value & v,
|
|
||||||
bool mustBeTrivial)
|
|
||||||
{
|
|
||||||
fileParseCache[resolvedPath] = e;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto dts = debug
|
auto dts = debug
|
||||||
? makeDebugTraceStacker(
|
? makeDebugTraceStacker(
|
||||||
*this,
|
*this,
|
||||||
*e,
|
e,
|
||||||
this->baseEnv,
|
this->baseEnv,
|
||||||
e->getPos() ? std::make_shared<Pos>(positions[e->getPos()]) : nullptr,
|
e.getPos() ? std::make_shared<Pos>(positions[e.getPos()]) : nullptr,
|
||||||
"while evaluating the file '%1%':", resolvedPath.to_string())
|
"while evaluating the file '%1%':", resolvedPath.to_string())
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
// Enforce that 'flake.nix' is a direct attrset, not a
|
// Enforce that 'flake.nix' is a direct attrset, not a
|
||||||
// computation.
|
// computation.
|
||||||
if (mustBeTrivial &&
|
if (mustBeTrivial &&
|
||||||
!(dynamic_cast<ExprAttrs *>(e)))
|
!(dynamic_cast<ExprAttrs *>(&e)))
|
||||||
error<EvalError>("file '%s' must be an attribute set", path).debugThrow();
|
error<EvalError>("file '%s' must be an attribute set", path).debugThrow();
|
||||||
eval(*e, v);
|
eval(e, v);
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
addErrorTrace(e, "while evaluating the file '%1%':", resolvedPath.to_string());
|
addErrorTrace(e, "while evaluating the file '%1%':", resolvedPath.to_string());
|
||||||
throw;
|
throw;
|
||||||
|
@ -996,6 +969,12 @@ void EvalState::cacheFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EvalState::resetFileCache()
|
||||||
|
{
|
||||||
|
fileEvalCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::eval(Expr & e, Value & v)
|
void EvalState::eval(Expr & e, Value & v)
|
||||||
{
|
{
|
||||||
e.eval(*this, baseEnv, v);
|
e.eval(*this, baseEnv, v);
|
||||||
|
|
|
@ -327,12 +327,6 @@ private:
|
||||||
paths. */
|
paths. */
|
||||||
std::map<SourcePath, StorePath> srcToStore;
|
std::map<SourcePath, StorePath> srcToStore;
|
||||||
|
|
||||||
/**
|
|
||||||
* A cache from path names to parse trees.
|
|
||||||
*/
|
|
||||||
using FileParseCache = GcMap<SourcePath, Expr *>;
|
|
||||||
FileParseCache fileParseCache;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A cache from path names to values.
|
* A cache from path names to values.
|
||||||
*/
|
*/
|
||||||
|
@ -426,16 +420,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void evalFile(const SourcePath & path, Value & v, bool mustBeTrivial = false);
|
void evalFile(const SourcePath & path, Value & v, bool mustBeTrivial = false);
|
||||||
|
|
||||||
/**
|
|
||||||
* Like `evalFile`, but with an already parsed expression.
|
|
||||||
*/
|
|
||||||
void cacheFile(
|
|
||||||
const SourcePath & path,
|
|
||||||
const SourcePath & resolvedPath,
|
|
||||||
Expr * e,
|
|
||||||
Value & v,
|
|
||||||
bool mustBeTrivial = false);
|
|
||||||
|
|
||||||
void resetFileCache();
|
void resetFileCache();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue