diff --git a/version3.0/lib.nas b/version3.0/lib.nas index c0d63d9..62af564 100644 --- a/version3.0/lib.nas +++ b/version3.0/lib.nas @@ -27,6 +27,32 @@ var sleep=func(duration) nasal_call_builtin_sleep(duration); return; } + +var split=func(delimeter,string) +{ + return nasal_call_builtin_split(delimeter,string); +} +var rand=func(seed=nil) +{ + return nasal_call_builtin_rand(seed); +} +var id=func(thing) +{ + return nasal_call_builtin_get_id(thing); +} +var int=func(value) +{ + return nasal_call_builtin_trans_int(value); +} +var num=func(value) +{ + return nasal_call_builtin_trans_num(value); +} +var pop=func(vector) +{ + return nasal_call_builtin_pop_back(vector); +} + var io= { fin:func(filename) diff --git a/version3.0/nasal.h b/version3.0/nasal.h index 71212c2..49a46c8 100644 --- a/version3.0/nasal.h +++ b/version3.0/nasal.h @@ -1,8 +1,7 @@ #ifndef __NASAL_H__ #define __NASAL_H__ - - +#include #include #include #include diff --git a/version3.0/nasal_builtin.h b/version3.0/nasal_builtin.h index a7e55c4..b1eac64 100644 --- a/version3.0/nasal_builtin.h +++ b/version3.0/nasal_builtin.h @@ -119,7 +119,11 @@ int nasal_runtime::builtin_setsize(int local_scope_addr) int vec_size=ref_vector.size(); if(number=0) + nasal_vm.del_reference(addr); + } else if(number>vec_size) for(int i=vec_size;i=0) + delimeter_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("delimeter"); + if(delimeter_value_addr<0 || nasal_vm.gc_get(delimeter_value_addr).get_type()!=vm_string) + { + std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<=0) + string_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("string"); + if(string_value_addr<0 || nasal_vm.gc_get(string_value_addr).get_type()!=vm_string) + { + std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<> [runtime] builtin_split: delimeter's length must be greater than 0."<=source_len || source[i+j]!=delimeter[j]) + break; + if(j==delimeter_len-1) + check_delimeter=true; + } + if(check_delimeter) + { + int str_addr=nasal_vm.gc_alloc(); + nasal_vm.gc_get(str_addr).set_type(vm_string); + nasal_vm.gc_get(str_addr).set_string(tmp); + ref_vec.add_elem(str_addr); + tmp=""; + i+=delimeter_len-1; + } + else + tmp+=source[i]; + } + if(tmp.length()) + { + int str_addr=nasal_vm.gc_alloc(); + nasal_vm.gc_get(str_addr).set_type(vm_string); + nasal_vm.gc_get(str_addr).set_string(tmp); + ref_vec.add_elem(str_addr); + tmp=""; + } + return ret_addr; +} +int nasal_runtime::builtin_rand(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("seed"); + if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_number && nasal_vm.gc_get(value_addr).get_type()!=vm_nil)) + { + std::cout<<">> [runtime] builtin_rand: cannot find values or wrong value type(must be nil or number)."<=0) + value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("id"); + if(value_addr<0) + { + std::cout<<">> [runtime] builtin_id: cannot find this value."<=0) + value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value"); + if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number) + { + std::cout<<">> [runtime] builtin_int: cannot find this value or wrong value type(must be number)."<=0) + value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value"); + if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) + { + std::cout<<">> [runtime] builtin_num: cannot find this value or wrong value type(must be string)."<> [runtime] builtin_num: this is not a numerable string."<=0) + value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector"); + if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector) + { + std::cout<<">> [runtime] builtin_pop: cannot find this value or wrong value type(must be vector)."<=elems.size()) + // pop back + if(!elems.size()) return -1; - int ret=elems[index]; - nasal_vm.mem_free(ret); - for(int i=index;i=0) - value_address=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(val_name); - if(value_address<0) - value_address=nasal_vm.gc_get(global_scope_address).get_closure().get_value_address(val_name); - if(value_address<0) + std::string val_name=""; + if(node.get_children()[0].get_type()==ast_identifier) { - value_address=call_builtin_function(node.get_children()[0],local_scope_addr); - if(value_address>=0) - return value_address; + val_name=node.get_children()[0].get_str(); + if(local_scope_addr>=0) + value_address=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(val_name); + if(value_address<0) + value_address=nasal_vm.gc_get(global_scope_address).get_closure().get_value_address(val_name); + if(value_address<0) + { + value_address=call_builtin_function(node.get_children()[0],local_scope_addr); + if(value_address>=0) + return value_address; + } + if(value_address<0) + { + std::cout<<">> [runtime] call_nasal_scalar: cannot find value named \'"<> [runtime] call_nasal_scalar: cannot find value named \'"<