forked from lix-project/lix
Use RootValue
This commit is contained in:
parent
9f46f54de4
commit
fcd048a526
|
@ -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]);
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue