This commit is contained in:
Valk Richard Li 2020-09-17 03:46:52 -07:00 committed by GitHub
parent d37322549b
commit fb908e5606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 4 deletions

View File

@ -27,7 +27,6 @@ var sleep=func(duration)
nasal_call_builtin_sleep(duration);
return;
}
var split=func(delimeter,string)
{
return nasal_call_builtin_split(delimeter,string);
@ -52,6 +51,14 @@ var pop=func(vector)
{
return nasal_call_builtin_pop_back(vector);
}
var str=func(number)
{
return nasal_call_builtin_trans_str(number);
}
var size=func(object)
{
return nasal_call_builtin_size(object);
}
var io=
{

View File

@ -427,6 +427,56 @@ int nasal_runtime::builtin_pop(int local_scope_addr)
return -1;
}
int ret_addr=nasal_vm.gc_get(value_addr).get_vector().del_elem();
return -1;
return ret_addr;
}
int nasal_runtime::builtin_str(int local_scope_addr)
{
int value_addr=-1;
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("number");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_str: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
return -1;
}
double number=nasal_vm.gc_get(value_addr).get_number();
int ret_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(ret_addr).set_type(vm_string);
nasal_vm.gc_get(ret_addr).set_string(trans_number_to_string(number));
return ret_addr;
}
int nasal_runtime::builtin_size(int local_scope_addr)
{
int value_addr=-1;
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("object");
if(value_addr<0)
{
std::cout<<">> [runtime] builtin_size: cannot find values."<<std::endl;
++error;
return -1;
}
int type=nasal_vm.gc_get(value_addr).get_type();
int number=-1;
switch(type)
{
case vm_nil:
case vm_number:
case vm_function:
case vm_closure:break;
case vm_string:number=nasal_vm.gc_get(value_addr).get_string().length();break;
case vm_vector:number=nasal_vm.gc_get(value_addr).get_vector().size();break;
case vm_hash:number=nasal_vm.gc_get(value_addr).get_hash().size();break;
}
int ret_addr=nasal_vm.gc_alloc();
if(number<0)
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
else
{
nasal_vm.gc_get(ret_addr).set_type(vm_number);
nasal_vm.gc_get(ret_addr).set_number((double)number);
}
return ret_addr;
}
#endif

View File

@ -37,6 +37,7 @@ public:
~nasal_hash();
void add_elem(std::string,int);
void del_elem(std::string);
int size();
int get_value_address(std::string);
int get_mem_address(std::string);
};
@ -262,6 +263,10 @@ void nasal_hash::del_elem(std::string key)
std::cout<<">> [vm] nasal_hash::del_elem: "<<key<<" does not exist."<<std::endl;
return;
}
int nasal_hash::size()
{
return elems.size();
}
int nasal_hash::get_value_address(std::string key)
{
int ret_value_addr=-1;

View File

@ -10,7 +10,7 @@ enum runtime_returned_state
rt_exit_without_error
};
#define BUILTIN_FUNC_NUM 14
#define BUILTIN_FUNC_NUM 16
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
{
"nasal_call_builtin_std_cout",
@ -26,7 +26,9 @@ std::string builtin_func_name[BUILTIN_FUNC_NUM]=
"nasal_call_builtin_get_id",
"nasal_call_builtin_trans_int",
"nasal_call_builtin_trans_num",
"nasal_call_builtin_pop_back"
"nasal_call_builtin_pop_back",
"nasal_call_builtin_trans_str",
"nasal_call_builtin_size"
};
class nasal_runtime
@ -99,6 +101,8 @@ private:
int builtin_int(int);
int builtin_num(int);
int builtin_pop(int);
int builtin_str(int);
int builtin_size(int);
public:
nasal_runtime();
~nasal_runtime();
@ -1104,6 +1108,8 @@ int nasal_runtime::call_builtin_function(nasal_ast& node,int local_scope_addr)
case 11:ret_value_addr=builtin_int(local_scope_addr);break;
case 12:ret_value_addr=builtin_num(local_scope_addr);break;
case 13:ret_value_addr=builtin_pop(local_scope_addr);break;
case 14:ret_value_addr=builtin_str(local_scope_addr);break;
case 15:ret_value_addr=builtin_size(local_scope_addr);break;
}
return ret_value_addr;
}