30 VarDictType::iterator iter =
_map.find(name);
31 if (iter !=
_map.end())
32 return iter->second.get();
40 FuncDictType::iterator iter =
_functions.find(name);
50 VarDictType::const_iterator iter =
_map.find(name);
51 if (iter !=
_map.end())
52 return iter->second.get();
63 FuncDictType::iterator iter =
_functions.find(name);
65 iter->second = prototype;
67 _functions.insert(std::make_pair(name, prototype));
71 void ExprVarEnv::add(
const std::string& name, std::unique_ptr<ExprLocalVar> var) {
72 VarDictType::iterator iter =
_map.find(name);
73 if (iter !=
_map.end()) {
76 iter->second = std::move(var);
78 _map.insert(std::make_pair(name, std::move(var)));
82 typedef std::map<std::pair<ExprLocalVar*, ExprLocalVar*>, std::string> MakeMap;
85 for (
auto& ienv : env1.
_map) {
86 const std::string& name = ienv.first;
89 phisToMake[std::make_pair(var, env2Var)] = name;
93 for (
auto& ienv : env2.
_map) {
94 const std::string& name = ienv.first;
97 phisToMake[std::make_pair(env1Var, var)] = name;
101 std::vector<std::pair<std::string, ExprLocalVarPhi*>> mergedVariablesInThisCall;
102 for (MakeMap::iterator
it = phisToMake.begin();
it != phisToMake.end(); ++
it) {
103 std::unique_ptr<ExprLocalVar> newVar(
new ExprLocalVarPhi(type,
it->first.first,
it->first.second));
104 mergedVariablesInThisCall.emplace_back(
it->second,
static_cast<ExprLocalVarPhi*
>(newVar.get()));
105 add(
it->second, std::move(newVar));