diff options
Diffstat (limited to 'src/libexpr/nixexpr.hh')
-rw-r--r-- | src/libexpr/nixexpr.hh | 40 |
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 }; |