From 7f6a521ad77f278b5bd8a1f91f979819a5168184 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 9 Dec 2020 18:34:49 +0800 Subject: [PATCH] bug fixed --- nasal_codegen.h | 105 ++---------------------------------------------- nasal_gc.h | 75 ++++++++++++++++++++-------------- nasal_runtime.h | 3 +- 3 files changed, 50 insertions(+), 133 deletions(-) diff --git a/nasal_codegen.h b/nasal_codegen.h index fbb95ff9..a3211497 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -112,12 +112,10 @@ struct struct opcode { unsigned char op; - unsigned int scope; unsigned int index; opcode() { op=op_nop; - scope=0; index=0; return; } @@ -136,7 +134,6 @@ private: std::vector exec_code; std::vector continue_ptr; std::vector break_ptr; - int scope_depth; int error; void regist_number(double); void regist_string(std::string); @@ -206,7 +203,6 @@ void nasal_codegen::pop_gen() { opcode op; op.op=op_pop; - op.scope=scope_depth; op.index=0; exec_code.push_back(op); return; @@ -216,7 +212,6 @@ void nasal_codegen::nil_gen() { opcode op; op.op=op_pushnil; - op.scope=scope_depth; exec_code.push_back(op); return; } @@ -235,7 +230,6 @@ void nasal_codegen::number_gen(nasal_ast& ast) op.op=op_pushnum; op.index=number_table[num]; } - op.scope=scope_depth; exec_code.push_back(op); return; } @@ -246,7 +240,6 @@ void nasal_codegen::string_gen(nasal_ast& ast) regist_string(str); opcode op; op.op=op_pushstr; - op.scope=scope_depth; op.index=string_table[str]; exec_code.push_back(op); return; @@ -257,7 +250,6 @@ void nasal_codegen::vector_gen(nasal_ast& ast) int size=ast.get_children().size(); opcode op; op.op=op_newvec; - op.scope=scope_depth; op.index=0; exec_code.push_back(op); for(int i=0;i>=4; } std::cout<<"0x"<9? 'a'+tmp-10:'0'+tmp)+numinfo; - num>>=4; - } - std::cout<<"[0x"<>=4; } std::cout<<"0x"< elems; + std::list > elems; public: nasal_closure(nasal_virtual_machine&); ~nasal_closure(); - void set_vm(nasal_virtual_machine&); + void add_scope(); + void del_scope(); void add_new_value(std::string,int); int get_value_address(std::string); int get_mem_address(std::string); @@ -167,11 +165,6 @@ nasal_vector::~nasal_vector() elems.clear(); return; } -void nasal_vector::set_vm(nasal_virtual_machine& nvm) -{ - vm=nvm; - return; -} void nasal_vector::add_elem(int value_address) { int memory_address=vm.mem_alloc(value_address); @@ -252,11 +245,6 @@ nasal_hash::~nasal_hash() elems.clear(); return; } -void nasal_hash::set_vm(nasal_virtual_machine& nvm) -{ - vm=nvm; - return; -} void nasal_hash::add_elem(std::string key,int value_address) { if(elems.find(key)==elems.end()) @@ -442,52 +430,77 @@ nasal_ast& nasal_function::get_run_block() /*functions of nasal_closure*/ nasal_closure::nasal_closure(nasal_virtual_machine& nvm):vm(nvm) { + std::map new_scope; + elems.push_back(new_scope); return; } nasal_closure::~nasal_closure() { - for(std::map::iterator i=elems.begin();i!=elems.end();++i) - vm.mem_free(i->second); + for(std::list >::iterator i=elems.begin();i!=elems.end();++i) + for(std::map::iterator j=i->begin();j!=i->end();++j) + vm.mem_free(j->second); elems.clear(); return; } +void nasal_closure::add_scope() +{ + std::map new_scope; + elems.push_back(new_scope); + return; +} +void nasal_closure::del_scope() +{ + std::map& last_scope=elems.back(); + for(std::map::iterator i=last_scope.begin();i!=last_scope.end();++i) + vm.mem_free(i->second); + elems.pop_back(); + return; +} void nasal_closure::add_new_value(std::string key,int value_address) { int new_mem_address=vm.mem_alloc(value_address); - if(elems.find(key)!=elems.end()) + if(elems.back().find(key)!=elems.back().end()) { // if this value already exists,delete the old value and update a new value - int old_mem_address=elems[key]; + int old_mem_address=elems.back()[key]; vm.mem_free(old_mem_address); } - elems[key]=new_mem_address; + elems.back()[key]=new_mem_address; return; } int nasal_closure::get_value_address(std::string key) { int ret_address=-1; - if(elems.find(key)!=elems.end()) - ret_address=vm.mem_get(elems[key]); + for(std::list >::iterator i=elems.begin();i!=elems.end();++i) + if(i->find(key)!=i->end()) + ret_address=vm.mem_get((*i)[key]); return ret_address; } int nasal_closure::get_mem_address(std::string key) { int ret_address=-1; - if(elems.find(key)!=elems.end()) - ret_address=elems[key]; + for(std::list >::iterator i=elems.begin();i!=elems.end();++i) + if(i->find(key)!=i->end()) + ret_address=(*i)[key]; return ret_address; } void nasal_closure::set_closure(nasal_closure& tmp) { - for(std::map::iterator i=elems.begin();i!=elems.end();++i) - vm.mem_free(i->second); + for(std::list >::iterator i=elems.begin();i!=elems.end();++i) + for(std::map::iterator j=i->begin();j!=i->end();++j) + vm.mem_free(j->second); elems.clear(); - for(std::map::iterator i=tmp.elems.begin();i!=tmp.elems.end();++i) + for(std::list >::iterator i=tmp.elems.begin();i!=tmp.elems.end();++i) { - int value_addr=vm.mem_get(i->second); - int new_mem_addr=vm.mem_alloc(value_addr); - vm.add_reference(value_addr); - elems[i->first]=new_mem_addr; + std::map new_scope; + elems.push_back(new_scope); + for(std::map::iterator j=i->begin();j!=i->end();++j) + { + int value_addr=vm.mem_get(j->second); + int new_mem_addr=vm.mem_alloc(value_addr); + vm.add_reference(value_addr); + elems.back()[j->first]=new_mem_addr; + } } return; } diff --git a/nasal_runtime.h b/nasal_runtime.h index 16e99ef6..a5a8d551 100644 --- a/nasal_runtime.h +++ b/nasal_runtime.h @@ -746,6 +746,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_ nasal_function& reference_of_func=nasal_vm.gc_get(base_value_addr).get_func(); int run_closure_addr=reference_of_func.get_closure_addr(); nasal_closure& run_closure=nasal_vm.gc_get(run_closure_addr).get_closure(); + run_closure.add_scope(); if(last_call_hash_addr>=0) { // set hash.me @@ -908,7 +909,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_ } } block_progress(reference_of_func.get_run_block(),run_closure_addr); - + run_closure.del_scope(); if(function_returned_address>=0) { ret_value_addr=function_returned_address;