diff --git a/src/library/vm/vm.cpp b/src/library/vm/vm.cpp index 8f3165c406..4317dfba54 100644 --- a/src/library/vm/vm.cpp +++ b/src/library/vm/vm.cpp @@ -709,6 +709,26 @@ vm_instr mk_closure_instr(unsigned fn_idx, unsigned n) { return r; } +void vm_instr::release_memory() { + switch (m_op) { + case opcode::CasesN: + case opcode::BuiltinCases: + delete[] m_npcs; + break; + case opcode::Num: + delete m_mpz; + break; + case opcode::Pexpr: + delete m_expr; + break; + case opcode::LocalInfo: + delete m_local_info; + break; + default: + break; + } +} + void vm_instr::copy_args(vm_instr const & i) { switch (i.m_op) { case opcode::InvokeGlobal: case opcode::InvokeBuiltin: case opcode::InvokeCFun: @@ -785,31 +805,18 @@ vm_instr::vm_instr(vm_instr && i): } vm_instr::~vm_instr() { - switch (m_op) { - case opcode::Num: - delete m_mpz; - break; - case opcode::CasesN: case opcode::BuiltinCases: - delete[] m_npcs; - break; - case opcode::Pexpr: - delete m_expr; - break; - case opcode::LocalInfo: - delete m_local_info; - break; - default: - break; - } + release_memory(); } vm_instr & vm_instr::operator=(vm_instr const & s) { + release_memory(); m_op = s.m_op; copy_args(s); return *this; } vm_instr & vm_instr::operator=(vm_instr && s) { + release_memory(); m_op = s.m_op; switch (m_op) { case opcode::Num: diff --git a/src/library/vm/vm.h b/src/library/vm/vm.h index 32d962b24c..15dc78f19b 100644 --- a/src/library/vm/vm.h +++ b/src/library/vm/vm.h @@ -362,6 +362,7 @@ class vm_instr { friend vm_instr mk_pexpr_instr(expr const & e); friend vm_instr mk_local_info_instr(unsigned idx, name const & n, optional const & e); + void release_memory(); void copy_args(vm_instr const & i); public: vm_instr():m_op(opcode::Ret) {}