diff --git a/version3.0/nasal_gc.h b/version3.0/nasal_gc.h index c13173c..6fc9284 100644 --- a/version3.0/nasal_gc.h +++ b/version3.0/nasal_gc.h @@ -58,6 +58,7 @@ public: bool set_type(int); void set_number(double); void set_string(std::string); + // parameter: memory_manager_memory address int nasal_scalar_add(int,int); int nasal_scalar_sub(int,int); int nasal_scalar_mult(int,int); @@ -311,51 +312,444 @@ int nasal_scalar::nasal_scalar_add(int a,int b) } int nasal_scalar::nasal_scalar_sub(int a,int b) { - return -1; + int a_scalar_addr=nasal_vm.mem_get(a); + int b_scalar_addr=nasal_vm.mem_get(b); + if(a_scalar_addr<0 || b_scalar_addr<0) + { + std::cout<<">> [vm] scalar_sub: memory returned an invalid address"<> [vm] scalar_sub: error value type.only number and string can take part in sub."<> [vm] scalar_sub: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_sub: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_mult: memory returned an invalid address"<> [vm] scalar_mult: error value type.only number and string can take part in mult."<> [vm] scalar_mult: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_mult: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_div: memory returned an invalid address"<> [vm] scalar_div: error value type.only number and string can take part in div."<> [vm] scalar_div: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_div: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_link: memory returned an invalid address"<> [vm] scalar_link: error value type.only number and string can take part in link."<> [vm] scalar_unary_sub: memory returned an invalid address"<> [vm] scalar_unary_sub: error value type.only number and string can take part in unary sub."<> [vm] scalar_unary_sub: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_unary_not: memory returned an invalid address"<> [vm] scalar_cmp_equal: memory returned an invalid address"<> [vm] scalar_cmp_not_equal: memory returned an invalid address"<> [vm] scalar_cmp_less: memory returned an invalid address"<> [vm] scalar_cmp_less: error value type.only number and string can take part in cmp_less."<> [vm] scalar_cmp_less: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_less: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_greater: memory returned an invalid address"<> [vm] scalar_cmp_greater: error value type.only number and string can take part in cmp_greater."<> [vm] scalar_cmp_greater: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_greater: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<b_num); + 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(result); + return new_value_address; } int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a,int b) { - return -1; + int a_scalar_addr=nasal_vm.mem_get(a); + int b_scalar_addr=nasal_vm.mem_get(b); + if(a_scalar_addr<0 || b_scalar_addr<0) + { + std::cout<<">> [vm] scalar_cmp_lequal: memory returned an invalid address"<> [vm] scalar_cmp_lequal: error value type.only number and string can take part in cmp_less_or_equal."<> [vm] scalar_cmp_lequal: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_lequal: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_gequal: memory returned an invalid address"<> [vm] scalar_cmp_gequal: error value type.only number and string can take part in cmp_greater_or_equal."<> [vm] scalar_cmp_gequal: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<> [vm] scalar_cmp_gequal: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<=b_num); + 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(result); + return new_value_address; } /*functions of nasal_virtual_machine*/