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) if(local_scope_top)
val_addr->get_func().set_closure_addr(local_scope_top); val_addr->get_func().set_closure_addr(local_scope_top);
else else
{ val_addr->get_func().set_new_closure();
nasal_scalar* tmp_closure=vm.gc_alloc(vm_closure);
val_addr->get_func().set_closure_addr(tmp_closure);
vm.del_reference(tmp_closure);
}
*(++value_stack_top)=val_addr; *(++value_stack_top)=val_addr;
return; return;
} }

View File

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