forked from xxq250/Nasal-Interpreter
update
This commit is contained in:
+40
-192
@@ -4,42 +4,42 @@
|
||||
std::string inline_func_name[nas_lib_func_num]=
|
||||
{
|
||||
//base.nas
|
||||
"nasal_call_inline_push_back",// append
|
||||
"nasal_call_inline_set_size", // setsize
|
||||
"nasal_call_inline_subvec",
|
||||
"nasal_call_inline_contains",
|
||||
"nasal_call_inline_delete",
|
||||
"nasal_call_inline_trans_int",
|
||||
"nasal_call_inline_trans_num",
|
||||
"nasal_call_inline_get_keys",
|
||||
"nasal_call_inline_pop_back",
|
||||
"nasal_call_inline_sizeof",
|
||||
"nasal_call_inline_str_cmp_equal",
|
||||
"nasal_call_inline_cmp",
|
||||
"nasal_call_inline_cpp_sort",
|
||||
"nasal_call_inline_substr",
|
||||
"nasal_call_inline_sprintf",
|
||||
"nasal_call_inline_find_first_occur",
|
||||
"nasal_call_inline_split",
|
||||
"nasal_call_inline_rand",
|
||||
"nasal_call_inline_get_id",
|
||||
"nasal_call_builtin_push_back",// append
|
||||
"nasal_call_builtin_set_size", // setsize
|
||||
"nasal_call_builtin_subvec",
|
||||
"nasal_call_builtin_contains",
|
||||
"nasal_call_builtin_delete",
|
||||
"nasal_call_builtin_trans_int",
|
||||
"nasal_call_builtin_trans_num",
|
||||
"nasal_call_builtin_get_keys",
|
||||
"nasal_call_builtin_pop_back",
|
||||
"nasal_call_builtin_sizeof",
|
||||
"nasal_call_builtin_str_cmp_equal",
|
||||
"nasal_call_builtin_cmp",
|
||||
"nasal_call_builtin_cpp_sort",
|
||||
"nasal_call_builtin_substr",
|
||||
"nasal_call_builtin_sprintf",
|
||||
"nasal_call_builtin_find_first_occur",
|
||||
"nasal_call_builtin_split",
|
||||
"nasal_call_builtin_rand",
|
||||
"nasal_call_builtin_get_id",
|
||||
//bits.nas
|
||||
"nasal_call_built_in_bitcalc",
|
||||
"nasal_call_built_in_sbitcalc",
|
||||
"nasal_call_built_in_setbit",
|
||||
"nasal_call_built_in_null_string_gen",
|
||||
"nasal_call_builtin_bitcalc",
|
||||
"nasal_call_builtin_sbitcalc",
|
||||
"nasal_call_builtin_setbit",
|
||||
"nasal_call_builtin_null_string_gen",
|
||||
//io.nas
|
||||
"nasal_call_inline_c_std_puts",// print
|
||||
"nasal_call_builtin_c_std_puts",// print
|
||||
//math.nas
|
||||
"nasal_call_inline_sin",
|
||||
"nasal_call_inline_cos",
|
||||
"nasal_call_inline_tan",
|
||||
"nasal_call_inline_pow",
|
||||
"nasal_call_inline_cpp_math_ln",
|
||||
"nasal_call_inline_cpp_math_sqrt",
|
||||
"nasal_call_inline_cpp_atan2",
|
||||
"nasal_call_builtin_sin",
|
||||
"nasal_call_builtin_cos",
|
||||
"nasal_call_builtin_tan",
|
||||
"nasal_call_builtin_pow",
|
||||
"nasal_call_builtin_cpp_math_ln",
|
||||
"nasal_call_builtin_cpp_math_sqrt",
|
||||
"nasal_call_builtin_cpp_atan2",
|
||||
//system.nas
|
||||
"nasal_call_inline_scalar_type"//system.type
|
||||
"nasal_call_builtin_scalar_type"//system.type
|
||||
};
|
||||
|
||||
class nasal_runtime
|
||||
@@ -3000,166 +3000,14 @@ int nasal_runtime::func_proc(
|
||||
int nasal_runtime::builtin_function(std::list<std::map<std::string,int> >& local_scope,std::string func_name)
|
||||
{
|
||||
int ret_addr=-1;
|
||||
if(func_name=="nasal_call_inline_push_back")
|
||||
{
|
||||
// append
|
||||
int vector_addr=-1;
|
||||
int elements_addr=-1;
|
||||
for(std::list<std::map<std::string,int> >::iterator i=local_scope.begin();i!=local_scope.end();++i)
|
||||
{
|
||||
if(i->find("vector")!=i->end())
|
||||
vector_addr=(*i)["vector"];
|
||||
if(i->find("elements")!=i->end())
|
||||
elements_addr=(*i)["elements"];
|
||||
}
|
||||
if(vector_addr<0 || elements_addr<0)
|
||||
return -1;
|
||||
if(nasal_gc.get_scalar(vector_addr).get_type()!=scalar_vector)
|
||||
{
|
||||
std::cout<<">> [Runtime] append gets a value that is not a vector."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
for(int i=0;i<nasal_gc.get_scalar(elements_addr).get_vector().get_size();++i)
|
||||
{
|
||||
int data_addr=nasal_gc.get_scalar(elements_addr).get_vector().get_elem(i);
|
||||
if(data_addr<0)
|
||||
return -1;
|
||||
int new_addr=-1;
|
||||
switch(nasal_gc.get_scalar(data_addr).get_type())
|
||||
{
|
||||
case scalar_nil:
|
||||
new_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(new_addr).set_type(scalar_nil);
|
||||
break;
|
||||
case scalar_number:
|
||||
new_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(new_addr).set_type(scalar_number);
|
||||
nasal_gc.get_scalar(new_addr).get_number().deep_copy(nasal_gc.get_scalar(data_addr).get_number());
|
||||
break;
|
||||
case scalar_string:
|
||||
new_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(new_addr).set_type(scalar_string);
|
||||
nasal_gc.get_scalar(new_addr).get_string().deep_copy(nasal_gc.get_scalar(data_addr).get_string());
|
||||
break;
|
||||
case scalar_function:
|
||||
new_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(new_addr).set_type(scalar_function);
|
||||
nasal_gc.get_scalar(new_addr).get_function().deep_copy(nasal_gc.get_scalar(data_addr).get_function());
|
||||
break;
|
||||
case scalar_vector:
|
||||
case scalar_hash:
|
||||
new_addr=data_addr;
|
||||
nasal_gc.reference_add(new_addr);
|
||||
break;
|
||||
}
|
||||
nasal_gc.get_scalar(vector_addr).get_vector().vec_push(new_addr);
|
||||
}
|
||||
ret_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(ret_addr).set_type(scalar_nil);
|
||||
}
|
||||
else if(func_name=="nasal_call_inline_set_size")
|
||||
{
|
||||
// setsize
|
||||
int vector_addr=-1;
|
||||
int size_addr=-1;
|
||||
for(std::list<std::map<std::string,int> >::iterator i=local_scope.begin();i!=local_scope.end();++i)
|
||||
{
|
||||
if(i->find("vector")!=i->end())
|
||||
vector_addr=(*i)["vector"];
|
||||
if(i->find("__size")!=i->end())
|
||||
size_addr=(*i)["__size"];
|
||||
}
|
||||
if(vector_addr<0 || size_addr<0)
|
||||
return -1;
|
||||
int vector_size=-1;
|
||||
int aim_size=-1;
|
||||
if(nasal_gc.get_scalar(vector_addr).get_type()!=scalar_vector)
|
||||
{
|
||||
std::cout<<">> [Runtime] setsize gets a variable that is not a vector."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
vector_size=nasal_gc.get_scalar(vector_addr).get_vector().get_size();
|
||||
if(nasal_gc.get_scalar(size_addr).get_type()==scalar_string &&
|
||||
!check_numerable_string(nasal_gc.get_scalar(size_addr).get_string().get_string()))
|
||||
{
|
||||
std::cout<<">> [Runtime] __size is not a numerable string."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
if(nasal_gc.get_scalar(size_addr).get_type()!=scalar_string &&
|
||||
nasal_gc.get_scalar(size_addr).get_type()!=scalar_number)
|
||||
{
|
||||
std::cout<<">> [Runtime] __size must be a number or numerable string."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
if(nasal_gc.get_scalar(size_addr).get_type()==scalar_string &&
|
||||
check_numerable_string(nasal_gc.get_scalar(size_addr).get_string().get_string()))
|
||||
aim_size=(int)trans_string_to_number(nasal_gc.get_scalar(size_addr).get_string().get_string());
|
||||
else if(nasal_gc.get_scalar(size_addr).get_type()==scalar_number)
|
||||
aim_size=(int)nasal_gc.get_scalar(size_addr).get_number().get_number();
|
||||
if(aim_size<0)
|
||||
{
|
||||
std::cout<<">> [Runtime] __size must be greater than 0."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
if(vector_size<aim_size)
|
||||
{
|
||||
for(int i=vector_size;i<aim_size;++i)
|
||||
{
|
||||
int new_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(new_addr).set_type(scalar_nil);
|
||||
nasal_gc.get_scalar(vector_addr).get_vector().vec_push(new_addr);
|
||||
}
|
||||
}
|
||||
else if(vector_size>aim_size)
|
||||
for(int i=aim_size;i<vector_size;++i)
|
||||
{
|
||||
int pop_addr=nasal_gc.get_scalar(vector_addr).get_vector().vec_pop();
|
||||
nasal_gc.reference_delete(pop_addr);
|
||||
}
|
||||
ret_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(ret_addr).set_type(scalar_nil);
|
||||
}
|
||||
else if(func_name=="nasal_call_inline_c_std_puts")
|
||||
{
|
||||
// print
|
||||
int vector_addr=-1;
|
||||
for(std::list<std::map<std::string,int> >::iterator i=local_scope.begin();i!=local_scope.end();++i)
|
||||
if(i->find("dyn")!=i->end())
|
||||
vector_addr=(*i)["dyn"];
|
||||
if(vector_addr<0)
|
||||
return -1;
|
||||
for(int i=0;i<nasal_gc.get_scalar(vector_addr).get_vector().get_size();++i)
|
||||
{
|
||||
int data_addr=nasal_gc.get_scalar(vector_addr).get_vector().get_elem(i);
|
||||
if(data_addr<0)
|
||||
return -1;
|
||||
switch(nasal_gc.get_scalar(data_addr).get_type())
|
||||
{
|
||||
case scalar_nil:break;
|
||||
case scalar_number:std::cout<<nasal_gc.get_scalar(data_addr).get_number().get_number();break;
|
||||
case scalar_string:std::cout<<nasal_gc.get_scalar(data_addr).get_string().get_string();break;
|
||||
case scalar_vector:std::cout<<"[...]";break;
|
||||
case scalar_hash: std::cout<<"{...}";break;
|
||||
case scalar_function:std::cout<<"func(...){...}";break;
|
||||
}
|
||||
}
|
||||
ret_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(ret_addr).set_type(scalar_nil);
|
||||
}
|
||||
else if(func_name=="nasal_call_inline_scalar_type")
|
||||
{
|
||||
// system.type
|
||||
int data=-1;
|
||||
for(std::list<std::map<std::string,int> >::iterator i=local_scope.begin();i!=local_scope.end();++i)
|
||||
if(i->find("thing")!=i->end())
|
||||
data=(*i)["thing"];
|
||||
if(data<0)
|
||||
return -1;
|
||||
print_scalar_type(nasal_gc.get_scalar(data).get_type());
|
||||
std::cout<<std::endl;
|
||||
ret_addr=nasal_gc.gc_alloc();
|
||||
nasal_gc.get_scalar(ret_addr).set_type(scalar_nil);
|
||||
}
|
||||
if(func_name=="nasal_call_builtin_push_back")
|
||||
ret_addr=append(local_scope);
|
||||
else if(func_name=="nasal_call_builtin_set_size")
|
||||
ret_addr=setsize(local_scope);
|
||||
else if(func_name=="nasal_call_builtin_c_std_puts")
|
||||
ret_addr=print(local_scope);
|
||||
else if(func_name=="nasal_call_builtin_scalar_type")
|
||||
ret_addr=system_type(local_scope);
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user