diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-17 15:33:11 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 11:25:44 +0900 |
commit | 7e256dfc39efc5f1614686a85fb5c9da6480abb9 (patch) | |
tree | eb30790d43ac6081d9332ac0dfe92ce5960082e5 /eval.cc | |
parent | 32750621508da5e68f53bf14f944ad524627eb50 (diff) | |
download | android_build_kati-7e256dfc39efc5f1614686a85fb5c9da6480abb9.tar.gz android_build_kati-7e256dfc39efc5f1614686a85fb5c9da6480abb9.tar.bz2 android_build_kati-7e256dfc39efc5f1614686a85fb5c9da6480abb9.zip |
[C++] Implement ifdef
Diffstat (limited to 'eval.cc')
-rw-r--r-- | eval.cc | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -106,7 +106,34 @@ void Evaluator::EvalCommand(const CommandAST* ast) { } void Evaluator::EvalIf(const IfAST* ast) { - ERROR("TODO"); + bool is_true; + StringPiece lhs = Intern(*ast->lhs->Eval(this)); + switch (ast->op) { + case CondOp::IFDEF: + case CondOp::IFNDEF: { + Var* v = LookupVarInCurrentScope(lhs); + shared_ptr<string> s = v->Eval(this); + is_true = s->empty() == (ast->op == CondOp::IFNDEF); + break; + } + case CondOp::IFEQ: + case CondOp::IFNEQ: { + ERROR("TODO"); + break; + } + default: + CHECK(false); + } + + const vector<AST*>* asts; + if (is_true) { + asts = &ast->true_stmts; + } else { + asts = &ast->false_stmts; + } + for (AST* a : *asts) { + a->Eval(this); + } } void Evaluator::EvalInclude(const IncludeAST* ast) { |