fix(library/vm/vm): memory leak at operator=

This commit is contained in:
Leonardo de Moura 2017-01-26 13:32:44 -08:00
parent 35224685a9
commit 4e625b35ad
2 changed files with 24 additions and 16 deletions

View file

@ -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:

View file

@ -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<expr> const & e);
void release_memory();
void copy_args(vm_instr const & i);
public:
vm_instr():m_op(opcode::Ret) {}