From 7e256dfc39efc5f1614686a85fb5c9da6480abb9 Mon Sep 17 00:00:00 2001 From: Shinichiro Hamaji Date: Wed, 17 Jun 2015 15:33:11 +0900 Subject: [C++] Implement ifdef --- eval.cc | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'eval.cc') diff --git a/eval.cc b/eval.cc index 56c9623..62b6aa0 100644 --- a/eval.cc +++ b/eval.cc @@ -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 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* 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) { -- cgit v1.2.3