delete op_entry
This commit is contained in:
parent
c21d40c466
commit
f60f674845
|
@ -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];
|
||||
|
|
|
@ -148,7 +148,6 @@ nasal_vec::~nasal_vec()
|
|||
int size=elems.size();
|
||||
for(int i=0;i<size;++i)
|
||||
gc.del_reference(elems[i]);
|
||||
elems.clear();
|
||||
return;
|
||||
}
|
||||
void nasal_vec::add_elem(nasal_val* value_address)
|
||||
|
@ -227,7 +226,6 @@ nasal_hash::~nasal_hash()
|
|||
{
|
||||
for(auto iter=elems.begin();iter!=elems.end();++iter)
|
||||
gc.del_reference(iter->second);
|
||||
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()
|
||||
|
|
23
nasal_vm.h
23
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<std::string>& strs,std::vector<double>& 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<string_table.size();++i)
|
||||
{
|
||||
|
@ -1124,7 +1120,6 @@ void nasal_vm::run(std::vector<std::string>& strs,std::vector<double>& 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,
|
||||
|
|
Loading…
Reference in New Issue