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)
|
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& 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)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
std::cout<<">> [vm] scalar_and: hash and vector cannot take part in and calculation."<<std::endl;
|
std::cout<<">> [vm] scalar_and: hash and vector cannot take part in and calculation."<<std::endl;
|
||||||
return -1;
|
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)
|
if(b_ref.type==vm_number)
|
||||||
{
|
{
|
||||||
double number=b_ref.get_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)
|
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& 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)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
std::cout<<">> [vm] scalar_or: hash and vector cannot take part in or calculation."<<std::endl;
|
std::cout<<">> [vm] scalar_or: hash and vector cannot take part in or calculation."<<std::endl;
|
||||||
return -1;
|
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.type==vm_number)
|
||||||
{
|
{
|
||||||
if(b_ref.get_number()!=0)
|
if(b_ref.get_number()!=0)
|
||||||
|
|
|
@ -1426,12 +1426,23 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
||||||
else if(calculation_type==ast_and)
|
else if(calculation_type==ast_and)
|
||||||
{
|
{
|
||||||
int left_gc_addr=calculation(node.get_children()[0],local_scope_addr);
|
int left_gc_addr=calculation(node.get_children()[0],local_scope_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);
|
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);
|
ret_address=nasal_scalar_calculator.nasal_scalar_and(left_gc_addr,right_gc_addr);
|
||||||
// delete the reference of temporary values
|
// delete the reference of temporary values
|
||||||
nasal_vm.del_reference(left_gc_addr);
|
nasal_vm.del_reference(left_gc_addr);
|
||||||
nasal_vm.del_reference(right_gc_addr);
|
nasal_vm.del_reference(right_gc_addr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if(calculation_type==ast_or)
|
else if(calculation_type==ast_or)
|
||||||
{
|
{
|
||||||
int left_gc_addr=calculation(node.get_children()[0],local_scope_addr);
|
int left_gc_addr=calculation(node.get_children()[0],local_scope_addr);
|
||||||
|
|
Loading…
Reference in New Issue