diff options
Diffstat (limited to 'src/libexpr/nixexpr.hh')
-rw-r--r-- | src/libexpr/nixexpr.hh | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index 4e923ac89..64375b5ab 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) { v.mkInt(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) { v.mkFloat(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 string s; Value v; ExprString(std::string s) : s(std::move(s)) { v.mkString(this->s.data()); }; - COMMON_METHODS Value * maybeThunk(EvalState & state, Env & env); + Pos* getPos() { return 0; } + COMMON_METHODS }; struct ExprPath : Expr @@ -122,8 +129,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; @@ -149,8 +157,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 @@ -160,6 +169,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 }; @@ -168,6 +178,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 }; @@ -196,6 +207,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 }; @@ -203,6 +215,7 @@ struct ExprList : Expr { std::vector<Expr *> elems; ExprList() { }; + Pos* getPos() { return 0; } COMMON_METHODS }; @@ -251,6 +264,7 @@ struct ExprLambda : Expr void setName(Symbol & name); string showNamePos() const; inline bool hasFormals() const { return formals != nullptr; } + Pos* getPos() { return &pos; } COMMON_METHODS }; @@ -262,6 +276,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 }; @@ -270,6 +285,7 @@ struct ExprLet : Expr ExprAttrs * attrs; Expr * body; ExprLet(ExprAttrs * attrs, Expr * body) : attrs(attrs), body(body) { }; + Pos* getPos() { return 0; } COMMON_METHODS }; @@ -279,6 +295,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 }; @@ -287,6 +304,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 }; @@ -295,6 +313,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 }; @@ -302,6 +321,7 @@ struct ExprOpNot : Expr { Expr * e; ExprOpNot(Expr * e) : e(e) { }; + Pos* getPos() { return 0; } COMMON_METHODS }; @@ -316,11 +336,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, "==") @@ -338,6 +359,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 }; @@ -345,6 +367,7 @@ struct ExprPos : Expr { Pos pos; ExprPos(const Pos & pos) : pos(pos) { }; + Pos* getPos() { return &pos; } COMMON_METHODS }; |