fixed bug of operator 'and'

This commit is contained in:
Valk Richard Li 2020-10-25 22:44:34 +08:00
parent 9a9277c505
commit e806b5f0a2
2 changed files with 30 additions and 9 deletions

View File

@ -824,8 +824,7 @@ int nasal_scalar::nasal_scalar_link(int a_scalar_addr,int b_scalar_addr)
int nasal_scalar::nasal_scalar_and(int a_scalar_addr,int b_scalar_addr)
{
nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
if(a_ref.type==vm_hash || a_ref.type==vm_vector || a_ref.type==vm_function || b_ref.type==vm_hash || b_ref.type==vm_vector || b_ref.type==vm_function)
if(a_ref.type==vm_hash || a_ref.type==vm_vector || a_ref.type==vm_function)
{
std::cout<<">> [vm] scalar_and: hash and vector cannot take part in and calculation."<<std::endl;
return -1;
@ -871,6 +870,12 @@ int nasal_scalar::nasal_scalar_and(int a_scalar_addr,int b_scalar_addr)
}
}
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
if(b_ref.type==vm_hash || b_ref.type==vm_vector || b_ref.type==vm_function)
{
std::cout<<">> [vm] scalar_and: hash and vector cannot take part in and calculation."<<std::endl;
return -1;
}
if(b_ref.type==vm_number)
{
double number=b_ref.get_number();
@ -930,8 +935,7 @@ int nasal_scalar::nasal_scalar_and(int a_scalar_addr,int b_scalar_addr)
int nasal_scalar::nasal_scalar_or(int a_scalar_addr,int b_scalar_addr)
{
nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
if(a_ref.type==vm_hash || a_ref.type==vm_vector || a_ref.type==vm_function || b_ref.type==vm_hash || b_ref.type==vm_vector || b_ref.type==vm_function)
if(a_ref.type==vm_hash || a_ref.type==vm_vector || a_ref.type==vm_function)
{
std::cout<<">> [vm] scalar_or: hash and vector cannot take part in or calculation."<<std::endl;
return -1;
@ -954,6 +958,12 @@ int nasal_scalar::nasal_scalar_or(int a_scalar_addr,int b_scalar_addr)
}
}
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
if(b_ref.type==vm_hash || b_ref.type==vm_vector || b_ref.type==vm_function)
{
std::cout<<">> [vm] scalar_or: hash and vector cannot take part in or calculation."<<std::endl;
return -1;
}
if(b_ref.type==vm_number)
{
if(b_ref.get_number()!=0)

View File

@ -1426,11 +1426,22 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
else if(calculation_type==ast_and)
{
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_and(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))
{
// delete the reference of temporary values
nasal_vm.del_reference(left_gc_addr);
ret_address=nasal_vm.gc_alloc();
nasal_vm.gc_get(ret_address).set_type(vm_number);
nasal_vm.gc_get(ret_address).set_number(0);
}
else
{
int right_gc_addr=calculation(node.get_children()[1],local_scope_addr);
ret_address=nasal_scalar_calculator.nasal_scalar_and(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_or)
{