This commit is contained in:
Valk Richard Li 2020-09-04 04:02:48 -07:00 committed by GitHub
parent e3d3635d49
commit 8dc8e9c29a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 149 additions and 11 deletions

View File

@ -734,25 +734,167 @@ 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 || b_ref.type==vm_hash || b_ref.type==vm_vector)
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;
return -1;
}
// unfinished
return -1;
if(a_ref.type==vm_number)
{
double number=a_ref.get_number();
if(number==0)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
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)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else if(a_ref.type==vm_string)
{
std::string str=a_ref.get_string();
if(!str.length() || !check_numerable_string(str))
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
double number=trans_string_to_number(str);
if(number==0)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
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;
}
}
}
if(b_ref.type==vm_number)
{
double number=b_ref.get_number();
if(number==0)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
nasal_vm.add_reference(b_scalar_addr);
return b_scalar_addr;
}
}
else if(b_ref.type==vm_nil)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else if(b_ref.type==vm_string)
{
std::string str=b_ref.get_string();
if(!str.length() || !check_numerable_string(str))
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
double number=trans_string_to_number(str);
if(number==0)
{
int new_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_value_addr).set_type(vm_number);
nasal_vm.gc_get(new_value_addr).set_number(0);
return new_value_addr;
}
else
{
nasal_vm.add_reference(b_scalar_addr);
return b_scalar_addr;
}
}
}
int false_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(false_value_addr).set_type(vm_number);
nasal_vm.gc_get(false_value_addr).set_number(0);
return false_value_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 || b_ref.type==vm_hash || b_ref.type==vm_vector)
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;
return -1;
}
// unfinished
return -1;
if(a_ref.type==vm_number)
{
if(a_ref.get_number()!=0)
{
nasal_vm.add_reference(a_scalar_addr);
return a_scalar_addr;
}
}
else if(a_ref.type==vm_string)
{
std::string str=a_ref.get_string();
if(str.length() && (!check_numerable_string(str) || trans_string_to_number(str)!=0))
{
nasal_vm.add_reference(a_scalar_addr);
return a_scalar_addr;
}
}
if(b_ref.type==vm_number)
{
if(b_ref.get_number()!=0)
{
nasal_vm.add_reference(b_scalar_addr);
return b_scalar_addr;
}
}
else if(b_ref.type==vm_string)
{
std::string str=b_ref.get_string();
if(str.length() && (!check_numerable_string(str) || trans_string_to_number(str)!=0))
{
nasal_vm.add_reference(b_scalar_addr);
return b_scalar_addr;
}
}
int false_value_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(false_value_addr).set_type(vm_number);
nasal_vm.gc_get(false_value_addr).set_number(0);
return false_value_addr;
}
int nasal_scalar::nasal_scalar_unary_sub(int a_scalar_addr)
{

View File

@ -379,11 +379,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
nasal_ast& subvec_node=node.get_children()[i];
int begin_value_addr=calculation(subvec_node.get_children()[0],local_scope_addr);
int end_value_addr=calculation(subvec_node.get_children()[1],local_scope_addr);
int begin_index,end_index;
if(nasal_vm.gc_get(begin_value_addr).get_type()==vm_nil)
begin_index=0;
if(nasal_vm.gc_get(end_value_addr).get_type()==vm_nil)
end_index=reference_value.size()-1;
;// unfinished
nasal_vm.del_reference(begin_value_addr);
nasal_vm.del_reference(end_value_addr);