diff --git a/src/Lambda.hpp b/src/Lambda.hpp index f94bb79..2dc58f7 100644 --- a/src/Lambda.hpp +++ b/src/Lambda.hpp @@ -14,6 +14,9 @@ namespace fk explicit Lambda(std::shared_ptr program, size_t arity); virtual ~Lambda(); + std::unordered_map> + get_all_env() const { return m_env; } + size_t arity() const { return m_arity; } addr_t base_addr() const { return m_base_addr; } @@ -22,8 +25,11 @@ namespace fk std::shared_ptr program() const { return m_program; } bool has_env(addr_t addr) const; + + std::shared_ptr get_env(addr_t addr) const; void add_env(addr_t addr, std::shared_ptr constant); + size_t env_size() const { return m_env.size(); } private: diff --git a/src/VM.cpp b/src/VM.cpp index 2ba0bdc..4f07147 100644 --- a/src/VM.cpp +++ b/src/VM.cpp @@ -204,8 +204,11 @@ namespace fk m_pc++; break; } - std::cout << "noooo" << std::endl; - m_pc++; + + std::cerr << "cannot find addr '" + << instr.param + << "'" << std::endl; + abort(); } break; case OP_NOT: { @@ -254,6 +257,14 @@ namespace fk { lambda->add_env(e.first, e.second); } + + if (f.lambda) + { + for (auto e: f.lambda->get_all_env()) + { + lambda->add_env(e.first, e.second); + } + } } push(frame().program->add(ref));