forked from xxq250/Nasal-Interpreter
⚡ optimize op_para and op_deft: change hashmap<string,u64> to hashmap<u32,u32>
This commit is contained in:
+1
-1
@@ -128,7 +128,7 @@ struct nasal_func
|
||||
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
|
||||
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();
|
||||
|
||||
+6
-5
@@ -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;
|
||||
|
||||
@@ -202,3 +202,6 @@ foreach(i;a){
|
||||
;
|
||||
}
|
||||
println(runtime.argv());
|
||||
func(a,b,c,d="只有红茶可以吗"){
|
||||
println(a,' ',b,' ',c,' ',d);
|
||||
}(c:1919810,b:514,a:114);
|
||||
Reference in New Issue
Block a user