diff --git a/nasal_builtin.h b/nasal_builtin.h index 90b557a..6b8362f 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -796,7 +796,6 @@ nasal_val* builtin_streq(nasal_val* local_scope_addr,nasal_gc& gc) return ret_addr; } int ret=(a_addr->get_string()==b_addr->get_string()); - ret_addr->set_number((double)ret); return ret_addr; } @@ -816,9 +815,9 @@ nasal_val* builtin_left(nasal_val* local_scope_addr,nasal_gc& gc) } std::string str=string_addr->get_string(); int len=(int)length_addr->get_number(); - if(len < 0) len = 0; + if(len<0) + len=0; std::string tmp=str.substr(0, len); - nasal_val* ret_addr=gc.gc_alloc(vm_str); ret_addr->set_string(tmp); return ret_addr; @@ -839,11 +838,12 @@ nasal_val* builtin_right(nasal_val* local_scope_addr,nasal_gc& gc) } std::string str=string_addr->get_string(); int len=(int)length_addr->get_number(); - int srclen = str.length(); - if (len > srclen) len = srclen; - if(len < 0) len = 0; + int srclen=str.length(); + if(len>srclen) + len=srclen; + if(len<0) + len=0; std::string tmp=str.substr(srclen-len, srclen); - nasal_val* ret_addr=gc.gc_alloc(vm_str); ret_addr->set_string(tmp); return ret_addr; @@ -862,21 +862,8 @@ nasal_val* builtin_cmp(nasal_val* local_scope_addr,nasal_gc& gc) builtin_error_occurred("cmp","\"b\" must be string"); return NULL; } - std::string a=a_addr->get_string(); - std::string b=b_addr->get_string(); - int alen=a.length(); - int blen=b.length(); nasal_val* ret_addr=gc.gc_alloc(vm_num); - for(int i=0; iset_number((double)diff < 0 ? -1 : 1); - return ret_addr; - } - } - ret_addr->set_number(alen == blen ? 0 : (alen < blen ? -1 : 1)); + ret_addr->set_number(strcmp(a_addr->get_string().data(),b_addr->get_string().data())); return ret_addr; } nasal_val* builtin_chr(nasal_val* local_scope_addr,nasal_gc& gc) @@ -887,9 +874,7 @@ nasal_val* builtin_chr(nasal_val* local_scope_addr,nasal_gc& gc) builtin_error_occurred("chr","\"code\" must be number"); return NULL; } - char chr[2]; - chr[0] = (char)code_addr->get_number(); - chr[1] = '\0'; + char chr[2]={(char)code_addr->get_number(),'\0'}; nasal_val* ret_addr=gc.gc_alloc(vm_str); ret_addr->set_string(chr); return ret_addr; diff --git a/nasal_codegen.h b/nasal_codegen.h index 9d77022..03ee912 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -338,7 +338,7 @@ void nasal_codegen::call_id(nasal_ast& ast) for(int i=0;builtin_func_table[i].func_pointer;++i) if(builtin_func_table[i].func_name==str) { - gen(op_builtincall,string_table[str]); + gen(op_builtincall,i); return; } gen(op_call,string_table[str]); @@ -926,9 +926,9 @@ void nasal_codegen::print_op(int index) switch(exec_code[index].op) { case op_pushnum:std::cout<<'('< string_table; // number table std::vector number_table; - // builtin function address table - std::map builtin_func_hashmap; void die(std::string); bool check_condition(nasal_val*); void opr_nop(); @@ -103,8 +101,6 @@ nasal_vm::nasal_vm() val_stack=new nasal_val*[val_stack_MAX_DEPTH]; val_stack_top=val_stack; local_scope_stack.push(NULL); - for(int i=0;builtin_func_table[i].func_pointer;++i) - builtin_func_hashmap[builtin_func_table[i].func_name]=builtin_func_table[i].func_pointer; return; } nasal_vm::~nasal_vm() @@ -899,11 +895,8 @@ void nasal_vm::opr_callf() } void nasal_vm::opr_builtincall() { - nasal_val* ret_value_addr=NULL; - std::string val_name=string_table[exec_code[ptr].index]; - ret_value_addr=(*builtin_func_hashmap[val_name])(local_scope_stack.top(),vm); + *(++val_stack_top)=(*builtin_func_table[exec_code[ptr].index].func_pointer)(local_scope_stack.top(),vm); main_loop_break_mark=!builtin_die_state; - *(++val_stack_top)=ret_value_addr; return; } void nasal_vm::opr_slicebegin()