From 5499e4569ec3a603cb57a2b42a5d297253f59813 Mon Sep 17 00:00:00 2001 From: bog Date: Tue, 26 Sep 2023 11:29:39 +0200 Subject: [PATCH] FIX: nested lambdas closures. --- src/Lambda.hpp | 6 ++++++ src/VM.cpp | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) 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));