fixed bug of operator 'and'
This commit is contained in:
parent
9a9277c505
commit
e806b5f0a2
18
nasal_gc.h
18
nasal_gc.h
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue