You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
760 B
C++
43 lines
760 B
C++
4 months ago
|
#include "var.hpp"
|
||
|
|
||
|
#include <list>
|
||
|
#include <map>
|
||
|
#include <string>
|
||
|
|
||
|
static std::list<std::map<std::string, Var>> llvmVars;
|
||
|
|
||
|
Var Var::lookup(const std::string& name, int skip)
|
||
|
{
|
||
|
for (auto sc = llvmVars.rbegin(); sc != llvmVars.rend(); ++sc) {
|
||
|
if (skip > 0) {
|
||
|
--skip;
|
||
|
continue;
|
||
|
}
|
||
|
if (sc->contains(name))
|
||
|
return (*sc)[name];
|
||
|
}
|
||
|
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
void Var::pushScope()
|
||
|
{
|
||
|
llvmVars.emplace_back();
|
||
|
}
|
||
|
|
||
|
void Var::popScope()
|
||
|
{
|
||
|
llvmVars.pop_back();
|
||
|
}
|
||
|
|
||
|
Var& Var::addGlobal(const std::string& name, Var var)
|
||
|
{
|
||
|
return llvmVars.front().emplace(name, var).first->second;
|
||
|
}
|
||
|
|
||
|
Var& Var::addLocal(const std::string& name, Var var)
|
||
|
{
|
||
|
return llvmVars.back().emplace(name, var).first->second;
|
||
|
}
|
||
|
|