update
This commit is contained in:
parent
bac775158c
commit
ed35e9a5f3
|
@ -57,6 +57,7 @@ class nasal_vector
|
||||||
public:
|
public:
|
||||||
void set_clear();
|
void set_clear();
|
||||||
void vec_push(int);
|
void vec_push(int);
|
||||||
|
int get_elem(int);
|
||||||
int vec_pop();
|
int vec_pop();
|
||||||
int get_size();
|
int get_size();
|
||||||
void deep_copy(nasal_vector&);
|
void deep_copy(nasal_vector&);
|
||||||
|
@ -376,6 +377,12 @@ void nasal_vector::vec_push(int addr)
|
||||||
nas_array.push_back(addr);
|
nas_array.push_back(addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int nasal_vector::get_elem(int addr)
|
||||||
|
{
|
||||||
|
if(0<=addr && addr<nas_array.size())
|
||||||
|
return nas_array[addr];
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
int nasal_vector::vec_pop()
|
int nasal_vector::vec_pop()
|
||||||
{
|
{
|
||||||
int ret=nas_array.back();
|
int ret=nas_array.back();
|
||||||
|
|
|
@ -18,6 +18,7 @@ class nasal_runtime
|
||||||
__incorrect_head_of_func,
|
__incorrect_head_of_func,
|
||||||
__undefined_identifier,
|
__undefined_identifier,
|
||||||
__multi_assign_incorrect_value_number,
|
__multi_assign_incorrect_value_number,
|
||||||
|
__memory_overflow,
|
||||||
__not_callable_vector,
|
__not_callable_vector,
|
||||||
__not_callable_hash,
|
__not_callable_hash,
|
||||||
__not_numerable_str,
|
__not_numerable_str,
|
||||||
|
@ -67,6 +68,8 @@ void nasal_runtime::error_interrupt(const int type,const int line)
|
||||||
std::cout<<"undefined identifier."<<std::endl;break;
|
std::cout<<"undefined identifier."<<std::endl;break;
|
||||||
case __multi_assign_incorrect_value_number:
|
case __multi_assign_incorrect_value_number:
|
||||||
std::cout<<"numbers of assigned identifiers and values are not the same."<<std::endl;break;
|
std::cout<<"numbers of assigned identifiers and values are not the same."<<std::endl;break;
|
||||||
|
case __memory_overflow:
|
||||||
|
std::cout<<"memory overflow occurred when calling vector or hash."<<std::endl;break;
|
||||||
case __not_callable_vector:
|
case __not_callable_vector:
|
||||||
std::cout<<"called a value that is not a vector."<<std::endl;break;
|
std::cout<<"called a value that is not a vector."<<std::endl;break;
|
||||||
case __not_callable_hash:
|
case __not_callable_hash:
|
||||||
|
@ -504,6 +507,8 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
}
|
}
|
||||||
else if(node_type==__equal)
|
else if(node_type==__equal)
|
||||||
{
|
{
|
||||||
|
// scalar_function needs 'me' changement here
|
||||||
|
// but now it is unfinished
|
||||||
int child_node_type_1=node.get_children().front().get_node_type();
|
int child_node_type_1=node.get_children().front().get_node_type();
|
||||||
int child_node_type_2=node.get_children().back().get_node_type();
|
int child_node_type_2=node.get_children().back().get_node_type();
|
||||||
if(child_node_type_1==__multi_scalar)
|
if(child_node_type_1==__multi_scalar)
|
||||||
|
@ -530,8 +535,43 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
error_interrupt(__multi_assign_incorrect_value_number,node.get_children().back().get_node_line());
|
error_interrupt(__multi_assign_incorrect_value_number,node.get_children().back().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
// multi assignment doesn't have returned value
|
||||||
|
// because multi assignment cannot be used in calculation expression
|
||||||
for(int i=0;i<assigned_addrs.size();++i)
|
for(int i=0;i<assigned_addrs.size();++i)
|
||||||
;
|
{
|
||||||
|
int new_data_addr=-1;
|
||||||
|
switch(nasal_gc.get_scalar(data_addrs[i]).get_type())
|
||||||
|
{
|
||||||
|
case scalar_nil:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_nil);
|
||||||
|
*assigned_addrs[i]=new_data_addr;
|
||||||
|
break;
|
||||||
|
case scalar_number:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_number);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_number().deep_copy(nasal_gc.get_scalar(data_addrs[i]).get_number());
|
||||||
|
*assigned_addrs[i]=new_data_addr;
|
||||||
|
break;
|
||||||
|
case scalar_string:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_string);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_string().deep_copy(nasal_gc.get_scalar(data_addrs[i]).get_string());
|
||||||
|
break;
|
||||||
|
case scalar_function:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_function);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_function().deep_copy(nasal_gc.get_scalar(data_addrs[i]).get_function());
|
||||||
|
break;
|
||||||
|
case scalar_vector:
|
||||||
|
case scalar_hash:
|
||||||
|
*assigned_addrs[i]=data_addrs[i];
|
||||||
|
nasal_gc.reference_add(data_addrs[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<data_addrs.size();++i)
|
||||||
|
nasal_gc.reference_delete(data_addrs[i]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -541,14 +581,53 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
error_interrupt(__error_value_type,node.get_children().back().get_node_line());
|
error_interrupt(__error_value_type,node.get_children().back().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if(nasal_gc.get_scalar(data_addr).get_vector().size()!=assigned_addrs.size())
|
else if(nasal_gc.get_scalar(data_addr).get_vector().get_size()!=assigned_addrs.size())
|
||||||
{
|
{
|
||||||
error_interrupt(__multi_assign_incorrect_value_number,node.get_children().back().get_node_line());
|
error_interrupt(__multi_assign_incorrect_value_number,node.get_children().back().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for(int i=0;i<assigned_addrs.size();++i)
|
for(int i=0;i<assigned_addrs.size();++i)
|
||||||
;
|
{
|
||||||
|
int new_data_addr=-1;
|
||||||
|
int vector_member_addr=nasal_gc.get_scalar(data_addr).get_vector().get_elem(i);
|
||||||
|
if(vector_member_addr<0)
|
||||||
|
{
|
||||||
|
error_interrupt(__memory_overflow,node.get_children().back().get_node_line());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
switch(nasal_gc.get_scalar(vector_member_addr).get_type())
|
||||||
|
{
|
||||||
|
case scalar_nil:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_nil);
|
||||||
|
*assigned_addrs[i]=new_data_addr;
|
||||||
|
break;
|
||||||
|
case scalar_number:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_number);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_number().deep_copy(nasal_gc.get_scalar(vector_member_addr).get_number());
|
||||||
|
*assigned_addrs[i]=new_data_addr;
|
||||||
|
break;
|
||||||
|
case scalar_string:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_string);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_string().deep_copy(nasal_gc.get_scalar(vector_member_addr).get_string());
|
||||||
|
break;
|
||||||
|
case scalar_function:
|
||||||
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_function);
|
||||||
|
nasal_gc.get_scalar(new_data_addr).get_function().deep_copy(nasal_gc.get_scalar(vector_member_addr).get_function());
|
||||||
|
break;
|
||||||
|
case scalar_vector:
|
||||||
|
case scalar_hash:
|
||||||
|
*assigned_addrs[i]=vector_member_addr;
|
||||||
|
nasal_gc.reference_add(vector_member_addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nasal_gc.reference_delete(data_addr);
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -564,7 +643,6 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
case scalar_nil:
|
case scalar_nil:
|
||||||
new_data_addr=nasal_gc.gc_alloc();
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(new_data_addr).set_type(scalar_nil);
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_nil);
|
||||||
nasal_gc.reference_delete(data_addr);
|
|
||||||
*assigned_addr=new_data_addr;
|
*assigned_addr=new_data_addr;
|
||||||
nasal_gc.reference_add(new_data_addr);
|
nasal_gc.reference_add(new_data_addr);
|
||||||
ret_addr=new_data_addr;
|
ret_addr=new_data_addr;
|
||||||
|
@ -573,7 +651,6 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
new_data_addr=nasal_gc.gc_alloc();
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(new_data_addr).set_type(scalar_number);
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_number);
|
||||||
nasal_gc.get_scalar(new_data_addr).get_number().deep_copy(nasal_gc.get_scalar(data_addr).get_number());
|
nasal_gc.get_scalar(new_data_addr).get_number().deep_copy(nasal_gc.get_scalar(data_addr).get_number());
|
||||||
nasal_gc.reference_delete(data_addr);
|
|
||||||
*assigned_addr=new_data_addr;
|
*assigned_addr=new_data_addr;
|
||||||
nasal_gc.reference_add(new_data_addr);
|
nasal_gc.reference_add(new_data_addr);
|
||||||
ret_addr=new_data_addr;
|
ret_addr=new_data_addr;
|
||||||
|
@ -582,7 +659,6 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
new_data_addr=nasal_gc.gc_alloc();
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(new_data_addr).set_type(scalar_string);
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_string);
|
||||||
nasal_gc.get_scalar(new_data_addr).get_string().deep_copy(nasal_gc.get_scalar(data_addr).get_string());
|
nasal_gc.get_scalar(new_data_addr).get_string().deep_copy(nasal_gc.get_scalar(data_addr).get_string());
|
||||||
nasal_gc.reference_delete(data_addr);
|
|
||||||
*assigned_addr=new_data_addr;
|
*assigned_addr=new_data_addr;
|
||||||
nasal_gc.reference_add(new_data_addr);
|
nasal_gc.reference_add(new_data_addr);
|
||||||
ret_addr=new_data_addr;
|
ret_addr=new_data_addr;
|
||||||
|
@ -591,7 +667,6 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
new_data_addr=nasal_gc.gc_alloc();
|
new_data_addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(new_data_addr).set_type(scalar_function);
|
nasal_gc.get_scalar(new_data_addr).set_type(scalar_function);
|
||||||
nasal_gc.get_scalar(new_data_addr).get_function().deep_copy(nasal_gc.get_scalar(data_addr).get_function());
|
nasal_gc.get_scalar(new_data_addr).get_function().deep_copy(nasal_gc.get_scalar(data_addr).get_function());
|
||||||
nasal_gc.reference_delete(data_addr);
|
|
||||||
*assigned_addr=new_data_addr;
|
*assigned_addr=new_data_addr;
|
||||||
nasal_gc.reference_add(new_data_addr);
|
nasal_gc.reference_add(new_data_addr);
|
||||||
ret_addr=new_data_addr;
|
ret_addr=new_data_addr;
|
||||||
|
@ -603,6 +678,7 @@ int nasal_runtime::calculation(std::list<std::map<std::string,int> >& local_scop
|
||||||
ret_addr=data_addr;
|
ret_addr=data_addr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
nasal_gc.reference_delete(data_addr);
|
||||||
return ret_addr;
|
return ret_addr;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue