From b67461882323cd76c435dca021b3908f1a646cf8 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sun, 13 Sep 2020 00:27:27 -0700 Subject: [PATCH] update --- version3.0/nasal.h | 3 ++ version3.0/nasal_builtin.h | 66 ++++++++++++++++++++++++++++++++++ version3.0/nasal_gc.h | 72 ++++++++++++++++++++++++++++++++------ version3.0/nasal_runtime.h | 18 +++++++--- 4 files changed, 145 insertions(+), 14 deletions(-) diff --git a/version3.0/nasal.h b/version3.0/nasal.h index ae18326..71212c2 100644 --- a/version3.0/nasal.h +++ b/version3.0/nasal.h @@ -1,6 +1,9 @@ #ifndef __NASAL_H__ #define __NASAL_H__ + + +#include #include #include #include diff --git a/version3.0/nasal_builtin.h b/version3.0/nasal_builtin.h index a5d1bcf..9011425 100644 --- a/version3.0/nasal_builtin.h +++ b/version3.0/nasal_builtin.h @@ -132,4 +132,70 @@ int nasal_runtime::builtin_setsize(int local_scope_addr) return ret_addr; } +int nasal_runtime::builtin_system(int local_scope_addr) +{ + int str_value_addr=-1; + if(local_scope_addr>=0) + str_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("str"); + if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string) + { + std::cout<<">> [runtime] builtin_system: cannot find values or wrong value type(must be string)."<>str; + nasal_vm.gc_get(ret_addr).set_string(str); + return ret_addr; +} + +int nasal_runtime::builtin_sleep(int local_scope_addr) +{ + int value_addr=-1; + if(local_scope_addr>=0) + value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("duration"); + if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_string && nasal_vm.gc_get(value_addr).get_type()!=vm_number)) + { + std::cout<<">> [runtime] builtin_sleep: cannot find values or wrong value type(must be string or numebr)."<> [runtime] builtin_sleep: this is not a numerable string."< garbage_collector_free_space; std::vector garbage_collector_memory; std::queue memory_manager_free_space; std::vector memory_manager_memory; public: + nasal_virtual_machine(); ~nasal_virtual_machine(); void clear(); void debug(); @@ -1090,6 +1092,15 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr } else if((a_ref.type==vm_number || a_ref.type==vm_string) && (b_ref.type==vm_number || b_ref.type==vm_string)) { + if(a_ref.type==vm_string && b_ref.type==vm_string) + { + 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); + nasal_vm.gc_get(new_value_address).set_number((double)(astr!=bstr)); + return new_value_address; + } double a_num; double b_num; if(a_ref.type==vm_number) a_num=*(double*)a_ref.scalar_ptr; @@ -1306,21 +1317,39 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a_scalar_addr,int b_scal } /*functions of nasal_virtual_machine*/ +nasal_virtual_machine::nasal_virtual_machine() +{ + error_info_output_switch=true; + return; +} nasal_virtual_machine::~nasal_virtual_machine() { + error_info_output_switch=false; int gc_mem_size=garbage_collector_memory.size(); int mm_mem_size=memory_manager_memory.size(); for(int i=0;i> [vm] gc_get:unexpected memory \'"<> [vm] gc_get:unexpected memory \'"<> [vm] gc_add_ref:unexpected memory \'"<> [vm] gc_add_ref:unexpected memory \'"<> [vm] gc_del_ref:unexpected memory \'"<> [vm] gc_del_ref:unexpected memory \'"<> [vm] get_refcnt:unexpected memory \'"<> [vm] get_refcnt:unexpected memory \'"<> [vm] mem_free:unexpected memory \'"<> [vm] mem_free:unexpected memory \'"<> [vm] mem_store:unexpected memory \'"<> [vm] mem_store:unexpected memory \'"<>8][memory_address&0xff]=value_address; else { - std::cout<<">> [vm] mem_store:unexpected memory \'"<> [vm] mem_store:unexpected memory \'"<>8][memory_address&0xff]; else - std::cout<<">> [vm] mem_get:unexpected memory \'"<> [vm] mem_get:unexpected memory \'"<> [runtime] call_function: incorrect value type,expected a function."<