From a0a22f701d69de1eb6caa863161ad3a9f792c2b7 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sat, 14 Nov 2020 00:33:11 +0800 Subject: [PATCH] update --- nasal_builtin.h | 120 +++++++++++++++--------------------------- nasal_gc.h | 137 +++++++++++++++++------------------------------- nasal_runtime.h | 87 ++++++++++-------------------- 3 files changed, 117 insertions(+), 227 deletions(-) diff --git a/nasal_builtin.h b/nasal_builtin.h index 48a0f0b..9471898 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -32,8 +32,7 @@ int nasal_runtime::builtin_print(int local_scope_addr) } std::cout<<"\n"; // generate return value - int ret_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(ret_addr).set_type(vm_nil); + int ret_addr=nasal_vm.gc_alloc(vm_nil); return ret_addr; } int nasal_runtime::builtin_append(int local_scope_addr) @@ -61,8 +60,7 @@ int nasal_runtime::builtin_append(int local_scope_addr) nasal_vm.add_reference(value_address); ref_vector.add_elem(value_address); } - int ret_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(ret_addr).set_type(vm_nil); + int ret_addr=nasal_vm.gc_alloc(vm_nil); return ret_addr; } int nasal_runtime::builtin_setsize(int local_scope_addr) @@ -121,12 +119,10 @@ int nasal_runtime::builtin_setsize(int local_scope_addr) else if(number>vec_size) for(int i=vec_size;i>str; nasal_vm.gc_get(ret_addr).set_string(str); @@ -186,8 +180,7 @@ int nasal_runtime::builtin_sleep(int local_scope_addr) else sleep_time=(unsigned long)nasal_vm.gc_get(value_addr).get_number(); sleep(sleep_time); // sleep in unistd.h will make this progress sleep sleep_time seconds. - int ret_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(ret_addr).set_type(vm_nil); + int ret_addr=nasal_vm.gc_alloc(vm_nil); return ret_addr; } @@ -214,8 +207,7 @@ int nasal_runtime::builtin_finput(int local_scope_addr) else file_content=""; fin.close(); - int ret_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(ret_addr).set_type(vm_string); + int ret_addr=nasal_vm.gc_alloc(vm_string); nasal_vm.gc_get(ret_addr).set_string(file_content); return ret_addr; } @@ -241,8 +233,7 @@ int nasal_runtime::builtin_foutput(int local_scope_addr) std::ofstream fout(filename); fout<> [runtime] builtin_import: cannot use import when running.\n"; - int ret_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(ret_addr).set_type(vm_nil); + int ret_addr=nasal_vm.gc_alloc(vm_nil); return ret_addr; } int nasal_runtime::builtin_die(int local_scope_addr) @@ -759,8 +724,7 @@ int nasal_runtime::builtin_die(int local_scope_addr) } ++error; std::cout<<">> [runtime] error: "<::iterator iter=elems.begin();iter!=elems.end();++iter) { - int str_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(str_addr).set_type(vm_string); + int str_addr=nasal_vm.gc_alloc(vm_string); nasal_vm.gc_get(str_addr).set_string(iter->first); ref_vec.add_elem(str_addr); } @@ -432,8 +428,7 @@ void nasal_function::set_closure_addr(int value_address) { if(closure_addr>=0) nasal_vm.del_reference(closure_addr); - int new_closure=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_closure).set_type(vm_closure); + int new_closure=nasal_vm.gc_alloc(vm_closure); nasal_vm.gc_get(new_closure).get_closure().set_closure(nasal_vm.gc_get(value_address).get_closure()); closure_addr=new_closure; return; @@ -598,9 +593,13 @@ void nasal_scalar::clear() } return; } -bool nasal_scalar::set_type(int nasal_scalar_type) +void nasal_scalar::set_type(int nasal_scalar_type) { - bool ret=true; + if(this->scalar_ptr) + { + std::cout<<">> [vm] scalar_ptr is in use.\n"; + return; + } this->type=nasal_scalar_type; switch(nasal_scalar_type) { @@ -615,10 +614,9 @@ bool nasal_scalar::set_type(int nasal_scalar_type) std::cout<<">> [vm] error scalar type: "<type=vm_nil; this->scalar_ptr=(void*)NULL; - ret=false; break; } - return ret; + return; } void nasal_scalar::set_number(double num) { @@ -698,8 +696,7 @@ int nasal_scalar::nasal_scalar_add(int a_scalar_addr,int b_scalar_addr) else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(a_num+b_num); return new_value_address; } @@ -724,8 +721,7 @@ int nasal_scalar::nasal_scalar_sub(int a_scalar_addr,int b_scalar_addr) else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(a_num-b_num); return new_value_address; } @@ -750,8 +746,7 @@ int nasal_scalar::nasal_scalar_mult(int a_scalar_addr,int b_scalar_addr) else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(a_num*b_num); return new_value_address; } @@ -776,8 +771,7 @@ int nasal_scalar::nasal_scalar_div(int a_scalar_addr,int b_scalar_addr) else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(a_num/b_num); return new_value_address; } @@ -799,8 +793,7 @@ int nasal_scalar::nasal_scalar_link(int a_scalar_addr,int b_scalar_addr) std::string b_str; a_str=(a_ref.type==vm_number)? trans_number_to_string(*(double*)a_ref.scalar_ptr):*(std::string*)a_ref.scalar_ptr; b_str=(b_ref.type==vm_number)? trans_number_to_string(*(double*)b_ref.scalar_ptr):*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_string); + int new_value_address=nasal_vm.gc_alloc(vm_string); nasal_vm.gc_get(new_value_address).set_string(a_str+b_str); return new_value_address; } @@ -819,8 +812,7 @@ int nasal_scalar::nasal_scalar_unary_sub(int a_scalar_addr) else if(a_ref.type==vm_string) a_num=trans_string_to_number(*(std::string*)a_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(-a_num); return new_value_address; } @@ -835,15 +827,13 @@ int nasal_scalar::nasal_scalar_unary_not(int a_scalar_addr) int new_value_address=-1; if(a_ref.type==vm_nil) { - new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(1); } else if(a_ref.type==vm_number) { double number=(double)(*(double*)(a_ref.scalar_ptr)==0); - new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(number); } else if(a_ref.type==vm_string) @@ -851,14 +841,12 @@ int nasal_scalar::nasal_scalar_unary_not(int a_scalar_addr) double number=trans_string_to_number(*(std::string*)a_ref.scalar_ptr); if(std::isnan(number)) { - new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(!(*(std::string*)a_ref.scalar_ptr).length()); } else { - new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(number==0)); } } @@ -875,8 +863,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr) } if(a_scalar_addr==b_scalar_addr) { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(1); return new_value_address; } @@ -884,8 +871,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr) nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr); if(a_ref.type==vm_nil && b_ref.type==vm_nil) { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(1); return new_value_address; } @@ -895,8 +881,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr) { std::string astr=*(std::string*)a_ref.scalar_ptr; std::string bstr=*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(astr==bstr)); return new_value_address; } @@ -911,15 +896,13 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr) else b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_num==b_num)); return new_value_address; } else { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(0); return new_value_address; } @@ -934,8 +917,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr } if(a_scalar_addr==b_scalar_addr) { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(0); return new_value_address; } @@ -943,8 +925,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr); if(a_ref.type==vm_nil && b_ref.type==vm_nil) { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(0); return new_value_address; } @@ -954,8 +935,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr { std::string astr=*(std::string*)a_ref.scalar_ptr; std::string bstr=*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(astr!=bstr)); return new_value_address; } @@ -970,15 +950,13 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr else b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_num!=b_num)); return new_value_address; } else { - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number(1); return new_value_address; } @@ -998,8 +976,7 @@ int nasal_scalar::nasal_scalar_cmp_less(int a_scalar_addr,int b_scalar_addr) { std::string a_str=*(std::string*)a_ref.scalar_ptr; std::string b_str=*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_strb_str)); return new_value_address; } @@ -1049,8 +1024,7 @@ int nasal_scalar::nasal_scalar_cmp_greater(int a_scalar_addr,int b_scalar_addr) else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_num>b_num)); return new_value_address; } @@ -1068,8 +1042,7 @@ int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a_scalar_addr,int b_scalar_ { std::string a_str=*(std::string*)a_ref.scalar_ptr; std::string b_str=*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_str<=b_str)); return new_value_address; } @@ -1084,8 +1057,7 @@ int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a_scalar_addr,int b_scalar_ else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_num<=b_num)); return new_value_address; } @@ -1103,8 +1075,7 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a_scalar_addr,int b_scal { std::string a_str=*(std::string*)a_ref.scalar_ptr; std::string b_str=*(std::string*)b_ref.scalar_ptr; - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_str>=b_str)); return new_value_address; } @@ -1119,8 +1090,7 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a_scalar_addr,int b_scal else if(b_ref.type==vm_string) b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr); - int new_value_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_value_address).set_type(vm_number); + int new_value_address=nasal_vm.gc_alloc(vm_number); nasal_vm.gc_get(new_value_address).set_number((double)(a_num>=b_num)); return new_value_address; } @@ -1216,19 +1186,23 @@ void nasal_virtual_machine::clear() error_info_output_switch=true; return; } -int nasal_virtual_machine::gc_alloc() +int nasal_virtual_machine::gc_alloc(int val_type) { if(garbage_collector_free_space.empty()) { gc_unit* new_block=new gc_unit[256]; garbage_collector_memory.push_back(new_block); int mem_size=garbage_collector_memory.size(); - for(int i=((mem_size-1)<<8);i<(mem_size<<8);++i) + int begin=((mem_size-1)<<8); + int end=(mem_size<<8); + for(int i=begin;i>8][ret&0xff].collected=false; - garbage_collector_memory[ret>>8][ret&0xff].ref_cnt=1; + gc_unit& unit_ref=garbage_collector_memory[ret>>8][ret&0xff]; + unit_ref.collected=false; + unit_ref.ref_cnt=1; + unit_ref.elem.set_type(val_type); garbage_collector_free_space.pop(); return ret; } @@ -1278,19 +1252,6 @@ void nasal_virtual_machine::del_reference(int value_address) } return; } -int nasal_virtual_machine::get_refcnt(int value_address) -{ - int blk_num=(value_address>>8); - int blk_plc=(value_address&0xff); - if(0<=value_address && value_address<(garbage_collector_memory.size()<<8) && !garbage_collector_memory[blk_num][blk_plc].collected) - return garbage_collector_memory[blk_num][blk_plc].ref_cnt; - else - { - if(error_info_output_switch) - std::cout<<">> [vm] get_refcnt:unexpected memory \'"<error=0; this->function_returned_address=-1; - this->global_scope_address=nasal_vm.gc_alloc(); - nasal_vm.gc_get(global_scope_address).set_type(vm_closure); + this->global_scope_address=nasal_vm.gc_alloc(vm_closure); nasal_vm.gc_get(global_scope_address).get_closure().add_scope(); time_t begin_time=std::time(NULL); @@ -211,8 +210,7 @@ void nasal_runtime::run() // private functions int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr) { - int new_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_addr).set_type(vm_vector); + int new_addr=nasal_vm.gc_alloc(vm_vector); nasal_vector& ref_of_this_vector=nasal_vm.gc_get(new_addr).get_vector(); int node_children_size=node.get_children().size(); @@ -222,8 +220,7 @@ int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr) } int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr) { - int new_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(new_addr).set_type(vm_hash); + int new_addr=nasal_vm.gc_alloc(vm_hash); nasal_hash& ref_of_this_hash=nasal_vm.gc_get(new_addr).get_hash(); int node_children_size=node.get_children().size(); for(int i=0;i=str_size || index_num<-str_size) @@ -915,8 +899,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_ else if(argument_format.get_children().size() && argument_format.get_children()[0].get_type()==ast_dynamic_id) { // load null dynamic-id - int vector_value_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(vector_value_addr).set_type(vm_vector); + int vector_value_addr=nasal_vm.gc_alloc(vm_vector); run_closure.add_new_value(argument_format.get_children()[0].get_str(),vector_value_addr); } else if(argument_format.get_children().size() && argument_format.get_children()[0].get_type()==ast_default_arg) @@ -989,8 +972,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_ if(!args_usage_table[dyn_str]) { args_usage_table[dyn_str]=true; - int vector_value_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(vector_value_addr).set_type(vm_vector); + int vector_value_addr=nasal_vm.gc_alloc(vm_vector); run_closure.add_new_value(dyn_str,vector_value_addr); } } @@ -1026,8 +1008,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_ { if(tmp_node.get_type()==ast_dynamic_id) { - int vector_value_addr=nasal_vm.gc_alloc(); - nasal_vm.gc_get(vector_value_addr).set_type(vm_vector); + int vector_value_addr=nasal_vm.gc_alloc(vm_vector); nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector(); for(int j=i;j