aboutsummaryrefslogtreecommitdiffstats
path: root/eval.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-15 19:53:36 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 11:25:42 +0900
commit4c469b36fb8cf2240f8b9f41448dc6f9e1d3df55 (patch)
tree7544348c6b8fa20b8c0600bae28225f18b14b629 /eval.cc
parent776ca3085c44e6570813270df75278849c37d400 (diff)
downloadandroid_build_kati-4c469b36fb8cf2240f8b9f41448dc6f9e1d3df55.tar.gz
android_build_kati-4c469b36fb8cf2240f8b9f41448dc6f9e1d3df55.tar.bz2
android_build_kati-4c469b36fb8cf2240f8b9f41448dc6f9e1d3df55.zip
[C++] Implementing +=
Diffstat (limited to 'eval.cc')
-rw-r--r--eval.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/eval.cc b/eval.cc
index bd2e253..f1ae682 100644
--- a/eval.cc
+++ b/eval.cc
@@ -39,6 +39,7 @@ void Evaluator::EvalAssign(const AssignAST* ast) {
StringPiece lhs = Intern(*ast->lhs->Eval(this));
Var* rhs = NULL;
+ bool needs_assign = true;
switch (ast->op) {
case AssignOp::COLON_EQ:
rhs = new SimpleVar(ast->rhs->Eval(this), origin);
@@ -51,8 +52,9 @@ void Evaluator::EvalAssign(const AssignAST* ast) {
if (!prev->IsDefined()) {
rhs = new RecursiveVar(ast->rhs, origin);
} else {
- // TODO
- abort();
+ prev->AppendVar(this, ast->rhs);
+ rhs = prev;
+ needs_assign = false;
}
break;
}
@@ -69,7 +71,8 @@ void Evaluator::EvalAssign(const AssignAST* ast) {
}
LOG("Assign: %.*s=%s", SPF(lhs), rhs->DebugString().c_str());
- vars_->Assign(lhs, rhs);
+ if (needs_assign)
+ vars_->Assign(lhs, rhs);
}
void Evaluator::EvalRule(const RuleAST* ast) {