From c261ff4cdd4da2cc06831ea75bd89029453b66c4 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Tue, 25 Aug 2020 08:53:45 -0700 Subject: [PATCH] update --- version3.0/nasal_gc.h | 16 ++++- version3.0/nasal_runtime.h | 144 +++++++++++++++++++++---------------- 2 files changed, 97 insertions(+), 63 deletions(-) diff --git a/version3.0/nasal_gc.h b/version3.0/nasal_gc.h index 0acc4a8..8581c41 100644 --- a/version3.0/nasal_gc.h +++ b/version3.0/nasal_gc.h @@ -8,7 +8,7 @@ nasal_number: basic type(double) nasal_string: basic type(std::string) nasal_vector: elems[i] -> address in memory -> value address in gc nasal_hash: elems[key] -> address in memory -> value address in gc -nasal_function: closure -> address in memory ->value address in gc(type: nasal_closure) +nasal_function: closure -> value address in gc(type: nasal_closure) nasal_closure: std::list> -> std::map -> (int) -> address in memory -> value address in gc */ @@ -68,6 +68,7 @@ public: ~nasal_closure(); 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); }; @@ -316,6 +317,19 @@ void nasal_closure::del_scope() this->elems.pop_back(); return; } +void nasal_closure::add_new_value(std::string key,int value_address) +{ + int new_mem_address=nasal_vm.mem_alloc(); + nasal_vm.mem_init(new_mem_address,value_address); + 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.back()[key]; + nasal_vm.mem_free(old_mem_address); + } + elems.back()[key]=new_mem_address; + return; +} int nasal_closure::get_value_address(std::string key) { int ret_address=-1; diff --git a/version3.0/nasal_runtime.h b/version3.0/nasal_runtime.h index 93b853a..cf7ff70 100644 --- a/version3.0/nasal_runtime.h +++ b/version3.0/nasal_runtime.h @@ -26,11 +26,11 @@ private: // generate string and return gc place of this string int string_generation(nasal_ast&); // generate vector and return gc place of this vector - int vector_generation(nasal_ast&); + int vector_generation(nasal_ast&,int); // generate hash and return gc place of this hash - int hash_generation(nasal_ast&); + int hash_generation(nasal_ast&,int); // generate function and return gc place of this function - int function_generation(nasal_ast&); + int function_generation(nasal_ast&,int); // main expression block running process int main_progress(); @@ -43,11 +43,11 @@ private: // run function int function_progress(); // get scalars in complex data structure like vector/hash/function/closure(scope) - int call_nasal_scalar(nasal_ast&); + int call_nasal_scalar(nasal_ast&,int); // get scalars' memory place in complex data structure like vector/hash/function/closure(scope) - int call_scalar_mem(nasal_ast&); + int call_scalar_mem(nasal_ast&,int); // calculate scalars - int calculation(nasal_ast&); + int calculation(nasal_ast&,int); public: nasal_runtime(); ~nasal_runtime(); @@ -100,7 +100,7 @@ int nasal_runtime::string_generation(nasal_ast& node) nasal_vm.gc_get(new_addr).set_string(node.get_str()); return new_addr; } -int nasal_runtime::vector_generation(nasal_ast& node) +int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr=-1) { int new_addr=nasal_vm.gc_alloc(); nasal_vm.gc_get(new_addr).set_type(vm_vector); @@ -115,14 +115,14 @@ int nasal_runtime::vector_generation(nasal_ast& node) { case ast_number: nasal_vm.mem_init(new_memory_space,number_generation(node.get_children()[i]));break; case ast_string: nasal_vm.mem_init(new_memory_space,string_generation(node.get_children()[i]));break; - case ast_vector: nasal_vm.mem_init(new_memory_space,vector_generation(node.get_children()[i]));break; - case ast_hash: nasal_vm.mem_init(new_memory_space,hash_generation(node.get_children()[i]));break; - case ast_function: nasal_vm.mem_init(new_memory_space,function_generation(node.get_children()[i]));break; + case ast_vector: nasal_vm.mem_init(new_memory_space,vector_generation(node.get_children()[i],local_scope_addr));break; + case ast_hash: nasal_vm.mem_init(new_memory_space,hash_generation(node.get_children()[i],local_scope_addr));break; + case ast_function: nasal_vm.mem_init(new_memory_space,function_generation(node.get_children()[i],local_scope_addr));break; } } return new_addr; } -int nasal_runtime::hash_generation(nasal_ast& node) +int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr=-1) { int new_addr=nasal_vm.gc_alloc(); nasal_vm.gc_get(new_addr).set_type(vm_hash); @@ -139,14 +139,14 @@ int nasal_runtime::hash_generation(nasal_ast& node) { case ast_number: nasal_vm.mem_init(new_memory_space,number_generation(ref_of_hash_member_value));break; case ast_string: nasal_vm.mem_init(new_memory_space,string_generation(ref_of_hash_member_value));break; - case ast_vector: nasal_vm.mem_init(new_memory_space,vector_generation(ref_of_hash_member_value));break; - case ast_hash: nasal_vm.mem_init(new_memory_space,hash_generation(ref_of_hash_member_value));break; - case ast_function: nasal_vm.mem_init(new_memory_space,function_generation(ref_of_hash_member_value));break; + case ast_vector: nasal_vm.mem_init(new_memory_space,vector_generation(ref_of_hash_member_value,local_scope_addr));break; + case ast_hash: nasal_vm.mem_init(new_memory_space,hash_generation(ref_of_hash_member_value,local_scope_addr));break; + case ast_function: nasal_vm.mem_init(new_memory_space,function_generation(ref_of_hash_member_value,local_scope_addr));break; } } return new_addr; } -int nasal_runtime::function_generation(nasal_ast& node) +int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr=-1) { int new_addr=nasal_vm.gc_alloc(); nasal_vm.gc_get(new_addr).set_type(vm_function); @@ -182,17 +182,37 @@ int nasal_runtime::function_progress() int ret_state=rt_exit_without_error; return ret_state; } -int nasal_runtime::call_nasal_scalar(nasal_ast& node) +int nasal_runtime::call_nasal_scalar(nasal_ast& node,int local_scope_addr=-1) { + int value_address=-1; + if(local_scope_addr>=0) + value_address=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(node.get_children()[0].get_str()); + if(value_address<0) + value_address=nasal_vm.gc_get(global_scope_address).get_closure().get_value_address(node.get_children()[0].get_str()); + if(value_address<0) + { + std::cout<<">> [runtime] call_nasal_scalar:cannot find value named \'"<=0) + mem_address=nasal_vm.gc_get(local_scope_addr).get_closure().get_mem_address(node.get_children()[0].get_str()); + if(mem_address<0) + mem_address=nasal_vm.gc_get(global_scope_address).get_closure().get_mem_address(node.get_children()[0].get_str()); + if(mem_address<0) + { + std::cout<<">> [runtime] call_nasal_mem:cannot find value named \'"<