Introduce Value type setters and make use of them
This commit is contained in:
parent
fa307875e9
commit
9f056f7afd
|
@ -25,7 +25,7 @@ void EvalState::mkAttrs(Value & v, size_t capacity)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tAttrs;
|
v.setAttrs();
|
||||||
v.attrs = allocBindings(capacity);
|
v.attrs = allocBindings(capacity);
|
||||||
nrAttrsets++;
|
nrAttrsets++;
|
||||||
nrAttrsInAttrsets += capacity;
|
nrAttrsInAttrsets += capacity;
|
||||||
|
|
|
@ -36,11 +36,11 @@ void EvalState::forceValue(Value & v, const Pos & pos)
|
||||||
Env * env = v.thunk.env;
|
Env * env = v.thunk.env;
|
||||||
Expr * expr = v.thunk.expr;
|
Expr * expr = v.thunk.expr;
|
||||||
try {
|
try {
|
||||||
v.type = tBlackhole;
|
v.setBlackhole();
|
||||||
//checkInterrupt();
|
//checkInterrupt();
|
||||||
expr->eval(*this, *env, v);
|
expr->eval(*this, *env, v);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
v.type = tThunk;
|
v.setThunk();
|
||||||
v.thunk.env = env;
|
v.thunk.env = env;
|
||||||
v.thunk.expr = expr;
|
v.thunk.expr = expr;
|
||||||
throw;
|
throw;
|
||||||
|
|
|
@ -431,7 +431,7 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
|
||||||
}
|
}
|
||||||
|
|
||||||
clearValue(vEmptySet);
|
clearValue(vEmptySet);
|
||||||
vEmptySet.type = tAttrs;
|
vEmptySet.setAttrs();
|
||||||
vEmptySet.attrs = allocBindings(0);
|
vEmptySet.attrs = allocBindings(0);
|
||||||
|
|
||||||
createBaseEnv();
|
createBaseEnv();
|
||||||
|
@ -548,7 +548,7 @@ Value * EvalState::addPrimOp(const string & name,
|
||||||
the primop to a dummy value. */
|
the primop to a dummy value. */
|
||||||
if (arity == 0) {
|
if (arity == 0) {
|
||||||
auto vPrimOp = allocValue();
|
auto vPrimOp = allocValue();
|
||||||
vPrimOp->type = tPrimOp;
|
vPrimOp->setPrimOp();
|
||||||
vPrimOp->primOp = new PrimOp { .fun = primOp, .arity = 1, .name = sym };
|
vPrimOp->primOp = new PrimOp { .fun = primOp, .arity = 1, .name = sym };
|
||||||
Value v;
|
Value v;
|
||||||
mkApp(v, *vPrimOp, *vPrimOp);
|
mkApp(v, *vPrimOp, *vPrimOp);
|
||||||
|
@ -556,7 +556,7 @@ Value * EvalState::addPrimOp(const string & name,
|
||||||
}
|
}
|
||||||
|
|
||||||
Value * v = allocValue();
|
Value * v = allocValue();
|
||||||
v->type = tPrimOp;
|
v->setPrimOp();
|
||||||
v->primOp = new PrimOp { .fun = primOp, .arity = arity, .name = sym };
|
v->primOp = new PrimOp { .fun = primOp, .arity = arity, .name = sym };
|
||||||
staticBaseEnv.vars[symbols.create(name)] = baseEnvDispl;
|
staticBaseEnv.vars[symbols.create(name)] = baseEnvDispl;
|
||||||
baseEnv.values[baseEnvDispl++] = v;
|
baseEnv.values[baseEnvDispl++] = v;
|
||||||
|
@ -572,7 +572,7 @@ Value * EvalState::addPrimOp(PrimOp && primOp)
|
||||||
if (primOp.arity == 0) {
|
if (primOp.arity == 0) {
|
||||||
primOp.arity = 1;
|
primOp.arity = 1;
|
||||||
auto vPrimOp = allocValue();
|
auto vPrimOp = allocValue();
|
||||||
vPrimOp->type = tPrimOp;
|
vPrimOp->setPrimOp();
|
||||||
vPrimOp->primOp = new PrimOp(std::move(primOp));
|
vPrimOp->primOp = new PrimOp(std::move(primOp));
|
||||||
Value v;
|
Value v;
|
||||||
mkApp(v, *vPrimOp, *vPrimOp);
|
mkApp(v, *vPrimOp, *vPrimOp);
|
||||||
|
@ -584,7 +584,7 @@ Value * EvalState::addPrimOp(PrimOp && primOp)
|
||||||
primOp.name = symbols.create(std::string(primOp.name, 2));
|
primOp.name = symbols.create(std::string(primOp.name, 2));
|
||||||
|
|
||||||
Value * v = allocValue();
|
Value * v = allocValue();
|
||||||
v->type = tPrimOp;
|
v->setPrimOp();
|
||||||
v->primOp = new PrimOp(std::move(primOp));
|
v->primOp = new PrimOp(std::move(primOp));
|
||||||
staticBaseEnv.vars[envName] = baseEnvDispl;
|
staticBaseEnv.vars[envName] = baseEnvDispl;
|
||||||
baseEnv.values[baseEnvDispl++] = v;
|
baseEnv.values[baseEnvDispl++] = v;
|
||||||
|
@ -714,7 +714,7 @@ void mkString(Value & v, const char * s)
|
||||||
|
|
||||||
Value & mkString(Value & v, std::string_view s, const PathSet & context)
|
Value & mkString(Value & v, std::string_view s, const PathSet & context)
|
||||||
{
|
{
|
||||||
v.type = tString;
|
v.setString();
|
||||||
v.string.s = dupStringWithLen(s.data(), s.size());
|
v.string.s = dupStringWithLen(s.data(), s.size());
|
||||||
v.string.context = 0;
|
v.string.context = 0;
|
||||||
if (!context.empty()) {
|
if (!context.empty()) {
|
||||||
|
@ -794,11 +794,11 @@ void EvalState::mkList(Value & v, size_t size)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
if (size == 1)
|
if (size == 1)
|
||||||
v.type = tList1;
|
v.setList1();
|
||||||
else if (size == 2)
|
else if (size == 2)
|
||||||
v.type = tList2;
|
v.setList2();
|
||||||
else {
|
else {
|
||||||
v.type = tListN;
|
v.setListN();
|
||||||
v.bigList.size = size;
|
v.bigList.size = size;
|
||||||
v.bigList.elems = size ? (Value * *) allocBytes(size * sizeof(Value *)) : 0;
|
v.bigList.elems = size ? (Value * *) allocBytes(size * sizeof(Value *)) : 0;
|
||||||
}
|
}
|
||||||
|
@ -810,7 +810,7 @@ unsigned long nrThunks = 0;
|
||||||
|
|
||||||
static inline void mkThunk(Value & v, Env & env, Expr * expr)
|
static inline void mkThunk(Value & v, Env & env, Expr * expr)
|
||||||
{
|
{
|
||||||
v.type = tThunk;
|
v.setThunk();
|
||||||
v.thunk.env = &env;
|
v.thunk.env = &env;
|
||||||
v.thunk.expr = expr;
|
v.thunk.expr = expr;
|
||||||
nrThunks++;
|
nrThunks++;
|
||||||
|
@ -1207,7 +1207,7 @@ void ExprOpHasAttr::eval(EvalState & state, Env & env, Value & v)
|
||||||
|
|
||||||
void ExprLambda::eval(EvalState & state, Env & env, Value & v)
|
void ExprLambda::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
v.type = tLambda;
|
v.setLambda();
|
||||||
v.lambda.env = &env;
|
v.lambda.env = &env;
|
||||||
v.lambda.fun = this;
|
v.lambda.fun = this;
|
||||||
}
|
}
|
||||||
|
@ -1252,7 +1252,7 @@ void EvalState::callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos)
|
||||||
} else {
|
} else {
|
||||||
Value * fun2 = allocValue();
|
Value * fun2 = allocValue();
|
||||||
*fun2 = fun;
|
*fun2 = fun;
|
||||||
v.type = tPrimOpApp;
|
v.setPrimOpApp();
|
||||||
v.primOpApp.left = fun2;
|
v.primOpApp.left = fun2;
|
||||||
v.primOpApp.right = &arg;
|
v.primOpApp.right = &arg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,25 @@ std::ostream & operator << (std::ostream & str, const ExternalValueBase & v);
|
||||||
struct Value
|
struct Value
|
||||||
{
|
{
|
||||||
ValueType type;
|
ValueType type;
|
||||||
|
|
||||||
|
inline void setInt() { type = tInt; };
|
||||||
|
inline void setBool() { type = tBool; };
|
||||||
|
inline void setString() { type = tString; };
|
||||||
|
inline void setPath() { type = tPath; };
|
||||||
|
inline void setNull() { type = tNull; };
|
||||||
|
inline void setAttrs() { type = tAttrs; };
|
||||||
|
inline void setList1() { type = tList1; };
|
||||||
|
inline void setList2() { type = tList2; };
|
||||||
|
inline void setListN() { type = tListN; };
|
||||||
|
inline void setThunk() { type = tThunk; };
|
||||||
|
inline void setApp() { type = tApp; };
|
||||||
|
inline void setLambda() { type = tLambda; };
|
||||||
|
inline void setBlackhole() { type = tBlackhole; };
|
||||||
|
inline void setPrimOp() { type = tPrimOp; };
|
||||||
|
inline void setPrimOpApp() { type = tPrimOpApp; };
|
||||||
|
inline void setExternal() { type = tExternal; };
|
||||||
|
inline void setFloat() { type = tFloat; };
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
NixInt integer;
|
NixInt integer;
|
||||||
|
@ -223,7 +242,7 @@ static inline void clearValue(Value & v)
|
||||||
static inline void mkInt(Value & v, NixInt n)
|
static inline void mkInt(Value & v, NixInt n)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tInt;
|
v.setInt();
|
||||||
v.integer = n;
|
v.integer = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +250,7 @@ static inline void mkInt(Value & v, NixInt n)
|
||||||
static inline void mkFloat(Value & v, NixFloat n)
|
static inline void mkFloat(Value & v, NixFloat n)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tFloat;
|
v.setFloat();
|
||||||
v.fpoint = n;
|
v.fpoint = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,7 +258,7 @@ static inline void mkFloat(Value & v, NixFloat n)
|
||||||
static inline void mkBool(Value & v, bool b)
|
static inline void mkBool(Value & v, bool b)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tBool;
|
v.setBool();
|
||||||
v.boolean = b;
|
v.boolean = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,13 +266,13 @@ static inline void mkBool(Value & v, bool b)
|
||||||
static inline void mkNull(Value & v)
|
static inline void mkNull(Value & v)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tNull;
|
v.setNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void mkApp(Value & v, Value & left, Value & right)
|
static inline void mkApp(Value & v, Value & left, Value & right)
|
||||||
{
|
{
|
||||||
v.type = tApp;
|
v.setApp();
|
||||||
v.app.left = &left;
|
v.app.left = &left;
|
||||||
v.app.right = &right;
|
v.app.right = &right;
|
||||||
}
|
}
|
||||||
|
@ -261,7 +280,7 @@ static inline void mkApp(Value & v, Value & left, Value & right)
|
||||||
|
|
||||||
static inline void mkPrimOpApp(Value & v, Value & left, Value & right)
|
static inline void mkPrimOpApp(Value & v, Value & left, Value & right)
|
||||||
{
|
{
|
||||||
v.type = tPrimOpApp;
|
v.setPrimOpApp();
|
||||||
v.app.left = &left;
|
v.app.left = &left;
|
||||||
v.app.right = &right;
|
v.app.right = &right;
|
||||||
}
|
}
|
||||||
|
@ -269,7 +288,7 @@ static inline void mkPrimOpApp(Value & v, Value & left, Value & right)
|
||||||
|
|
||||||
static inline void mkStringNoCopy(Value & v, const char * s)
|
static inline void mkStringNoCopy(Value & v, const char * s)
|
||||||
{
|
{
|
||||||
v.type = tString;
|
v.setString();
|
||||||
v.string.s = s;
|
v.string.s = s;
|
||||||
v.string.context = 0;
|
v.string.context = 0;
|
||||||
}
|
}
|
||||||
|
@ -287,7 +306,7 @@ void mkString(Value & v, const char * s);
|
||||||
static inline void mkPathNoCopy(Value & v, const char * s)
|
static inline void mkPathNoCopy(Value & v, const char * s)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
v.type = tPath;
|
v.setPath();
|
||||||
v.path = s;
|
v.path = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -551,7 +551,7 @@ bool NixRepl::processLine(string line)
|
||||||
{
|
{
|
||||||
Expr * e = parseString(string(line, p + 1));
|
Expr * e = parseString(string(line, p + 1));
|
||||||
Value & v(*state->allocValue());
|
Value & v(*state->allocValue());
|
||||||
v.type = tThunk;
|
v.setThunk();
|
||||||
v.thunk.env = env;
|
v.thunk.env = env;
|
||||||
v.thunk.expr = e;
|
v.thunk.expr = e;
|
||||||
addVarToScope(state->symbols.create(name), v);
|
addVarToScope(state->symbols.create(name), v);
|
||||||
|
|
Loading…
Reference in a new issue