-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcontext.cc
74 lines (65 loc) · 1.5 KB
/
context.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "context.h"
#include <cassert>
#include <iostream>
#include "cmdargs.h"
#include "log.h"
using std::string;
bool Scope::localCount(string name) { return varRec->count(name); }
bool Scope::count(string name) {
if (localCount(name))
return true;
else if (parent)
return parent->count(name);
return false;
}
void Scope::define(string name, Record r) {
if (localCount(name)) {
std::cerr << "redefine " << name << std::endl;
exit(-1);
} else
setOrCreateVar(name, r);
}
void Scope::setOrCreateVar(string name, Record r) { (*varRec)[name] = r; }
void Scope::set(string name, Record r) {
if (localCount(name)) {
if (get(name).type == r.type)
setOrCreateVar(name, r);
else
abortMsg("type mismatched");
} else if (parent && parent->count(name))
parent->set(name, r);
else {
std::cerr << "Cannot set undefined variable " << name << std::endl;
exit(-1);
}
}
Record Scope::get(string name) {
if (localCount(name)) {
auto ret = (*varRec)[name];
return ret;
} else if (parent) {
return parent->get(name);
} else {
std::cerr << "Cannot get undefined variable " << name << std::endl;
exit(-1);
}
}
Trace Scope::getTrace() {
if (trace) {
return *trace;
} else if (parent) {
return parent->getTrace();
} else {
return Trace{};
}
}
void Scope::setTrace(Trace r) {
if (trace) {
*trace = r;
} else if (parent) {
parent->setTrace(r);
} else {
std::cerr << "Return in an invalid context";
exit(-1);
}
}