From d6d90ab7c88cb18fb84fa8b7f4e262a2652415be Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 2 Feb 2022 23:52:00 +0800 Subject: [PATCH] change 'global' & 'local' in codegen to std::unordered_map & std::vector> --- nasal_codegen.h | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/nasal_codegen.h b/nasal_codegen.h index d6708e9..dd96687 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -198,8 +198,10 @@ private: std::vector code; std::list> continue_ptr; std::list> break_ptr; - std::vector global; // global : max 4095 values - std::list> local; // local : max 32768 upvalues 65536 values + // global : max 4095 values + std::unordered_map global; + // local : max 32768 upvalues 65536 values + std::list> local; void die(std::string,const uint32_t); void regist_number(const double); @@ -306,34 +308,28 @@ void nasal_codegen::add_sym(const std::string& name) { if(local.empty()) { - for(auto& sym:global) - if(sym==name) - return; - global.push_back(name); + if(global.count(name)) + return; + int index=global.size(); + global[name]=index; return; } - for(auto& sym:local.back()) - if(sym==name) - return; - local.back().push_back(name); + if(local.back().count(name)) + return; + int index=local.back().size(); + local.back()[name]=index; } int nasal_codegen::local_find(const std::string& name) { if(local.empty()) return -1; - for(uint32_t i=0;isize();++j) - if((*iter)[j]==name) - index=((i<<16)|j); + if(iter->count(name)) + index=((i<<16)|(*iter)[name]); return index; } @@ -400,7 +395,7 @@ void nasal_codegen::func_gen(const nasal_ast& ast) // this keyword is set to nil as default value // after calling a hash, this keyword is set to this hash // this symbol's index will be 0 - local.push_back({"me"}); + local.push_back({{"me",0}}); // generate parameter list for(auto& tmp:ast[0].child())