This commit is contained in:
Valk Richard Li 2020-03-19 19:57:50 +08:00 committed by GitHub
parent c250bfb8d8
commit 89d750e16b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 20 deletions

View File

@ -24,6 +24,7 @@ class nasal_runtime
__memory_overflow, __memory_overflow,
__not_callable_vector, __not_callable_vector,
__not_callable_hash, __not_callable_hash,
__not_callable_function,
__not_numerable_str, __not_numerable_str,
__error_value_type, __error_value_type,
__stack_overflow, __stack_overflow,
@ -83,6 +84,8 @@ void nasal_runtime::error_interrupt(const int type,const int line)
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:
std::cout<<"called a value that is not a hash."<<std::endl;break; std::cout<<"called a value that is not a hash."<<std::endl;break;
case __not_callable_function:
std::cout<<"called a value that is not a function."<<std::endl;break;
case __not_numerable_str: case __not_numerable_str:
std::cout<<"this string is not a numerable one."<<std::endl;break; std::cout<<"this string is not a numerable one."<<std::endl;break;
case __stack_overflow: case __stack_overflow:
@ -1105,38 +1108,30 @@ int nasal_runtime::call_identifier(std::list<std::map<std::string,int> >& local_
{ {
if(nasal_gc.get_scalar(addr).get_type()==scalar_hash) if(nasal_gc.get_scalar(addr).get_type()==scalar_hash)
last_hash_addr=addr; last_hash_addr=addr;
int node_type=iter->get_node_type(); // call vector/special call hash/subvec
if(node_type==__call_vector) // the special type of calling hash like a["name"] is also generated as calling vector
if(iter->get_node_type()==__call_vector)
{ {
// check the scalar type of called identifier here
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,iter->get_node_line()); error_interrupt(__error_value_type,iter->get_node_line());
return -1; return -1;
} }
int data_addr=calculation(local_scope,iter->get_children().front()); if(iter->get_children().front().get_node_type()!=__sub_vector)
if(called_type==scalar_vector)
{ {
; ;
} }
else if(called_type==scalar_hash) else
{ {
int data_addr=calculation(local_scope,iter->get_children().front());
if(nasal_gc.get_scalar(data_addr).get_type()!=scalar_string)
{
error_interrupt(__error_value_type,iter->get_node_line());
return -1;
}
std::string key_str=nasal_gc.get_scalar(data_addr).get_string().get_string();
addr=nasal_gc.get_scalar(addr).get_hash().get_hash_member(key_str);
if(addr<0)
{
error_interrupt(__invalid_hash_member,iter->get_node_line());
return -1;
} }
} }
} // call hash
else if(node_type==__call_hash) // identifier.identifier
else if(iter->get_node_type()==__call_hash)
{ {
if(nasal_gc.get_scalar(addr).get_type()!=scalar_hash) if(nasal_gc.get_scalar(addr).get_type()!=scalar_hash)
{ {
@ -1150,7 +1145,9 @@ int nasal_runtime::call_identifier(std::list<std::map<std::string,int> >& local_
return -1; return -1;
} }
} }
else if(node_type==__call_function) // call function
// identifier(...)
else if(iter->get_node_type()==__call_function)
; ;
} }
// after calculation or assignment/definition,reference counter of this address will -1 // after calculation or assignment/definition,reference counter of this address will -1