blob: ee708f44e92176f528094b2d232e4b53b273ca0d [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#include "var.h"
2
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +09003#include "log.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09004#include "value.h"
5
6UndefinedVar kUndefinedBuf;
7UndefinedVar* kUndefined = &kUndefinedBuf;
8
9Var::Var() {
10}
11
12Var::~Var() {
13}
14
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090015void Var::AppendVar(Evaluator*, Value*) {
16 CHECK(false);
17}
18
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090019SimpleVar::SimpleVar(shared_ptr<string> v, const char* origin)
20 : v_(v), origin_(origin) {
21}
22
23void SimpleVar::Eval(Evaluator*, string* s) const {
24 *s += *v_;
25}
26
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090027void 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 Hamaji776ca302015-06-06 03:52:48 +090034string SimpleVar::DebugString() const {
35 return *v_;
36}
37
38RecursiveVar::RecursiveVar(Value* v, const char* origin)
39 : v_(v), origin_(origin) {
40}
41
42void RecursiveVar::Eval(Evaluator* ev, string* s) const {
43 v_->Eval(ev, s);
44}
45
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090046void RecursiveVar::AppendVar(Evaluator*, Value* v) {
47 v_ = NewExpr3(v_, NewLiteral(" "), v);
48}
49
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090050string RecursiveVar::DebugString() const {
51 return v_->DebugString();
52}
53
54UndefinedVar::UndefinedVar() {}
55
56void UndefinedVar::Eval(Evaluator*, string*) const {
57 // Nothing to do.
58}
59
60string UndefinedVar::DebugString() const {
61 return "*undefined*";
62}
63
64Vars::~Vars() {
65 for (auto p : *this) {
66 delete p.second;
67 }
68}
69
70Var* Vars::Lookup(StringPiece name) const {
71 auto found = find(name);
72 if (found == end())
73 return kUndefined;
74 return found->second;
75}
76
77void 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}