update
This commit is contained in:
parent
a55c6aae1b
commit
98eb5d9000
|
@ -51,9 +51,9 @@ class nasal_runtime
|
||||||
};
|
};
|
||||||
int runtime_error_exit_mark;
|
int runtime_error_exit_mark;
|
||||||
void error_interrupt (const int,const int);
|
void error_interrupt (const int,const int);
|
||||||
int number_generation (abstract_syntax_tree&);
|
int number_generation (abstract_syntax_tree&);// checked
|
||||||
int string_generation (abstract_syntax_tree&);
|
int string_generation (abstract_syntax_tree&);// checked
|
||||||
int vector_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
int vector_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);//checked
|
||||||
int hash_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
int hash_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
||||||
int function_generation(std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
int function_generation(std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
||||||
bool check_condition (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
bool check_condition (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
|
||||||
|
@ -164,22 +164,17 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||||
{
|
{
|
||||||
int var_type=i->get_node_type();
|
int var_type=i->get_node_type();
|
||||||
if(var_type==__number)
|
if(var_type==__number) nasal_gc.get_scalar(addr).get_vector().vec_push(number_generation(*i));
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(number_generation(*i));
|
else if(var_type==__string) nasal_gc.get_scalar(addr).get_vector().vec_push(string_generation(*i));
|
||||||
else if(var_type==__string)
|
else if(var_type==__id) nasal_gc.get_scalar(addr).get_vector().vec_push(call_identifier(local_scope,*i));
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(string_generation(*i));
|
else if(var_type==__vector) nasal_gc.get_scalar(addr).get_vector().vec_push(vector_generation(local_scope,*i));
|
||||||
else if(var_type==__vector)
|
else if(var_type==__hash) nasal_gc.get_scalar(addr).get_vector().vec_push(hash_generation(local_scope,*i));
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(vector_generation(local_scope,*i));
|
else if(var_type==__function) nasal_gc.get_scalar(addr).get_vector().vec_push(function_generation(local_scope,*i));
|
||||||
else if(var_type==__hash)
|
else if(var_type==__id) nasal_gc.get_scalar(addr).get_vector().vec_push(call_identifier(local_scope,*i));
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(hash_generation(local_scope,*i));
|
else if(var_type==__add_operator || var_type==__sub_operator || var_type==__mul_operator || var_type==__div_operator || var_type==__link_operator
|
||||||
else if(var_type==__function)
|
|| var_type==__cmp_equal || var_type==__cmp_less || var_type==__cmp_more || var_type==__cmp_not_equal || var_type==__cmp_less_or_equal || var_type==__cmp_more_or_equal
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(function_generation(local_scope,*i));
|
|| var_type==__and_operator || var_type==__or_operator || var_type==__ques_mark
|
||||||
else if(var_type==__id)
|
|| var_type==__equal || var_type==__add_equal || var_type==__sub_equal || var_type==__div_equal || var_type==__mul_equal || var_type==__link_equal)
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(call_identifier(local_scope,*i));
|
|
||||||
else if(var_type==__add_operator || var_type==__sub_operator || var_type==__mul_operator || var_type==__div_operator || var_type==__link_operator ||
|
|
||||||
var_type==__cmp_equal || var_type==__cmp_less || var_type==__cmp_more || var_type==__cmp_not_equal || var_type==__cmp_less_or_equal || var_type==__cmp_more_or_equal ||
|
|
||||||
var_type==__and_operator || var_type==__or_operator || var_type==__ques_mark ||
|
|
||||||
var_type==__equal || var_type==__add_equal || var_type==__sub_equal || var_type==__div_equal || var_type==__mul_equal || var_type==__link_equal)
|
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(calculation(local_scope,*i));
|
nasal_gc.get_scalar(addr).get_vector().vec_push(calculation(local_scope,*i));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -191,7 +186,13 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
for(;call_node!=node.get_children().end();++call_node)
|
for(;call_node!=node.get_children().end();++call_node)
|
||||||
{
|
{
|
||||||
if(nasal_gc.get_scalar(addr).get_type()==scalar_hash)
|
if(nasal_gc.get_scalar(addr).get_type()==scalar_hash)
|
||||||
|
{
|
||||||
|
int tmp_hash_addr=last_hash_addr;
|
||||||
last_hash_addr=addr;
|
last_hash_addr=addr;
|
||||||
|
nasal_gc.reference_add(last_hash_addr);
|
||||||
|
if(tmp_hash_addr>=0)
|
||||||
|
nasal_gc.reference_delete(tmp_hash_addr);
|
||||||
|
}
|
||||||
// call vector/special call hash/subvec
|
// call vector/special call hash/subvec
|
||||||
// the special type of calling hash like a["name"] is also generated as calling vector
|
// the special type of calling hash like a["name"] is also generated as calling vector
|
||||||
if(call_node->get_node_type()==__call_vector)
|
if(call_node->get_node_type()==__call_vector)
|
||||||
|
@ -200,27 +201,24 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
int called_type=nasal_gc.get_scalar(addr).get_type();
|
int called_type=nasal_gc.get_scalar(addr).get_type();
|
||||||
if(called_type!=scalar_vector && called_type!=scalar_hash)
|
if(called_type!=scalar_vector && called_type!=scalar_hash)
|
||||||
{
|
{
|
||||||
error_interrupt(__error_value_type,call_node->get_node_line());
|
error_interrupt(__error_value_type_when_calling_vector,call_node->get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(call_node->get_children().front().get_node_type()==__sub_vector)
|
if(call_node->get_children().front().get_node_type()==__sub_vector)
|
||||||
{
|
{
|
||||||
if(called_type==scalar_hash)
|
if(called_type!=scalar_vector)
|
||||||
{
|
{
|
||||||
error_interrupt(__not_callable_vector,call_node->get_node_line());
|
error_interrupt(__not_callable_vector,call_node->get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int num1_addr=-1;
|
int num1_addr=-1;int num2_addr=-1;
|
||||||
int num2_addr=-1;
|
if(call_node->get_children().front().get_children().size()==1)// identifier[num1:];
|
||||||
// identifier[num1:];
|
|
||||||
if(call_node->get_children().front().get_children().size()==1)
|
|
||||||
{
|
{
|
||||||
num1_addr=calculation(local_scope,call_node->get_children().front().get_children().front());
|
num1_addr=calculation(local_scope,call_node->get_children().front().get_children().front());
|
||||||
if(num1_addr<0)
|
if(num1_addr<0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
// identifier[num1:num2];
|
else// identifier[num1:num2];
|
||||||
else
|
|
||||||
{
|
{
|
||||||
num1_addr=calculation(local_scope,call_node->get_children().front().get_children().front());
|
num1_addr=calculation(local_scope,call_node->get_children().front().get_children().front());
|
||||||
num2_addr=calculation(local_scope,call_node->get_children().front().get_children().back());
|
num2_addr=calculation(local_scope,call_node->get_children().front().get_children().back());
|
||||||
|
@ -228,24 +226,25 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(nasal_gc.get_scalar(num1_addr).get_type()!=scalar_number
|
if(nasal_gc.get_scalar(num1_addr).get_type()!=scalar_number
|
||||||
&& nasal_gc.get_scalar(num1_addr).get_type()!=scalar_string)
|
&& nasal_gc.get_scalar(num1_addr).get_type()!=scalar_string)
|
||||||
{
|
{
|
||||||
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_children().front().get_node_line());
|
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_children().front().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(num2_addr>=0
|
if(num2_addr>=0
|
||||||
&& (nasal_gc.get_scalar(num2_addr).get_type()!=scalar_number
|
&& (nasal_gc.get_scalar(num2_addr).get_type()!=scalar_number
|
||||||
&& nasal_gc.get_scalar(num2_addr).get_type()!=scalar_string
|
&& nasal_gc.get_scalar(num2_addr).get_type()!=scalar_string
|
||||||
&& nasal_gc.get_scalar(num2_addr).get_type()!=scalar_nil))
|
&& nasal_gc.get_scalar(num2_addr).get_type()!=scalar_nil))
|
||||||
{
|
{
|
||||||
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_children().back().get_node_line());
|
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_children().back().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(nasal_gc.get_scalar(num1_addr).get_type()==scalar_string)
|
if(nasal_gc.get_scalar(num1_addr).get_type()==scalar_string)
|
||||||
{
|
{
|
||||||
if(check_numerable_string(nasal_gc.get_scalar(num1_addr).get_string().get_string()))
|
std::string tmp_str=nasal_gc.get_scalar(num1_addr).get_string().get_string();
|
||||||
|
if(check_numerable_string(tmp_str))
|
||||||
{
|
{
|
||||||
double tmp_num=trans_string_to_number(nasal_gc.get_scalar(num1_addr).get_string().get_string());
|
double tmp_num=trans_string_to_number(tmp_str);
|
||||||
if(tmp_num<0)
|
if(tmp_num<0)
|
||||||
{
|
{
|
||||||
error_interrupt(__special_call_vector_negative_value,call_node->get_children().front().get_children().front().get_node_line());
|
error_interrupt(__special_call_vector_negative_value,call_node->get_children().front().get_children().front().get_node_line());
|
||||||
|
@ -298,7 +297,7 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
if(num2_addr<0 || nasal_gc.get_scalar(num2_addr).get_type()==scalar_nil)
|
if(num2_addr<0 || nasal_gc.get_scalar(num2_addr).get_type()==scalar_nil)
|
||||||
end_num=nasal_gc.get_scalar(addr).get_vector().get_size();
|
end_num=nasal_gc.get_scalar(addr).get_vector().get_size();
|
||||||
else
|
else
|
||||||
end_num=(int)nasal_gc.get_scalar(num2_addr).get_number().get_number();
|
end_num=1+(int)nasal_gc.get_scalar(num2_addr).get_number().get_number();
|
||||||
if(num1_addr>=0)
|
if(num1_addr>=0)
|
||||||
nasal_gc.reference_delete(num1_addr);
|
nasal_gc.reference_delete(num1_addr);
|
||||||
if(num2_addr>=0)
|
if(num2_addr>=0)
|
||||||
|
@ -306,7 +305,6 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
std::vector<int> subvec_result;
|
std::vector<int> subvec_result;
|
||||||
for(int i=begin_num;i<end_num;++i)
|
for(int i=begin_num;i<end_num;++i)
|
||||||
{
|
{
|
||||||
// addr used here
|
|
||||||
int tmp_data_addr=nasal_gc.get_scalar(addr).get_vector().get_elem(i);
|
int tmp_data_addr=nasal_gc.get_scalar(addr).get_vector().get_elem(i);
|
||||||
int new_addr=-1;
|
int new_addr=-1;
|
||||||
if(tmp_data_addr<0)
|
if(tmp_data_addr<0)
|
||||||
|
@ -344,22 +342,27 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
nasal_gc.reference_delete(tmp_data_addr);
|
nasal_gc.reference_delete(tmp_data_addr);
|
||||||
subvec_result.push_back(new_addr);
|
subvec_result.push_back(new_addr);
|
||||||
}
|
}
|
||||||
|
// delete the reference of the last addr and give the new address to addr
|
||||||
int tmp_addr=addr;
|
int tmp_addr=addr;
|
||||||
addr=nasal_gc.gc_alloc();
|
addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(addr).set_type(scalar_vector);
|
nasal_gc.get_scalar(addr).set_type(scalar_vector);
|
||||||
for(int i=0;i<subvec_result.size();++i)
|
for(int i=0;i<subvec_result.size();++i)
|
||||||
nasal_gc.get_scalar(addr).get_vector().vec_push(subvec_result[i]);
|
nasal_gc.get_scalar(addr).get_vector().vec_push(subvec_result[i]);
|
||||||
nasal_gc.reference_delete(tmp_addr);
|
nasal_gc.reference_delete(tmp_addr);
|
||||||
}// end sub-vector
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// normal vector/hash calling
|
// vec[number] | hash["str"]
|
||||||
int data_addr=calculation(local_scope,call_node->get_children().front());
|
int data_addr=calculation(local_scope,call_node->get_children().front());
|
||||||
if(data_addr<0)
|
if(data_addr<0)
|
||||||
return -1;
|
return -1;
|
||||||
if(nasal_gc.get_scalar(data_addr).get_type()!=scalar_number && nasal_gc.get_scalar(data_addr).get_type()!=scalar_string)
|
if(nasal_gc.get_scalar(data_addr).get_type()!=scalar_number
|
||||||
|
&& nasal_gc.get_scalar(data_addr).get_type()!=scalar_string)
|
||||||
{
|
{
|
||||||
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_node_line());
|
if(called_type==scalar_vector)
|
||||||
|
error_interrupt(__error_value_type_when_calling_vector,call_node->get_children().front().get_node_line());
|
||||||
|
else
|
||||||
|
error_interrupt(__error_value_type_when_calling_hash,call_node->get_children().front().get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(called_type==scalar_vector)
|
if(called_type==scalar_vector)
|
||||||
|
@ -392,13 +395,13 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
}
|
}
|
||||||
else if(called_type==scalar_hash)
|
else if(called_type==scalar_hash)
|
||||||
{
|
{
|
||||||
if(nasal_gc.get_scalar(data_addr).get_type()!=scalar_string)
|
std::string member_name;
|
||||||
{
|
if(nasal_gc.get_scalar(data_addr).get_type()==scalar_number)
|
||||||
error_interrupt(__error_value_type_when_calling_hash,call_node->get_children().front().get_node_line());
|
member_name=trans_number_to_string(nasal_gc.get_scalar(data_addr).get_number().get_number());
|
||||||
return -1;
|
else
|
||||||
}
|
member_name=nasal_gc.get_scalar(data_addr).get_string().get_string();
|
||||||
int tmp_addr=addr;
|
int tmp_addr=addr;
|
||||||
addr=nasal_gc.get_scalar(addr).get_hash().get_hash_member(nasal_gc.get_scalar(data_addr).get_string().get_string());
|
addr=nasal_gc.get_scalar(addr).get_hash().get_hash_member(member_name);
|
||||||
if(addr<0)
|
if(addr<0)
|
||||||
{
|
{
|
||||||
error_interrupt(__invalid_hash_member,call_node->get_children().front().get_node_line());
|
error_interrupt(__invalid_hash_member,call_node->get_children().front().get_node_line());
|
||||||
|
@ -409,7 +412,7 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
}
|
}
|
||||||
nasal_gc.reference_delete(data_addr);
|
nasal_gc.reference_delete(data_addr);
|
||||||
}
|
}
|
||||||
}// end call vector
|
}
|
||||||
// call hash identifier.identifier
|
// call hash identifier.identifier
|
||||||
else if(call_node->get_node_type()==__call_hash)
|
else if(call_node->get_node_type()==__call_hash)
|
||||||
{
|
{
|
||||||
|
@ -418,13 +421,15 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
error_interrupt(__not_callable_hash,call_node->get_node_line());
|
error_interrupt(__not_callable_hash,call_node->get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
int tmp_addr=addr;
|
||||||
addr=nasal_gc.get_scalar(addr).get_hash().get_hash_member(call_node->get_var_name());
|
addr=nasal_gc.get_scalar(addr).get_hash().get_hash_member(call_node->get_var_name());
|
||||||
if(addr<0)
|
if(addr<0)
|
||||||
{
|
{
|
||||||
error_interrupt(__invalid_hash_member,call_node->get_node_line());
|
error_interrupt(__invalid_hash_member,call_node->get_node_line());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}// end call hash
|
nasal_gc.reference_delete(tmp_addr);
|
||||||
|
}
|
||||||
// call function identifier(...)
|
// call function identifier(...)
|
||||||
else if(call_node->get_node_type()==__call_function)
|
else if(call_node->get_node_type()==__call_function)
|
||||||
{
|
{
|
||||||
|
@ -442,6 +447,7 @@ int nasal_runtime::vector_generation(std::list<std::map<std::string,int> >& loca
|
||||||
last_hash_addr);
|
last_hash_addr);
|
||||||
if(addr<0)
|
if(addr<0)
|
||||||
return -1;
|
return -1;
|
||||||
|
nasal_gc.reference_delete(tmp_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return addr;
|
return addr;
|
||||||
|
@ -450,9 +456,6 @@ int nasal_runtime::hash_generation(std::list<std::map<std::string,int> >& local_
|
||||||
{
|
{
|
||||||
int addr=nasal_gc.gc_alloc();
|
int addr=nasal_gc.gc_alloc();
|
||||||
nasal_gc.get_scalar(addr).set_type(scalar_hash);
|
nasal_gc.get_scalar(addr).set_type(scalar_hash);
|
||||||
// self address must be set here
|
|
||||||
// if not,then 'me' in function-type member will not get a correct address
|
|
||||||
nasal_gc.get_scalar(addr).get_hash().set_self_addr(addr);
|
|
||||||
std::list<abstract_syntax_tree>::iterator call_node=node.get_children().end();
|
std::list<abstract_syntax_tree>::iterator call_node=node.get_children().end();
|
||||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||||
{
|
{
|
||||||
|
@ -472,16 +475,18 @@ int nasal_runtime::hash_generation(std::list<std::map<std::string,int> >& local_
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,number_generation(*i));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,number_generation(*i));
|
||||||
else if(var_type==__string)
|
else if(var_type==__string)
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,string_generation(*i));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,string_generation(*i));
|
||||||
|
else if(var_type==__id)
|
||||||
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,call_identifier(local_scope,*i));
|
||||||
else if(var_type==__vector)
|
else if(var_type==__vector)
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,vector_generation(local_scope,*i));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,vector_generation(local_scope,*i));
|
||||||
else if(var_type==__hash)
|
else if(var_type==__hash)
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,hash_generation(local_scope,*i));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,hash_generation(local_scope,*i));
|
||||||
else if(var_type==__function)
|
else if(var_type==__function)
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,function_generation(local_scope,i->get_children().back()));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,function_generation(local_scope,i->get_children().back()));
|
||||||
else if(var_type==__add_operator || var_type==__sub_operator || var_type==__mul_operator || var_type==__div_operator || var_type==__link_operator ||
|
else if(var_type==__add_operator || var_type==__sub_operator || var_type==__mul_operator || var_type==__div_operator || var_type==__link_operator
|
||||||
var_type==__cmp_equal || var_type==__cmp_less || var_type==__cmp_more || var_type==__cmp_not_equal || var_type==__cmp_less_or_equal || var_type==__cmp_more_or_equal ||
|
|| var_type==__cmp_equal || var_type==__cmp_less || var_type==__cmp_more || var_type==__cmp_not_equal || var_type==__cmp_less_or_equal || var_type==__cmp_more_or_equal
|
||||||
var_type==__and_operator || var_type==__or_operator || var_type==__ques_mark ||
|
|| var_type==__and_operator || var_type==__or_operator || var_type==__ques_mark
|
||||||
var_type==__equal || var_type==__add_equal || var_type==__sub_equal || var_type==__div_equal || var_type==__mul_equal || var_type==__link_equal)
|
|| var_type==__equal || var_type==__add_equal || var_type==__sub_equal || var_type==__div_equal || var_type==__mul_equal || var_type==__link_equal)
|
||||||
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,calculation(local_scope,*i));
|
nasal_gc.get_scalar(addr).get_hash().hash_push(member_name,calculation(local_scope,*i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue