From bd5a0b7d6e1816ed253b6bbe05d2ebf45099dfe5 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Fri, 18 Sep 2020 08:46:15 -0700 Subject: [PATCH] update --- version3.0/lib.nas | 24 +++++++ version3.0/nasal_builtin.h | 125 +++++++++++++++++++++++++++++++++++++ version3.0/nasal_runtime.h | 19 +++++- 3 files changed, 166 insertions(+), 2 deletions(-) diff --git a/version3.0/lib.nas b/version3.0/lib.nas index bcf9de4..612e1b9 100644 --- a/version3.0/lib.nas +++ b/version3.0/lib.nas @@ -71,4 +71,28 @@ var io= nasal_call_builtin_foutput(filename,str); return; } +}; + +var bits= +{ + bitxor:func(a,b) + { + return nasal_call_builtin_xor(a,b); + }, + bitand:func(a,b) + { + return nasal_call_builtin_and(a,b); + }, + bitor:func(a,b) + { + return nasal_call_builtin_or(a,b); + }, + bitnand:func(a,b) + { + return nasal_call_builtin_nand(a,b); + }, + bitnot:func(a) + { + return nasal_call_builtin_not(a); + } }; \ No newline at end of file diff --git a/version3.0/nasal_builtin.h b/version3.0/nasal_builtin.h index 8039a19..f33bbc5 100644 --- a/version3.0/nasal_builtin.h +++ b/version3.0/nasal_builtin.h @@ -479,4 +479,129 @@ int nasal_runtime::builtin_size(int local_scope_addr) } return ret_addr; } +int nasal_runtime::builtin_xor(int local_scope_addr) +{ + int a_addr=-1; + if(local_scope_addr>=0) + a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a"); + 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"); + 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"); + 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"); + 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"); + 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)."<