aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eval.cc7
-rw-r--r--var.cc4
-rw-r--r--var.h3
3 files changed, 12 insertions, 2 deletions
diff --git a/eval.cc b/eval.cc
index f21e185..3dfc0e6 100644
--- a/eval.cc
+++ b/eval.cc
@@ -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;
diff --git a/var.cc b/var.cc
index d21dc4f..9fac956 100644
--- a/var.cc
+++ b/var.cc
@@ -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) {
}
diff --git a/var.h b/var.h
index 3bae262..c3bb233 100644
--- a/var.h
+++ b/var.h
@@ -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_;