⚡ optimize `op_para` and `op_deft`: change `hashmap<string,u64>` to `hashmap<u32,u32>`
This commit is contained in:
parent
8ca0bc52c3
commit
e9fc70bba8
14
nasal_gc.h
14
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<nasal_ref> local; // local scope with default value(nasal_ref)
|
||||
std::vector<nasal_ref> upvalue; // closure
|
||||
std::unordered_map<std::string,size_t> 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<nasal_ref> local; // local scope with default value(nasal_ref)
|
||||
std::vector<nasal_ref> upvalue; // closure
|
||||
std::unordered_map<uint32_t,uint32_t> keys; // parameter name table, size_t begins from 1
|
||||
|
||||
nasal_func():dynpara(-1),entry(0),psize(0),lsize(0){}
|
||||
void clear();
|
||||
|
|
11
nasal_vm.h
11
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;
|
||||
|
|
|
@ -201,4 +201,7 @@ foreach(var i;a){
|
|||
foreach(i;a){
|
||||
;
|
||||
}
|
||||
println(runtime.argv());
|
||||
println(runtime.argv());
|
||||
func(a,b,c,d="只有红茶可以吗"){
|
||||
println(a,' ',b,' ',c,' ',d);
|
||||
}(c:1919810,b:514,a:114);
|
Loading…
Reference in New Issue