From ee318d74a1def7b996bbf0f749606b7a7897f527 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Fri, 25 Sep 2020 05:07:04 -0700 Subject: [PATCH] update --- version3.0/nasal_builtin.h | 117 +++++++++++-------------------------- 1 file changed, 33 insertions(+), 84 deletions(-) diff --git a/version3.0/nasal_builtin.h b/version3.0/nasal_builtin.h index f33bbc5..0b0b3c6 100644 --- a/version3.0/nasal_builtin.h +++ b/version3.0/nasal_builtin.h @@ -1,17 +1,19 @@ #ifndef __NASAL_BUILTIN_H__ #define __NASAL_BUILTIN_H__ +#define in_builtin_find(value_name_string) (local_scope_addr>=0?nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(value_name_string):-1) + int nasal_runtime::builtin_print(int local_scope_addr) { - int vector_value_addr=-1; - if(local_scope_addr>=0) - vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements"); + // get arguments + int vector_value_addr=in_builtin_find("elements"); if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) { std::cout<<">> [runtime] builtin_print: cannot find values or wrong value type."<=0) - vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector"); + int vector_value_addr=in_builtin_find("vector"); + int elem_value_addr=in_builtin_find("elements"); if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) { std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<=0) - elem_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements"); if(elem_value_addr<0 || nasal_vm.gc_get(elem_value_addr).get_type()!=vm_vector) { std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<=0) - vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector"); + int vector_value_addr=in_builtin_find("vector"); + int size_value_addr=in_builtin_find("size"); if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) { std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<=0) - size_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("size"); if(size_value_addr<0) { std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<=0) - str_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("str"); + int str_value_addr=in_builtin_find("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)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("duration"); + int value_addr=in_builtin_find("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)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename"); + int value_addr=in_builtin_find("filename"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) { std::cout<<">> [runtime] builtin_finput: cannot find values or wrong value type(must be string)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename"); + int value_addr=in_builtin_find("filename"); + int str_value_addr=in_builtin_find("str"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) { std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(filename must be string)."<=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_foutput: cannot find values or wrong value type(file's content must be string)."<=0) - delimeter_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("delimeter"); + int delimeter_value_addr=in_builtin_find("delimeter"); + int string_value_addr=in_builtin_find("string"); if(delimeter_value_addr<0 || nasal_vm.gc_get(delimeter_value_addr).get_type()!=vm_string) { std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<=0) - string_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("string"); if(string_value_addr<0 || nasal_vm.gc_get(string_value_addr).get_type()!=vm_string) { std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("seed"); + int value_addr=in_builtin_find("seed"); if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_number && nasal_vm.gc_get(value_addr).get_type()!=vm_nil)) { std::cout<<">> [runtime] builtin_rand: cannot find values or wrong value type(must be nil or number)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("id"); + int value_addr=in_builtin_find("id"); if(value_addr<0) { std::cout<<">> [runtime] builtin_id: cannot find this value."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value"); + int value_addr=in_builtin_find("value"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_int: cannot find this value or wrong value type(must be number)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value"); + int value_addr=in_builtin_find("value"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) { std::cout<<">> [runtime] builtin_num: cannot find this value or wrong value type(must be string)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector"); + int value_addr=in_builtin_find("vector"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector) { std::cout<<">> [runtime] builtin_pop: cannot find this value or wrong value type(must be vector)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("number"); + int value_addr=in_builtin_find("number"); if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_str: cannot find values or wrong value type(must be number)."<=0) - value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("object"); + int value_addr=in_builtin_find("object"); if(value_addr<0) { std::cout<<">> [runtime] builtin_size: cannot find values."<=0) - a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + int a_addr=in_builtin_find("a"); + int b_addr=in_builtin_find("b"); if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<=0) - b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b"); if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<=0) - a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + int a_addr=in_builtin_find("a"); + int b_addr=in_builtin_find("b"); if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<=0) - b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b"); if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<=0) - a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + int a_addr=in_builtin_find("a"); + int b_addr=in_builtin_find("b"); if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<=0) - b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b"); if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<=0) - a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + int a_addr=in_builtin_find("a"); + int b_addr=in_builtin_find("b"); if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<=0) - b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b"); if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<=0) - a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + int a_addr=in_builtin_find("a"); if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) { std::cout<<">> [runtime] builtin_not: cannot find values or wrong value type(must be number)."<