This commit is contained in:
Valk Richard Li 2020-12-20 13:39:24 +08:00
parent 4617eb8f17
commit e03da2f737
2 changed files with 8 additions and 8 deletions

View File

@ -213,11 +213,7 @@ void nasal_bytecode_vm::opr_newfunc()
if(local_scope_top)
val_addr->get_func().set_closure_addr(local_scope_top);
else
{
nasal_scalar* tmp_closure=vm.gc_alloc(vm_closure);
val_addr->get_func().set_closure_addr(tmp_closure);
vm.del_reference(tmp_closure);
}
val_addr->get_func().set_new_closure();
*(++value_stack_top)=val_addr;
return;
}

View File

@ -84,6 +84,7 @@ public:
int get_dynamic_para();
std::vector<nasal_scalar*>& get_default();
void set_closure_addr(nasal_scalar*);
void set_new_closure();
nasal_scalar* get_closure_addr();
};
@ -390,7 +391,7 @@ nasal_function::~nasal_function()
if(closure_addr)
vm.del_reference(closure_addr);
for(int i=0;i<default_para_addr.size();++i)
if(default_para_addr[i]>=0)
if(default_para_addr[i])
vm.del_reference(default_para_addr[i]);
return;
}
@ -428,13 +429,16 @@ std::vector<nasal_scalar*>& nasal_function::get_default()
}
void nasal_function::set_closure_addr(nasal_scalar* value_address)
{
if(closure_addr)
vm.del_reference(closure_addr);
nasal_scalar* new_closure=vm.gc_alloc(vm_closure);
new_closure->get_closure().set_closure(value_address->get_closure());
closure_addr=new_closure;
return;
}
void nasal_function::set_new_closure()
{
closure_addr=vm.gc_alloc(vm_closure);
return;
}
nasal_scalar* nasal_function::get_closure_addr()
{
return closure_addr;