diff --git a/nasal_gc.h b/nasal_gc.h index a051106..66be80b 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -122,13 +122,13 @@ struct nasal_hash struct nasal_func { - int32_t dynpara; // dynamic parameter name index in hash. - uint32_t entry; // pc will set to entry-1 to call this function - uint32_t psize; // used to load default parameters to a new function - uint32_t lsize; // used to expand memory space for local values on stack - std::vector local; // local scope with default value(nasal_ref) - std::vector upvalue; // closure - std::unordered_map keys; // parameter name table, size_t begins from 1 + int32_t dynpara; // dynamic parameter name index in hash. + uint32_t entry; // pc will set to entry-1 to call this function + uint32_t psize; // used to load default parameters to a new function + uint32_t lsize; // used to expand memory space for local values on stack + std::vector local; // local scope with default value(nasal_ref) + std::vector upvalue; // closure + std::unordered_map keys; // parameter name table, size_t begins from 1 nasal_func():dynpara(-1),entry(0),psize(0),lsize(0){} void clear(); diff --git a/nasal_vm.h b/nasal_vm.h index 62e06d1..f484279 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -440,7 +440,7 @@ inline void nasal_vm::opr_para() { nasal_func& func=top[0].func(); // func->size has 1 place reserved for "me" - func.keys[str_table[imm[pc]]]=func.psize; + func.keys[imm[pc]]=func.psize; func.local[func.psize++]={vm_none}; } inline void nasal_vm::opr_deft() @@ -448,7 +448,7 @@ inline void nasal_vm::opr_deft() nasal_ref val=top[0]; nasal_func& func=(--top)[0].func(); // func->size has 1 place reserved for "me" - func.keys[str_table[imm[pc]]]=func.psize; + func.keys[imm[pc]]=func.psize; func.local[func.psize++]=val; } inline void nasal_vm::opr_dyn() @@ -779,10 +779,11 @@ inline void nasal_vm::opr_callfh() for(auto& i:func.keys) { - if(hash.count(i.first)) - local[i.second]=hash[i.first]; + const std::string& key=str_table[i.first]; + if(hash.count(key)) + local[i.second]=hash[key]; else if(local[i.second].type==vm_none) - die("callfh: lack argument(s): \""+i.first+"\""); + die("callfh: lack argument(s): \""+key+"\""); } top[0]=upvalr; diff --git a/test/scalar.nas b/test/scalar.nas index d208c8f..d9350f4 100644 --- a/test/scalar.nas +++ b/test/scalar.nas @@ -201,4 +201,7 @@ foreach(var i;a){ foreach(i;a){ ; } -println(runtime.argv()); \ No newline at end of file +println(runtime.argv()); +func(a,b,c,d="只有红茶可以吗"){ + println(a,' ',b,' ',c,' ',d); +}(c:1919810,b:514,a:114); \ No newline at end of file