update
This commit is contained in:
parent
d37322549b
commit
fb908e5606
|
@ -27,7 +27,6 @@ var sleep=func(duration)
|
||||||
nasal_call_builtin_sleep(duration);
|
nasal_call_builtin_sleep(duration);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var split=func(delimeter,string)
|
var split=func(delimeter,string)
|
||||||
{
|
{
|
||||||
return nasal_call_builtin_split(delimeter,string);
|
return nasal_call_builtin_split(delimeter,string);
|
||||||
|
@ -52,6 +51,14 @@ var pop=func(vector)
|
||||||
{
|
{
|
||||||
return nasal_call_builtin_pop_back(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=
|
var io=
|
||||||
{
|
{
|
||||||
|
|
|
@ -427,6 +427,56 @@ int nasal_runtime::builtin_pop(int local_scope_addr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int ret_addr=nasal_vm.gc_get(value_addr).get_vector().del_elem();
|
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
|
#endif
|
|
@ -37,6 +37,7 @@ public:
|
||||||
~nasal_hash();
|
~nasal_hash();
|
||||||
void add_elem(std::string,int);
|
void add_elem(std::string,int);
|
||||||
void del_elem(std::string);
|
void del_elem(std::string);
|
||||||
|
int size();
|
||||||
int get_value_address(std::string);
|
int get_value_address(std::string);
|
||||||
int get_mem_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;
|
std::cout<<">> [vm] nasal_hash::del_elem: "<<key<<" does not exist."<<std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int nasal_hash::size()
|
||||||
|
{
|
||||||
|
return elems.size();
|
||||||
|
}
|
||||||
int nasal_hash::get_value_address(std::string key)
|
int nasal_hash::get_value_address(std::string key)
|
||||||
{
|
{
|
||||||
int ret_value_addr=-1;
|
int ret_value_addr=-1;
|
||||||
|
|
|
@ -10,7 +10,7 @@ enum runtime_returned_state
|
||||||
rt_exit_without_error
|
rt_exit_without_error
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BUILTIN_FUNC_NUM 14
|
#define BUILTIN_FUNC_NUM 16
|
||||||
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||||
{
|
{
|
||||||
"nasal_call_builtin_std_cout",
|
"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_get_id",
|
||||||
"nasal_call_builtin_trans_int",
|
"nasal_call_builtin_trans_int",
|
||||||
"nasal_call_builtin_trans_num",
|
"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
|
class nasal_runtime
|
||||||
|
@ -99,6 +101,8 @@ private:
|
||||||
int builtin_int(int);
|
int builtin_int(int);
|
||||||
int builtin_num(int);
|
int builtin_num(int);
|
||||||
int builtin_pop(int);
|
int builtin_pop(int);
|
||||||
|
int builtin_str(int);
|
||||||
|
int builtin_size(int);
|
||||||
public:
|
public:
|
||||||
nasal_runtime();
|
nasal_runtime();
|
||||||
~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 11:ret_value_addr=builtin_int(local_scope_addr);break;
|
||||||
case 12:ret_value_addr=builtin_num(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 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;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue