Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 1 | #include "var.h" |
| 2 | |
Shinichiro Hamaji | 4c469b3 | 2015-06-15 19:53:36 +0900 | [diff] [blame] | 3 | #include "log.h" |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 4 | #include "value.h" |
| 5 | |
| 6 | UndefinedVar kUndefinedBuf; |
| 7 | UndefinedVar* kUndefined = &kUndefinedBuf; |
| 8 | |
| 9 | Var::Var() { |
| 10 | } |
| 11 | |
| 12 | Var::~Var() { |
| 13 | } |
| 14 | |
Shinichiro Hamaji | 4c469b3 | 2015-06-15 19:53:36 +0900 | [diff] [blame] | 15 | void Var::AppendVar(Evaluator*, Value*) { |
| 16 | CHECK(false); |
| 17 | } |
| 18 | |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 19 | SimpleVar::SimpleVar(shared_ptr<string> v, const char* origin) |
| 20 | : v_(v), origin_(origin) { |
| 21 | } |
| 22 | |
| 23 | void SimpleVar::Eval(Evaluator*, string* s) const { |
| 24 | *s += *v_; |
| 25 | } |
| 26 | |
Shinichiro Hamaji | 4c469b3 | 2015-06-15 19:53:36 +0900 | [diff] [blame] | 27 | void SimpleVar::AppendVar(Evaluator* ev, Value* v) { |
| 28 | shared_ptr<string> s = make_shared<string>(*v_); |
| 29 | s->push_back(' '); |
| 30 | v->Eval(ev, s.get()); |
| 31 | v_ = s; |
| 32 | } |
| 33 | |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 34 | string SimpleVar::DebugString() const { |
| 35 | return *v_; |
| 36 | } |
| 37 | |
| 38 | RecursiveVar::RecursiveVar(Value* v, const char* origin) |
| 39 | : v_(v), origin_(origin) { |
| 40 | } |
| 41 | |
| 42 | void RecursiveVar::Eval(Evaluator* ev, string* s) const { |
| 43 | v_->Eval(ev, s); |
| 44 | } |
| 45 | |
Shinichiro Hamaji | 4c469b3 | 2015-06-15 19:53:36 +0900 | [diff] [blame] | 46 | void RecursiveVar::AppendVar(Evaluator*, Value* v) { |
| 47 | v_ = NewExpr3(v_, NewLiteral(" "), v); |
| 48 | } |
| 49 | |
Shinichiro Hamaji | 776ca30 | 2015-06-06 03:52:48 +0900 | [diff] [blame] | 50 | string RecursiveVar::DebugString() const { |
| 51 | return v_->DebugString(); |
| 52 | } |
| 53 | |
| 54 | UndefinedVar::UndefinedVar() {} |
| 55 | |
| 56 | void UndefinedVar::Eval(Evaluator*, string*) const { |
| 57 | // Nothing to do. |
| 58 | } |
| 59 | |
| 60 | string UndefinedVar::DebugString() const { |
| 61 | return "*undefined*"; |
| 62 | } |
| 63 | |
| 64 | Vars::~Vars() { |
| 65 | for (auto p : *this) { |
| 66 | delete p.second; |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | Var* Vars::Lookup(StringPiece name) const { |
| 71 | auto found = find(name); |
| 72 | if (found == end()) |
| 73 | return kUndefined; |
| 74 | return found->second; |
| 75 | } |
| 76 | |
| 77 | void Vars::Assign(StringPiece name, Var* v) { |
| 78 | auto p = insert(make_pair(name, v)); |
| 79 | if (!p.second) { |
| 80 | if (p.first->second->IsDefined()) |
| 81 | delete p.first->second; |
| 82 | p.first->second = v; |
| 83 | } |
| 84 | } |