update
This commit is contained in:
parent
5531a48c49
commit
e3d3635d49
|
@ -22,6 +22,7 @@ public:
|
||||||
~nasal_vector();
|
~nasal_vector();
|
||||||
void add_elem(int);
|
void add_elem(int);
|
||||||
int del_elem(int);
|
int del_elem(int);
|
||||||
|
int size();
|
||||||
int get_value_address(int);
|
int get_value_address(int);
|
||||||
int get_mem_address(int);
|
int get_mem_address(int);
|
||||||
void deepcopy(nasal_vector&);
|
void deepcopy(nasal_vector&);
|
||||||
|
@ -103,6 +104,8 @@ public:
|
||||||
int nasal_scalar_mult(int,int);
|
int nasal_scalar_mult(int,int);
|
||||||
int nasal_scalar_div(int,int);
|
int nasal_scalar_div(int,int);
|
||||||
int nasal_scalar_link(int,int);
|
int nasal_scalar_link(int,int);
|
||||||
|
int nasal_scalar_and(int,int);
|
||||||
|
int nasal_scalar_or(int,int);
|
||||||
int nasal_scalar_unary_sub(int);
|
int nasal_scalar_unary_sub(int);
|
||||||
int nasal_scalar_unary_not(int);
|
int nasal_scalar_unary_not(int);
|
||||||
int nasal_scalar_cmp_equal(int,int);
|
int nasal_scalar_cmp_equal(int,int);
|
||||||
|
@ -182,6 +185,10 @@ int nasal_vector::del_elem(int index)
|
||||||
elems.pop_back();
|
elems.pop_back();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int nasal_vector::size()
|
||||||
|
{
|
||||||
|
return this->elems.size();
|
||||||
|
}
|
||||||
int nasal_vector::get_value_address(int index)
|
int nasal_vector::get_value_address(int index)
|
||||||
{
|
{
|
||||||
int vec_size=elems.size();
|
int vec_size=elems.size();
|
||||||
|
@ -723,6 +730,30 @@ int nasal_scalar::nasal_scalar_link(int a_scalar_addr,int b_scalar_addr)
|
||||||
nasal_vm.gc_get(new_value_address).set_string(result);
|
nasal_vm.gc_get(new_value_address).set_string(result);
|
||||||
return new_value_address;
|
return new_value_address;
|
||||||
}
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
std::cout<<">> [vm] scalar_and: hash and vector cannot take part in and calculation."<<std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// unfinished
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
std::cout<<">> [vm] scalar_or: hash and vector cannot take part in or calculation."<<std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// unfinished
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
int nasal_scalar::nasal_scalar_unary_sub(int a_scalar_addr)
|
int nasal_scalar::nasal_scalar_unary_sub(int a_scalar_addr)
|
||||||
{
|
{
|
||||||
if(a_scalar_addr<0)
|
if(a_scalar_addr<0)
|
||||||
|
|
|
@ -379,6 +379,11 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
|
||||||
nasal_ast& subvec_node=node.get_children()[i];
|
nasal_ast& subvec_node=node.get_children()[i];
|
||||||
int begin_value_addr=calculation(subvec_node.get_children()[0],local_scope_addr);
|
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 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
|
;// unfinished
|
||||||
nasal_vm.del_reference(begin_value_addr);
|
nasal_vm.del_reference(begin_value_addr);
|
||||||
nasal_vm.del_reference(end_value_addr);
|
nasal_vm.del_reference(end_value_addr);
|
||||||
|
@ -615,6 +620,24 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
||||||
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_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);
|
||||||
|
}
|
||||||
|
else if(calculation_type==ast_or)
|
||||||
|
{
|
||||||
|
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_or(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_unary_not)
|
else if(calculation_type==ast_unary_not)
|
||||||
{
|
{
|
||||||
int addr=calculation(node.get_children()[0],local_scope_addr);
|
int addr=calculation(node.get_children()[0],local_scope_addr);
|
||||||
|
|
Loading…
Reference in New Issue