diff --git a/nasal_codegen.h b/nasal_codegen.h index 1a7553d..de7c33f 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -12,7 +12,7 @@ enum op_code op_pushstr, op_newvec,op_newhash,op_newfunc, op_vecapp,op_hashapp, - op_para,op_defpara,op_dynpara,op_entry, + op_para,op_defpara,op_dynpara, op_unot,op_usub, op_add,op_sub,op_mul,op_div,op_lnk, op_addeq,op_subeq,op_muleq,op_diveq,op_lnkeq,op_meq, @@ -62,7 +62,6 @@ struct {op_para, "para "}, {op_defpara, "deflt "}, {op_dynpara, "dyn "}, - {op_entry, "entry "}, {op_unot, "not "}, {op_usub, "usub "}, {op_add, "add "}, @@ -275,6 +274,7 @@ void nasal_codegen::hash_gen(nasal_ast& ast) void nasal_codegen::function_gen(nasal_ast& ast) { + int newfunc_label=exec_code.size(); gen(op_newfunc,0); nasal_ast& ref_arg=ast.get_children()[0]; @@ -302,7 +302,7 @@ void nasal_codegen::function_gen(nasal_ast& ast) gen(op_dynpara,string_table[str]); } } - gen(op_entry,exec_code.size()+2); + exec_code[newfunc_label].index=exec_code.size()+1; int ptr=exec_code.size(); gen(op_jmp,0); nasal_ast& block=ast.get_children()[1]; diff --git a/nasal_gc.h b/nasal_gc.h index d2f3e9f..cce4955 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -148,7 +148,6 @@ nasal_vec::~nasal_vec() int size=elems.size(); for(int i=0;isecond); - elems.clear(); return; } void nasal_hash::add_elem(std::string key,nasal_val* value_address) @@ -441,7 +439,6 @@ nasal_scop::~nasal_scop() { for(auto i=elems.begin();i!=elems.end();++i) gc.del_reference(i->second); - elems.clear(); return; } void nasal_scop::add_new_value(int key,nasal_val* value_address) @@ -468,8 +465,6 @@ nasal_val** nasal_scop::get_mem_address(int key) } void nasal_scop::set_closure(nasal_scop& tmp) { - for(auto i=elems.begin();i!=elems.end();++i) - gc.del_reference(i->second); elems=tmp.elems; for(auto i=elems.begin();i!=elems.end();++i) gc.add_reference(i->second); @@ -617,7 +612,6 @@ nasal_gc::~nasal_gc() delete memory[i]; while(!free_space.empty()) free_space.pop(); - memory.clear(); return; } void nasal_gc::clear() diff --git a/nasal_vm.h b/nasal_vm.h index c7a9f80..a2abfbc 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -7,6 +7,7 @@ class nasal_vm private: nasal_val* zero_addr; // reserved address of nasal_val,type vm_num, 0 nasal_val* one_addr; // reserved address of nasal_val,type vm_num, 1 + nasal_val* nil_addr; // reserved address of nasal_val,type vm_nil bool main_loop_break_mark; // when mark is false,break the main loop int ptr; // program counter int me_index; // this is the index of "me" in string_table @@ -45,7 +46,6 @@ private: void opr_para(); void opr_defpara(); void opr_dynpara(); - void opr_entry(); void opr_unot(); void opr_usub(); void opr_add(); @@ -182,7 +182,8 @@ void nasal_vm::opr_pushzero() } void nasal_vm::opr_pushnil() { - *(++val_stack_top)=gc.gc_alloc(vm_nil); + *(++val_stack_top)=nil_addr; + gc.add_reference(nil_addr); return; } void nasal_vm::opr_pushstr() @@ -206,6 +207,7 @@ void nasal_vm::opr_newfunc() { nasal_val* val_addr=gc.gc_alloc(vm_func); nasal_val* local_scope_top=local_scope_stack.top(); + val_addr->get_func().set_entry(exec_code[ptr].index); if(local_scope_top) val_addr->get_func().set_closure_addr(local_scope_top); else @@ -215,14 +217,12 @@ void nasal_vm::opr_newfunc() } void nasal_vm::opr_vecapp() { - nasal_val* val_addr=*val_stack_top--; - (*val_stack_top)->get_vector().add_elem(val_addr); + (*val_stack_top)->get_vector().add_elem(*val_stack_top--); return; } void nasal_vm::opr_hashapp() { - nasal_val* val_addr=*val_stack_top--; - (*val_stack_top)->get_hash().add_elem(string_table[exec_code[ptr].index],val_addr); + (*val_stack_top)->get_hash().add_elem(string_table[exec_code[ptr].index],*val_stack_top--); return; } void nasal_vm::opr_para() @@ -232,8 +232,7 @@ void nasal_vm::opr_para() } void nasal_vm::opr_defpara() { - nasal_val* val_addr=*val_stack_top--; - (*val_stack_top)->get_func().add_para(exec_code[ptr].index,val_addr); + (*val_stack_top)->get_func().add_para(exec_code[ptr].index,*val_stack_top--); return; } void nasal_vm::opr_dynpara() @@ -241,11 +240,6 @@ void nasal_vm::opr_dynpara() (*val_stack_top)->get_func().add_para(exec_code[ptr].index,NULL,true); return; } -void nasal_vm::opr_entry() -{ - (*val_stack_top)->get_func().set_entry(exec_code[ptr].index); - return; -} void nasal_vm::opr_unot() { nasal_val* val_addr=*val_stack_top; @@ -1099,6 +1093,8 @@ void nasal_vm::run(std::vector& strs,std::vector& nums,std: zero_addr->set_number(0); one_addr=gc.gc_alloc(vm_num); one_addr->set_number(1); + nil_addr=gc.gc_alloc(vm_nil); + builtin_use_string_table.clear(); for(int i=0;i& strs,std::vector& nums,std: &nasal_vm::opr_para, &nasal_vm::opr_defpara, &nasal_vm::opr_dynpara, - &nasal_vm::opr_entry, &nasal_vm::opr_unot, &nasal_vm::opr_usub, &nasal_vm::opr_add,