update
This commit is contained in:
parent
d37322549b
commit
fb908e5606
|
@ -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=
|
||||
{
|
||||
|
|
|
@ -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 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
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue