delete op_entry

This commit is contained in:
Valk Richard Li 2021-03-04 15:53:34 +08:00
parent c21d40c466
commit f60f674845
3 changed files with 12 additions and 23 deletions

View File

@ -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];

View File

@ -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()

View File

@ -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,