update
This commit is contained in:
parent
4617eb8f17
commit
e03da2f737
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
10
nasal_gc.h
10
nasal_gc.h
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue