This commit is contained in:
blueloveTH 2024-01-07 15:52:33 +08:00
parent 0310d46296
commit b28ea2c35b
2 changed files with 31 additions and 17 deletions

View File

@ -150,12 +150,12 @@ union BitsCvtImpl<8>{
BitsCvtImpl(NumberTraits<8>::float_t val): _float(val) {} BitsCvtImpl(NumberTraits<8>::float_t val): _float(val) {}
BitsCvtImpl(NumberTraits<8>::int_t val): _int(val) {} BitsCvtImpl(NumberTraits<8>::int_t val): _int(val) {}
void print(){ // void print(){
std::string s = std::bitset<64>(_int).to_string(); // std::string s = std::bitset<64>(_int).to_string();
std::cout << s.substr(0, 1) << '|'; // std::cout << s.substr(0, 1) << '|';
std::cout << s.substr(1, 11) << '|'; // std::cout << s.substr(1, 11) << '|';
std::cout << s.substr(12) << std::endl; // std::cout << s.substr(12) << std::endl;
} // }
}; };
using BitsCvt = BitsCvtImpl<sizeof(void*)>; using BitsCvt = BitsCvtImpl<sizeof(void*)>;

View File

@ -6,6 +6,13 @@ namespace pkpy{
return v >= INT16_MIN && v <= INT16_MAX; return v >= INT16_MIN && v <= INT16_MAX;
} }
inline bool is_identifier(std::string_view s){
if(s.empty()) return false;
if(!isalpha(s[0]) && s[0] != '_') return false;
for(char c: s) if(!isalnum(c) && c != '_') return false;
return true;
}
int CodeEmitContext::get_loop() const { int CodeEmitContext::get_loop() const {
int index = curr_block_i; int index = curr_block_i;
while(index >= 0){ while(index >= 0){
@ -402,21 +409,28 @@ namespace pkpy{
} }
} }
// name or name.name // name or name.name
PK_LOCAL_STATIC const std::regex pattern(R"(^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*){0,1}$)"); bool is_fastpath = false;
if(std::regex_match(expr.str(), pattern)){ if(is_identifier(expr.sv())){
int dot = expr.index(".");
if(dot < 0){
ctx->emit_(OP_LOAD_NAME, StrName(expr.sv()).index, line); ctx->emit_(OP_LOAD_NAME, StrName(expr.sv()).index, line);
is_fastpath = true;
}else{ }else{
StrName name(expr.substr(0, dot).sv()); int dot = expr.index(".");
StrName attr(expr.substr(dot+1).sv()); if(dot > 0){
ctx->emit_(OP_LOAD_NAME, name.index, line); std::string_view a = expr.sv().substr(0, dot);
ctx->emit_(OP_LOAD_ATTR, attr.index, line); std::string_view b = expr.sv().substr(dot+1);
if(is_identifier(a) && is_identifier(b)){
ctx->emit_(OP_LOAD_NAME, StrName(a).index, line);
ctx->emit_(OP_LOAD_ATTR, StrName(b).index, line);
is_fastpath = true;
} }
}else{ }
}
if(!is_fastpath){
int index = ctx->add_const_string(expr.sv()); int index = ctx->add_const_string(expr.sv());
ctx->emit_(OP_FSTRING_EVAL, index, line); ctx->emit_(OP_FSTRING_EVAL, index, line);
} }
if(repr){ if(repr){
ctx->emit_(OP_REPR, BC_NOARG, line); ctx->emit_(OP_REPR, BC_NOARG, line);
} }