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)."<