diff --git a/code/compiler/13/compiler.cpp b/code/compiler/13/compiler.cpp index 71db20e..3d4b5ff 100644 --- a/code/compiler/13/compiler.cpp +++ b/code/compiler/13/compiler.cpp @@ -69,7 +69,7 @@ void compiler::translate() { } for(auto& defn : global_defs.defs_defn) { auto& function = defn.second->into_global(global_scp); - function.body->env->parent->set_mangled_name(defn.first, function.name); + function.body->env->get_parent()->set_mangled_name(defn.first, function.name); } } diff --git a/code/compiler/13/type_env.cpp b/code/compiler/13/type_env.cpp index 6f4fe6a..a00058d 100644 --- a/code/compiler/13/type_env.cpp +++ b/code/compiler/13/type_env.cpp @@ -2,6 +2,10 @@ #include "type.hpp" #include "error.hpp" +type_env_ptr type_env::get_parent() { + return parent; +} + void type_env::find_free(const type_mgr& mgr, std::set& into) const { if(parent != nullptr) parent->find_free(mgr, into); for(auto& binding : names) { diff --git a/code/compiler/13/type_env.hpp b/code/compiler/13/type_env.hpp index 5292904..334ef73 100644 --- a/code/compiler/13/type_env.hpp +++ b/code/compiler/13/type_env.hpp @@ -10,39 +10,42 @@ using type_env_ptr = std::shared_ptr; enum class visibility { global,local }; -struct type_env { - struct variable_data { - type_scheme_ptr type; - visibility vis; - std::string mangled_name; +class type_env { + private: + struct variable_data { + type_scheme_ptr type; + visibility vis; + std::string mangled_name; - variable_data() - : variable_data(nullptr, visibility::local, "") {} - variable_data(type_scheme_ptr t, visibility v, std::string n) - : type(std::move(t)), vis(v), mangled_name(std::move(n)) {} - }; + variable_data() + : variable_data(nullptr, visibility::local, "") {} + variable_data(type_scheme_ptr t, visibility v, std::string n) + : type(std::move(t)), vis(v), mangled_name(std::move(n)) {} + }; - type_env_ptr parent; - std::map names; - std::map type_names; + type_env_ptr parent; + std::map names; + std::map type_names; - type_env(type_env_ptr p) : parent(std::move(p)) {} - type_env() : type_env(nullptr) {} + public: + type_env(type_env_ptr p) : parent(std::move(p)) {} + type_env() : type_env(nullptr) {} - void find_free(const type_mgr& mgr, std::set& into) const; - void find_free_except(const type_mgr& mgr, const group& avoid, - std::set& into) const; - type_scheme_ptr lookup(const std::string& name) const; - bool is_global(const std::string& name) const; - void set_mangled_name(const std::string& name, const std::string& mangled); - const std::string& get_mangled_name(const std::string& name) const; - type_ptr lookup_type(const std::string& name) const; - void bind(const std::string& name, type_ptr t, - visibility v = visibility::local); - void bind(const std::string& name, type_scheme_ptr t, - visibility v = visibility::local); - void bind_type(const std::string& type_name, type_ptr t); - void generalize(const std::string& name, const group& grp, type_mgr& mgr); + type_env_ptr get_parent(); + void find_free(const type_mgr& mgr, std::set& into) const; + void find_free_except(const type_mgr& mgr, const group& avoid, + std::set& into) const; + type_scheme_ptr lookup(const std::string& name) const; + bool is_global(const std::string& name) const; + void set_mangled_name(const std::string& name, const std::string& mangled); + const std::string& get_mangled_name(const std::string& name) const; + type_ptr lookup_type(const std::string& name) const; + void bind(const std::string& name, type_ptr t, + visibility v = visibility::local); + void bind(const std::string& name, type_scheme_ptr t, + visibility v = visibility::local); + void bind_type(const std::string& type_name, type_ptr t); + void generalize(const std::string& name, const group& grp, type_mgr& mgr); };