some optimize

This commit is contained in:
blueloveTH 2024-04-14 12:32:45 +08:00
parent 50fe20b659
commit d3989474a7
5 changed files with 24 additions and 22 deletions

View File

@ -135,7 +135,7 @@ struct TokenDeserializer{
std::string_view read_string(char c); std::string_view read_string(char c);
Str read_string_from_hex(char c); Str read_string_from_hex(char c);
i64 read_int(char c); i64 read_uint(char c);
f64 read_float(char c); f64 read_float(char c);
}; };

View File

@ -139,6 +139,6 @@ enum class IntParsingResult{
Overflow, Overflow,
}; };
IntParsingResult parse_int(std::string_view text, i64* out, int base); IntParsingResult parse_uint(std::string_view text, i64* out, int base);
} // namespace pkpy } // namespace pkpy

View File

@ -1281,29 +1281,29 @@ __EAT_DOTS_END:
if(version != PK_VERSION){ if(version != PK_VERSION){
SyntaxError(_S("precompiled version mismatch: ", version, "!=" PK_VERSION)); SyntaxError(_S("precompiled version mismatch: ", version, "!=" PK_VERSION));
} }
if(deserializer.read_int('\n') != (i64)mode()){ if(deserializer.read_uint('\n') != (i64)mode()){
SyntaxError("precompiled mode mismatch"); SyntaxError("precompiled mode mismatch");
} }
lexer.src->_precompiled_tokens = deserializer.read_string('\n'); lexer.src->_precompiled_tokens = deserializer.read_string('\n');
deserializer.curr += 1; // skip '=' deserializer.curr += 1; // skip '='
i64 count = deserializer.read_int('\n'); i64 count = deserializer.read_uint('\n');
const char* tokens_c_str = lexer.src->_precompiled_tokens.c_str(); const char* tokens_c_str = lexer.src->_precompiled_tokens.c_str();
for(int i=0; i<count; i++){ for(int i=0; i<count; i++){
Token t; Token t;
t.type = (unsigned char)deserializer.read_int(','); t.type = (unsigned char)deserializer.read_uint(',');
if(is_raw_string_used(t.type)){ if(is_raw_string_used(t.type)){
t.start = tokens_c_str + deserializer.read_int(','); t.start = tokens_c_str + deserializer.read_uint(',');
t.length = deserializer.read_int(','); t.length = deserializer.read_uint(',');
}else{ }else{
t.start = nullptr; t.start = nullptr;
t.length = 0; t.length = 0;
} }
t.line = (int)deserializer.read_int(','); t.line = (int)deserializer.read_uint(',');
t.brackets_level = (int)deserializer.read_int(','); t.brackets_level = (int)deserializer.read_uint(',');
char type = deserializer.read_char(); char type = deserializer.read_char();
switch(type){ switch(type){
case 'I': t.value = deserializer.read_int('\n'); break; case 'I': t.value = deserializer.read_uint('\n'); break;
case 'F': t.value = deserializer.read_float('\n'); break; case 'F': t.value = deserializer.read_float('\n'); break;
case 'S': t.value = deserializer.read_string_from_hex('\n'); break; case 'S': t.value = deserializer.read_string_from_hex('\n'); break;
default: t.value = {}; break; default: t.value = {}; break;
@ -1385,11 +1385,13 @@ __EAT_DOTS_END:
return std::pair<char*, int>(buffer, s.size()/2); return std::pair<char*, int>(buffer, s.size()/2);
} }
i64 TokenDeserializer::read_int(char c){ i64 TokenDeserializer::read_uint(char c){
std::string_view sv = read_string(c); i64 out = 0;
i64 out; while(*curr != c){
IntParsingResult res = parse_int(sv, &out, 10); out = out*10 + (*curr-'0');
PK_ASSERT(res == IntParsingResult::Success); curr++;
}
curr++; // skip the delimiter
return out; return out;
} }

View File

@ -292,7 +292,7 @@ static bool is_unicode_Lo_char(uint32_t c) {
} }
// try integer // try integer
i64 int_out; i64 int_out;
switch(parse_int(text, &int_out, -1)){ switch(parse_uint(text, &int_out, -1)){
case IntParsingResult::Success: case IntParsingResult::Success:
add_token(TK("@num"), int_out); add_token(TK("@num"), int_out);
return; return;
@ -491,13 +491,13 @@ static bool is_unicode_Lo_char(uint32_t c) {
return std::move(nexts); return std::move(nexts);
} }
IntParsingResult parse_int(std::string_view text, i64* out, int base){ inline constexpr bool f_startswith_2(std::string_view t, const char* prefix){
*out = 0;
const auto f_startswith_2 = [](std::string_view t, const char* prefix) -> bool{
if(t.length() < 2) return false; if(t.length() < 2) return false;
return t[0] == prefix[0] && t[1] == prefix[1]; return t[0] == prefix[0] && t[1] == prefix[1];
}; }
IntParsingResult parse_uint(std::string_view text, i64* out, int base){
*out = 0;
if(base == -1){ if(base == -1){
if(f_startswith_2(text, "0b")) base = 2; if(f_startswith_2(text, "0b")) base = 2;

View File

@ -443,7 +443,7 @@ void init_builtins(VM* _vm) {
sv.remove_prefix(1); sv.remove_prefix(1);
} }
i64 val; i64 val;
if(parse_int(sv, &val, base) != IntParsingResult::Success){ if(parse_uint(sv, &val, base) != IntParsingResult::Success){
vm->ValueError(_S("invalid literal for int() with base ", base, ": ", s.escape())); vm->ValueError(_S("invalid literal for int() with base ", base, ": ", s.escape()));
} }
if(negative) val = -val; if(negative) val = -val;