diff --git a/code/compiler/10/type_env.cpp b/code/compiler/10/type_env.cpp index c11a759..1d5d757 100644 --- a/code/compiler/10/type_env.cpp +++ b/code/compiler/10/type_env.cpp @@ -11,6 +11,6 @@ void type_env::bind(const std::string& name, type_ptr t) { names[name] = t; } -type_env type_env::scope() const { - return type_env(this); +type_env_ptr type_scope(type_env_ptr parent) { + return type_env_ptr(new type_env(std::move(parent))); } diff --git a/code/compiler/10/type_env.hpp b/code/compiler/10/type_env.hpp index 6470bdd..fe01413 100644 --- a/code/compiler/10/type_env.hpp +++ b/code/compiler/10/type_env.hpp @@ -2,15 +2,19 @@ #include #include "type.hpp" -struct type_env { - std::map names; - type_env const* parent = nullptr; +struct type_env; +using type_env_ptr = std::shared_ptr; - type_env(type_env const* p) - : parent(p) {} +struct type_env { + type_env_ptr parent; + std::map names; + + type_env(type_env_ptr p) : parent(std::move(p)) {} type_env() : type_env(nullptr) {} type_ptr lookup(const std::string& name) const; void bind(const std::string& name, type_ptr t); - type_env scope() const; }; + + +type_env_ptr type_scope(type_env_ptr parent);