From d1e37f1948196ec968653f11dcf5d5fcf8963965 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura Date: Tue, 31 May 2016 18:44:53 -0700 Subject: [PATCH] fix(library/vm/vm): invoke_closure --- src/library/vm/vm.cpp | 23 +++++++++++------------ src/library/vm/vm.h | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/library/vm/vm.cpp b/src/library/vm/vm.cpp index d31959e7df..5a7b04c4ed 100644 --- a/src/library/vm/vm.cpp +++ b/src/library/vm/vm.cpp @@ -914,10 +914,9 @@ inline vm_cfunction_7 to_fn7(vm_decl const & d) { return reinterpret_cast(d.get_cfn()); } inline vm_cfunction_N to_fnN(vm_decl const & d) { return reinterpret_cast(d.get_cfn()); } -vm_obj vm_state::invoke_closure(vm_obj const & fn, unsigned arity) { - std::copy(cfields(fn), cfields(fn) + csize(fn), std::back_inserter(m_stack)); +vm_obj vm_state::invoke_closure(vm_obj const & fn, unsigned nargs) { m_stack.push_back(fn); - apply(arity); + apply(nargs); vm_obj r = m_stack.back(); m_stack.pop_back(); return r; @@ -962,7 +961,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1) { } } else { m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 1); } } else { lean_unreachable(); @@ -1000,7 +999,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2) } else { m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 2); } } else { lean_assert(nargs > d.get_arity()); @@ -1041,7 +1040,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 3); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2), a3); @@ -1085,7 +1084,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 4); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2, a3), a4); @@ -1134,7 +1133,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 5); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2, a3, a4), a5); @@ -1187,7 +1186,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 6); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2, a3, a4, a5), a6); @@ -1244,7 +1243,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 7); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2, a3, a4, a5, a6), a7); @@ -1305,7 +1304,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, vm_obj const & a1, vm_obj const & a2, m_stack.push_back(a3); m_stack.push_back(a2); m_stack.push_back(a1); - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, 8); } } else if (nargs == d.get_arity() + 1) { return invoke(invoke(fn, a1, a2, a3, a4, a5, a6, a7), a8); @@ -1360,7 +1359,7 @@ vm_obj vm_state::invoke(vm_obj const & fn, unsigned nargs, vm_obj const * args) } else { unsigned i = nargs; while (i > 0) { --i; m_stack.push_back(args[i]); } - return invoke_closure(fn, d.get_arity()); + return invoke_closure(fn, nargs); } } else { lean_assert(nargs + csize(fn) > d.get_arity()); diff --git a/src/library/vm/vm.h b/src/library/vm/vm.h index ecafc0e3b6..01760c8e21 100644 --- a/src/library/vm/vm.h +++ b/src/library/vm/vm.h @@ -465,7 +465,7 @@ class vm_state { void invoke(vm_decl const & d); void run(); void execute(vm_instr const * code); - vm_obj invoke_closure(vm_obj const & fn, unsigned arity); + vm_obj invoke_closure(vm_obj const & fn, unsigned nargs); public: vm_state(environment const & env);