diff --git a/version3.0/lib.nas b/version3.0/lib.nas index 8380568..1c362db 100644 --- a/version3.0/lib.nas +++ b/version3.0/lib.nas @@ -59,6 +59,23 @@ var size=func(object) { return nasal_call_builtin_size(object); } +var contains=func(hash,key) +{ + return nasal_call_builtin_contains(hash,key); +} +var delete=func(hash,key) +{ + nasal_call_builtin_delete(hash,key); + return; +} +var keys=func(hash) +{ + return nasal_call_builtin_get_keys(hash); +} +var time=func(begin_time) +{ + return nasal_call_builtin_time(begin_time); +} var io= { @@ -130,8 +147,3 @@ var math= return nasal_call_builtin_cpp_atan2(x,y); }, }; - -var time=func(begin_time) -{ - return nasal_call_builtin_time(begin_time); -} \ No newline at end of file diff --git a/version3.0/nasal_builtin.h b/version3.0/nasal_builtin.h index ae3a36b..0fd20b4 100644 --- a/version3.0/nasal_builtin.h +++ b/version3.0/nasal_builtin.h @@ -2,6 +2,7 @@ #define __NASAL_BUILTIN_H__ #define in_builtin_find(value_name_string) (local_scope_addr>=0?nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(value_name_string):-1) +#define in_builtin_check(value_addr,value_type) (nasal_vm.gc_get(value_addr).get_type()==(value_type)) int nasal_runtime::builtin_print(int local_scope_addr) { @@ -681,4 +682,62 @@ int nasal_runtime::builtin_time(int local_scope_addr) nasal_vm.gc_get(ret_addr).set_number((double)time(&begin_time)); return ret_addr; } +int nasal_runtime::builtin_contains(int local_scope_addr) +{ + int hash_addr=in_builtin_find("hash"); + int key_addr=in_builtin_find("key"); + if(hash_addr<0 || !in_builtin_check(hash_addr,vm_hash)) + { + std::cout<<">> [runtime] builtin_contains: cannot find value named \'hash\' or wrong type(must be hash)."<> [runtime] builtin_contains: cannot find value named \'key\' or wrong type(must be string)."<> [runtime] builtin_delete: cannot find value named \'hash\' or wrong type(must be hash)."<> [runtime] builtin_delete: cannot find value named \'key\' or wrong type(must be string)."<> [runtime] builtin_delete: cannot find value named \'hash\' or wrong type(must be hash)."<> [vm] nasal_hash::add_elem: "<> [vm] nasal_hash::del_elem: "<::iterator iter=elems.begin();iter!=elems.end();++iter) + { + 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(iter->first); + ref_vec.add_elem(str_addr); + } + return ret_addr; +} /*functions of nasal_function*/ nasal_function::nasal_function() diff --git a/version3.0/nasal_runtime.h b/version3.0/nasal_runtime.h index 3fb7f91..5dac346 100644 --- a/version3.0/nasal_runtime.h +++ b/version3.0/nasal_runtime.h @@ -96,6 +96,9 @@ private: int builtin_sqrt(int); int builtin_atan2(int); int builtin_time(int); + int builtin_contains(int); + int builtin_delete(int); + int builtin_getkeys(int); void load_builtin_function(); public: nasal_runtime(); @@ -157,6 +160,9 @@ void nasal_runtime::load_builtin_function() {"nasal_call_builtin_cpp_math_sqrt", nasal_runtime::builtin_sqrt}, {"nasal_call_builtin_cpp_atan2", nasal_runtime::builtin_atan2}, {"nasal_call_builtin_time", nasal_runtime::builtin_time}, + {"nasal_call_builtin_contains", nasal_runtime::builtin_contains}, + {"nasal_call_builtin_delete", nasal_runtime::builtin_delete}, + {"nasal_call_builtin_get_keys", nasal_runtime::builtin_getkeys}, {"", NULL} }; for(int i=0;builtin_func_table[i].func_pointer;++i)