Add memory features for functions
This commit is contained in:
parent
68b952d105
commit
13b067f803
@ -12,10 +12,11 @@ class Memory {
|
|||||||
public:
|
public:
|
||||||
bool contains(string identifier);
|
bool contains(string identifier);
|
||||||
bool contains_top(string identifier);
|
bool contains_top(string identifier);
|
||||||
void add_scope(ScopeType type);
|
void add_scope(ScopeType type, CodePosition entry_pos = { }, MemoryVar* fn = NULL);
|
||||||
void remove_scope(void);
|
void remove_scope(void);
|
||||||
|
|
||||||
MemoryVar& get(string identifier);
|
MemoryVar& get(string identifier);
|
||||||
|
Scope& get_function_scope(void);
|
||||||
void declare(string identifier, Type type, CodePosition pos);
|
void declare(string identifier, Type type, CodePosition pos);
|
||||||
void update(string identifier, EvalResult value);
|
void update(string identifier, EvalResult value);
|
||||||
|
|
||||||
|
@ -212,6 +212,8 @@ struct Scope {
|
|||||||
unordered_map<string, MemoryVar> vars;
|
unordered_map<string, MemoryVar> vars;
|
||||||
int depth;
|
int depth;
|
||||||
ScopeType type;
|
ScopeType type;
|
||||||
|
CodePosition entry_pos;
|
||||||
|
MemoryVar* fn;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -21,11 +21,13 @@ bool Memory::contains_top(string identifier) {
|
|||||||
return top.vars.contains(identifier);
|
return top.vars.contains(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Memory::add_scope(ScopeType type) {
|
void Memory::add_scope(ScopeType type, CodePosition entry_pos, MemoryVar* fn) {
|
||||||
Scope& top = scopes.back();
|
Scope& top = scopes.back();
|
||||||
scopes.emplace_back();
|
scopes.emplace_back();
|
||||||
scopes.back().depth = top.depth + 1;
|
scopes.back().depth = top.depth + 1;
|
||||||
scopes.back().type = type;
|
scopes.back().type = type;
|
||||||
|
scopes.back().entry_pos = entry_pos;
|
||||||
|
scopes.back().fn = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Memory::remove_scope(void) {
|
void Memory::remove_scope(void) {
|
||||||
@ -41,6 +43,15 @@ MemoryVar& Memory::get(string identifier) {
|
|||||||
throw exception();
|
throw exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Scope& Memory::get_function_scope(void) {
|
||||||
|
for (auto rit = scopes.rbegin(); rit != scopes.rend(); ++rit) {
|
||||||
|
Scope& scope = *rit;
|
||||||
|
if (scope.type == ScopeType::Function) return scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw exception();
|
||||||
|
}
|
||||||
|
|
||||||
void Memory::declare(string identifier, Type type, CodePosition pos) {
|
void Memory::declare(string identifier, Type type, CodePosition pos) {
|
||||||
Scope& top = scopes.back();
|
Scope& top = scopes.back();
|
||||||
top.vars[identifier].type = type;
|
top.vars[identifier].type = type;
|
||||||
|
Loading…
Reference in New Issue
Block a user