aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/nixexpr.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/nixexpr.hh')
-rw-r--r--src/libexpr/nixexpr.hh40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index b328b3941..c4c459f0b 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -18,6 +18,7 @@ MakeError(UndefinedVarError, Error);
MakeError(MissingArgumentError, EvalError);
MakeError(RestrictedPathError, Error);
+extern std::function<void(const Error & error, const Env & env, const Expr & expr)> debuggerHook;
/* Position objects. */
@@ -77,10 +78,13 @@ struct Expr
{
virtual ~Expr() { };
virtual void show(std::ostream & str) const;
- virtual void bindVars(const StaticEnv & env);
+ virtual void bindVars(const std::shared_ptr<const StaticEnv> & env);
virtual void eval(EvalState & state, Env & env, Value & v);
virtual Value * maybeThunk(EvalState & state, Env & env);
virtual void setName(Symbol & name);
+
+ std::shared_ptr<const StaticEnv> staticenv;
+ virtual Pos* getPos() = 0;
};
std::ostream & operator << (std::ostream & str, const Expr & e);
@@ -88,15 +92,16 @@ std::ostream & operator << (std::ostream & str, const Expr & e);
#define COMMON_METHODS \
void show(std::ostream & str) const; \
void eval(EvalState & state, Env & env, Value & v); \
- void bindVars(const StaticEnv & env);
+ void bindVars(const std::shared_ptr<const StaticEnv> & env);
struct ExprInt : Expr
{
NixInt n;
Value v;
ExprInt(NixInt n) : n(n) { mkInt(v, n); };
- COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env);
+ Pos* getPos() { return 0; }
+ COMMON_METHODS
};
struct ExprFloat : Expr
@@ -104,8 +109,9 @@ struct ExprFloat : Expr
NixFloat nf;
Value v;
ExprFloat(NixFloat nf) : nf(nf) { mkFloat(v, nf); };
- COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env);
+ Pos* getPos() { return 0; }
+ COMMON_METHODS
};
struct ExprString : Expr
@@ -113,8 +119,9 @@ struct ExprString : Expr
Symbol s;
Value v;
ExprString(const Symbol & s) : s(s) { mkString(v, s); };
- COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env);
+ Pos* getPos() { return 0; }
+ COMMON_METHODS
};
/* Temporary class used during parsing of indented strings. */
@@ -122,6 +129,7 @@ struct ExprIndStr : Expr
{
string s;
ExprIndStr(const string & s) : s(s) { };
+ Pos* getPos() { return 0; }
};
struct ExprPath : Expr
@@ -129,8 +137,9 @@ struct ExprPath : Expr
string s;
Value v;
ExprPath(const string & s) : s(s) { v.mkPath(this->s.c_str()); };
- COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env);
+ Pos* getPos() { return 0; }
+ COMMON_METHODS
};
typedef uint32_t Level;
@@ -156,8 +165,9 @@ struct ExprVar : Expr
ExprVar(const Symbol & name) : name(name) { };
ExprVar(const Pos & pos, const Symbol & name) : pos(pos), name(name) { };
- COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env);
+ Pos* getPos() { return &pos; }
+ COMMON_METHODS
};
struct ExprSelect : Expr
@@ -167,6 +177,7 @@ struct ExprSelect : Expr
AttrPath attrPath;
ExprSelect(const Pos & pos, Expr * e, const AttrPath & attrPath, Expr * def) : pos(pos), e(e), def(def), attrPath(attrPath) { };
ExprSelect(const Pos & pos, Expr * e, const Symbol & name) : pos(pos), e(e), def(0) { attrPath.push_back(AttrName(name)); };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -175,6 +186,7 @@ struct ExprOpHasAttr : Expr
Expr * e;
AttrPath attrPath;
ExprOpHasAttr(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath) { };
+ Pos* getPos() { return e->getPos(); }
COMMON_METHODS
};
@@ -203,6 +215,7 @@ struct ExprAttrs : Expr
DynamicAttrDefs dynamicAttrs;
ExprAttrs(const Pos &pos) : recursive(false), pos(pos) { };
ExprAttrs() : recursive(false), pos(noPos) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -210,6 +223,7 @@ struct ExprList : Expr
{
std::vector<Expr *> elems;
ExprList() { };
+ Pos* getPos() { return 0; }
COMMON_METHODS
};
@@ -248,6 +262,7 @@ struct ExprLambda : Expr
void setName(Symbol & name);
string showNamePos() const;
inline bool hasFormals() const { return formals != nullptr; }
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -259,6 +274,7 @@ struct ExprCall : Expr
ExprCall(const Pos & pos, Expr * fun, std::vector<Expr *> && args)
: fun(fun), args(args), pos(pos)
{ }
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -267,6 +283,7 @@ struct ExprLet : Expr
ExprAttrs * attrs;
Expr * body;
ExprLet(ExprAttrs * attrs, Expr * body) : attrs(attrs), body(body) { };
+ Pos* getPos() { return 0; }
COMMON_METHODS
};
@@ -276,6 +293,7 @@ struct ExprWith : Expr
Expr * attrs, * body;
size_t prevWith;
ExprWith(const Pos & pos, Expr * attrs, Expr * body) : pos(pos), attrs(attrs), body(body) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -284,6 +302,7 @@ struct ExprIf : Expr
Pos pos;
Expr * cond, * then, * else_;
ExprIf(const Pos & pos, Expr * cond, Expr * then, Expr * else_) : pos(pos), cond(cond), then(then), else_(else_) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -292,6 +311,7 @@ struct ExprAssert : Expr
Pos pos;
Expr * cond, * body;
ExprAssert(const Pos & pos, Expr * cond, Expr * body) : pos(pos), cond(cond), body(body) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -299,6 +319,7 @@ struct ExprOpNot : Expr
{
Expr * e;
ExprOpNot(Expr * e) : e(e) { };
+ Pos* getPos() { return 0; }
COMMON_METHODS
};
@@ -313,11 +334,12 @@ struct ExprOpNot : Expr
{ \
str << "(" << *e1 << " " s " " << *e2 << ")"; \
} \
- void bindVars(const StaticEnv & env) \
+ void bindVars(const std::shared_ptr<const StaticEnv> & env) \
{ \
e1->bindVars(env); e2->bindVars(env); \
} \
void eval(EvalState & state, Env & env, Value & v); \
+ Pos* getPos() { return &pos; } \
};
MakeBinOp(ExprOpEq, "==")
@@ -335,6 +357,7 @@ struct ExprConcatStrings : Expr
vector<std::pair<Pos, Expr *> > * es;
ExprConcatStrings(const Pos & pos, bool forceString, vector<std::pair<Pos, Expr *> > * es)
: pos(pos), forceString(forceString), es(es) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};
@@ -342,6 +365,7 @@ struct ExprPos : Expr
{
Pos pos;
ExprPos(const Pos & pos) : pos(pos) { };
+ Pos* getPos() { return &pos; }
COMMON_METHODS
};