diff options
-rw-r--r-- | eval.cc | 7 | ||||
-rw-r--r-- | var.cc | 4 | ||||
-rw-r--r-- | var.h | 3 |
3 files changed, 12 insertions, 2 deletions
@@ -54,9 +54,12 @@ Var* Evaluator::EvalRHS(Symbol lhs, Value* rhs_v, StringPiece orig_rhs, Var* rhs = NULL; bool needs_assign = true; switch (op) { - case AssignOp::COLON_EQ: - rhs = new SimpleVar(rhs_v->Eval(this), origin); + case AssignOp::COLON_EQ: { + SimpleVar* sv = new SimpleVar(origin); + rhs_v->Eval(this, sv->mutable_value()); + rhs = sv; break; + } case AssignOp::EQ: rhs = new RecursiveVar(rhs_v, origin, orig_rhs); break; @@ -47,6 +47,10 @@ void Var::AppendVar(Evaluator*, Value*) { CHECK(false); } +SimpleVar::SimpleVar(VarOrigin origin) + : origin_(origin) { +} + SimpleVar::SimpleVar(const string& v, VarOrigin origin) : v_(v), origin_(origin) { } @@ -62,6 +62,7 @@ class Var : public Evaluable { class SimpleVar : public Var { public: + explicit SimpleVar(VarOrigin origin); SimpleVar(const string& v, VarOrigin origin); virtual const char* Flavor() const { @@ -79,6 +80,8 @@ class SimpleVar : public Var { virtual string DebugString() const override; + string* mutable_value() { return &v_; } + private: string v_; VarOrigin origin_; |