This commit is contained in:
Valk Richard Li 2020-07-31 03:49:56 -07:00 committed by GitHub
parent 759bcdafa8
commit 168d9dbc3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 58 additions and 29 deletions

View File

@ -273,8 +273,8 @@ int nasal_scalar::nasal_scalar_add(int a,int b)
std::cout<<">> [vm] scalar_add: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_add: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_add: error value type.only number and string can take part in add."<<std::endl; std::cout<<">> [vm] scalar_add: error value type.only number and string can take part in add."<<std::endl;
@ -319,8 +319,8 @@ int nasal_scalar::nasal_scalar_sub(int a,int b)
std::cout<<">> [vm] scalar_sub: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_sub: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_sub: error value type.only number and string can take part in sub."<<std::endl; std::cout<<">> [vm] scalar_sub: error value type.only number and string can take part in sub."<<std::endl;
@ -365,8 +365,8 @@ int nasal_scalar::nasal_scalar_mult(int a,int b)
std::cout<<">> [vm] scalar_mult: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_mult: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_mult: error value type.only number and string can take part in mult."<<std::endl; std::cout<<">> [vm] scalar_mult: error value type.only number and string can take part in mult."<<std::endl;
@ -411,8 +411,8 @@ int nasal_scalar::nasal_scalar_div(int a,int b)
std::cout<<">> [vm] scalar_div: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_div: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_div: error value type.only number and string can take part in div."<<std::endl; std::cout<<">> [vm] scalar_div: error value type.only number and string can take part in div."<<std::endl;
@ -457,8 +457,8 @@ int nasal_scalar::nasal_scalar_link(int a,int b)
std::cout<<">> [vm] scalar_link: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_link: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_link: error value type.only number and string can take part in link."<<std::endl; std::cout<<">> [vm] scalar_link: error value type.only number and string can take part in link."<<std::endl;
@ -482,7 +482,7 @@ int nasal_scalar::nasal_scalar_unary_sub(int a)
std::cout<<">> [vm] scalar_unary_sub: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_unary_sub: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
if(a_ref.type!=vm_number && a_ref.type!=vm_string) if(a_ref.type!=vm_number && a_ref.type!=vm_string)
{ {
std::cout<<">> [vm] scalar_unary_sub: error value type.only number and string can take part in unary sub."<<std::endl; std::cout<<">> [vm] scalar_unary_sub: error value type.only number and string can take part in unary sub."<<std::endl;
@ -513,11 +513,40 @@ int nasal_scalar::nasal_scalar_unary_not(int a)
std::cout<<">> [vm] scalar_unary_not: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_unary_not: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
//unfinished nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
int new_value_address=-1;
if(a_ref.type==vm_nil)
{
return -1; 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(1);
}
else if(a_ref.type==vm_number)
{
double number=(double)(*(double*)(a_ref.scalar_ptr)==0);
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(number);
}
else if(a_ref.type==vm_string)
{
if(check_numerable_string(*(std::string*)a_ref.scalar_ptr))
{
double number=(double)(trans_string_to_number(*(std::string*)a_ref.scalar_ptr)==0);
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(number);
}
else
{
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(!(*(std::string*)a_ref.scalar_ptr).length());
}
}
else
std::cout<<">> [vm] scalar_unary_not: error value type.number,string and nil can take part in unary not."<<std::endl;
return new_value_address;
} }
int nasal_scalar::nasal_scalar_cmp_equal(int a,int b) int nasal_scalar::nasal_scalar_cmp_equal(int a,int b)
{ {
@ -535,8 +564,8 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a,int b)
nasal_vm.gc_get(new_value_address).set_number(1); nasal_vm.gc_get(new_value_address).set_number(1);
return new_value_address; return new_value_address;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
//unfinished //unfinished
@ -559,12 +588,12 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a,int b)
nasal_vm.gc_get(new_value_address).set_number(0); nasal_vm.gc_get(new_value_address).set_number(0);
return new_value_address; return new_value_address;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
//unfinished //unfinished
return -1; return -1;
} }
int nasal_scalar::nasal_scalar_cmp_less(int a,int b) int nasal_scalar::nasal_scalar_cmp_less(int a,int b)
@ -576,8 +605,8 @@ int nasal_scalar::nasal_scalar_cmp_less(int a,int b)
std::cout<<">> [vm] scalar_cmp_less: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_cmp_less: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_cmp_less: error value type.only number and string can take part in cmp_less."<<std::endl; std::cout<<">> [vm] scalar_cmp_less: error value type.only number and string can take part in cmp_less."<<std::endl;
@ -622,8 +651,8 @@ int nasal_scalar::nasal_scalar_cmp_greater(int a,int b)
std::cout<<">> [vm] scalar_cmp_greater: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_cmp_greater: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_cmp_greater: error value type.only number and string can take part in cmp_greater."<<std::endl; std::cout<<">> [vm] scalar_cmp_greater: error value type.only number and string can take part in cmp_greater."<<std::endl;
@ -668,8 +697,8 @@ int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a,int b)
std::cout<<">> [vm] scalar_cmp_lequal: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_cmp_lequal: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_cmp_lequal: error value type.only number and string can take part in cmp_less_or_equal."<<std::endl; std::cout<<">> [vm] scalar_cmp_lequal: error value type.only number and string can take part in cmp_less_or_equal."<<std::endl;
@ -714,8 +743,8 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a,int b)
std::cout<<">> [vm] scalar_cmp_gequal: memory returned an invalid address"<<std::endl; std::cout<<">> [vm] scalar_cmp_gequal: memory returned an invalid address"<<std::endl;
return -1; return -1;
} }
nasal_scalar& a_ref=nasal_vm.gc_get(a); nasal_scalar& a_ref=nasal_vm.gc_get(a_scalar_addr);
nasal_scalar& b_ref=nasal_vm.gc_get(b); nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
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_number && a_ref.type!=vm_string)||(b_ref.type!=vm_number && b_ref.type!=vm_string))
{ {
std::cout<<">> [vm] scalar_cmp_gequal: error value type.only number and string can take part in cmp_greater_or_equal."<<std::endl; std::cout<<">> [vm] scalar_cmp_gequal: error value type.only number and string can take part in cmp_greater_or_equal."<<std::endl;