Use RootValue

This commit is contained in:
Eelco Dolstra 2020-04-16 16:54:34 +02:00
parent 9f46f54de4
commit fcd048a526
3 changed files with 14 additions and 19 deletions

View file

@ -121,16 +121,16 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args
} }
w.attrs->sort(); w.attrs->sort();
static Value * fun = nullptr; static RootValue fun;
if (!fun) { if (!fun) {
fun = state.allocValue(); fun = allocRootValue(state.allocValue());
state.eval(state.parseExprFromString( state.eval(state.parseExprFromString(
#include "imported-drv-to-derivation.nix.gen.hh" #include "imported-drv-to-derivation.nix.gen.hh"
, "/"), *fun); , "/"), **fun);
} }
state.forceFunction(*fun, pos); state.forceFunction(**fun, pos);
mkApp(v, *fun, w); mkApp(v, **fun, w);
state.forceAttrs(v, pos); state.forceAttrs(v, pos);
} else { } else {
state.forceAttrs(*args[0]); state.forceAttrs(*args[0]);

View file

@ -41,7 +41,7 @@ private:
std::shared_ptr<EvalState> evalState; std::shared_ptr<EvalState> evalState;
std::shared_ptr<Value> vSourceExpr; RootValue vSourceExpr;
}; };
enum RealiseMode { Build, NoBuild, DryRun }; enum RealiseMode { Build, NoBuild, DryRun };

View file

@ -8,8 +8,6 @@
#include "store-api.hh" #include "store-api.hh"
#include "shared.hh" #include "shared.hh"
#include <gc/gc.h>
#include <regex> #include <regex>
namespace nix { namespace nix {
@ -27,17 +25,14 @@ SourceExprCommand::SourceExprCommand()
Value * SourceExprCommand::getSourceExpr(EvalState & state) Value * SourceExprCommand::getSourceExpr(EvalState & state)
{ {
if (vSourceExpr) return vSourceExpr.get(); if (vSourceExpr) return *vSourceExpr;
auto sToplevel = state.symbols.create("_toplevel"); auto sToplevel = state.symbols.create("_toplevel");
// Allocate the vSourceExpr Value as uncollectable. Boehm GC doesn't vSourceExpr = allocRootValue(state.allocValue());
// consider the member variable "alive" during execution causing it to be
// GC'ed in the middle of evaluation.
vSourceExpr = std::allocate_shared<Value>(traceable_allocator<Value>());
if (file != "") if (file != "")
state.evalFile(lookupFileArg(state, file), *vSourceExpr); state.evalFile(lookupFileArg(state, file), **vSourceExpr);
else { else {
@ -45,9 +40,9 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
auto searchPath = state.getSearchPath(); auto searchPath = state.getSearchPath();
state.mkAttrs(*vSourceExpr, 1024); state.mkAttrs(**vSourceExpr, 1024);
mkBool(*state.allocAttr(*vSourceExpr, sToplevel), true); mkBool(*state.allocAttr(**vSourceExpr, sToplevel), true);
std::unordered_set<std::string> seen; std::unordered_set<std::string> seen;
@ -58,7 +53,7 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
mkPrimOpApp(*v1, state.getBuiltin("findFile"), state.getBuiltin("nixPath")); mkPrimOpApp(*v1, state.getBuiltin("findFile"), state.getBuiltin("nixPath"));
Value * v2 = state.allocValue(); Value * v2 = state.allocValue();
mkApp(*v2, *v1, mkString(*state.allocValue(), name)); mkApp(*v2, *v1, mkString(*state.allocValue(), name));
mkApp(*state.allocAttr(*vSourceExpr, state.symbols.create(name)), mkApp(*state.allocAttr(**vSourceExpr, state.symbols.create(name)),
state.getBuiltin("import"), *v2); state.getBuiltin("import"), *v2);
}; };
@ -72,10 +67,10 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
} else } else
addEntry(i.first); addEntry(i.first);
vSourceExpr->attrs->sort(); (*vSourceExpr)->attrs->sort();
} }
return vSourceExpr.get(); return *vSourceExpr;
} }
ref<EvalState> SourceExprCommand::getEvalState() ref<EvalState> SourceExprCommand::getEvalState()