bug fixed

This commit is contained in:
Valk Richard Li 2020-09-13 00:53:28 -07:00 committed by GitHub
parent c186662b2f
commit b8c8d89cfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 23 deletions

View File

@ -785,11 +785,6 @@ int nasal_scalar::nasal_scalar_and(int a_scalar_addr,int b_scalar_addr)
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
nasal_vm.add_reference(a_scalar_addr);
return a_scalar_addr;
}
}
else if(a_ref.type==vm_nil)
{
@ -818,11 +813,6 @@ int nasal_scalar::nasal_scalar_and(int a_scalar_addr,int b_scalar_addr)
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
nasal_vm.add_reference(a_scalar_addr);
return a_scalar_addr;
}
}
}
@ -1029,6 +1019,15 @@ int nasal_scalar::nasal_scalar_cmp_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;
@ -1038,8 +1037,10 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
a_num=trans_string_to_number(*(std::string*)a_ref.scalar_ptr);
else
{
std::cout<<">> [vm] scalar_cmp_equal: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<<std::endl;
return -1;
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)0);
return new_value_address;
}
}
if(b_ref.type==vm_number) b_num=*(double*)b_ref.scalar_ptr;
@ -1049,8 +1050,10 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
else
{
std::cout<<">> [vm] scalar_cmp_equal: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<<std::endl;
return -1;
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)0);
return new_value_address;
}
}
int new_value_address=nasal_vm.gc_alloc();
@ -1110,8 +1113,10 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
a_num=trans_string_to_number(*(std::string*)a_ref.scalar_ptr);
else
{
std::cout<<">> [vm] scalar_cmp_equal: "<<*(std::string*)a_ref.scalar_ptr<<" is not a numerable string."<<std::endl;
return -1;
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)1);
return new_value_address;
}
}
if(b_ref.type==vm_number) b_num=*(double*)b_ref.scalar_ptr;
@ -1121,8 +1126,10 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
else
{
std::cout<<">> [vm] scalar_cmp_equal: "<<*(std::string*)b_ref.scalar_ptr<<" is not a numerable string."<<std::endl;
return -1;
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)1);
return new_value_address;
}
}
int new_value_address=nasal_vm.gc_alloc();

View File

@ -1349,11 +1349,16 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
else if(calculation_type==ast_or)
{
int left_gc_addr=calculation(node.get_children()[0],local_scope_addr);
int right_gc_addr=calculation(node.get_children()[1],local_scope_addr);
ret_address=nasal_scalar_calculator.nasal_scalar_or(left_gc_addr,right_gc_addr);
// delete the reference of temporary values
nasal_vm.del_reference(left_gc_addr);
nasal_vm.del_reference(right_gc_addr);
if(check_condition(left_gc_addr))
ret_address=left_gc_addr;
else
{
int right_gc_addr=calculation(node.get_children()[1],local_scope_addr);
ret_address=nasal_scalar_calculator.nasal_scalar_or(left_gc_addr,right_gc_addr);
// delete the reference of temporary values
nasal_vm.del_reference(left_gc_addr);
nasal_vm.del_reference(right_gc_addr);
}
}
else if(calculation_type==ast_unary_not)
{