fix a bug

This commit is contained in:
blueloveTH 2023-02-23 01:28:10 +08:00
parent efc7da7dc7
commit fc8503cb45
3 changed files with 8 additions and 4 deletions

View File

@ -39,9 +39,13 @@
#if defined(__EMSCRIPTEN__) || defined(__arm__) || defined(__i386__) #if defined(__EMSCRIPTEN__) || defined(__arm__) || defined(__i386__)
typedef int32_t i64; typedef int32_t i64;
typedef float f64; typedef float f64;
#define S_TO_INT std::stoi
#define S_TO_FLOAT std::stof
#else #else
typedef int64_t i64; typedef int64_t i64;
typedef double f64; typedef double f64;
#define S_TO_INT std::stoll
#define S_TO_FLOAT std::stod
#endif #endif
struct Dummy { }; struct Dummy { };

View File

@ -168,9 +168,9 @@ private:
if (m[1].matched) base = 16; if (m[1].matched) base = 16;
if (m[2].matched) { if (m[2].matched) {
if(base == 16) SyntaxError("hex literal should not contain a dot"); if(base == 16) SyntaxError("hex literal should not contain a dot");
parser->set_next_token(TK("@num"), vm->PyFloat(std::stod(m[0], &size))); parser->set_next_token(TK("@num"), vm->PyFloat(S_TO_FLOAT(m[0], &size)));
} else { } else {
parser->set_next_token(TK("@num"), vm->PyInt(std::stoll(m[0], &size, base))); parser->set_next_token(TK("@num"), vm->PyInt(S_TO_INT(m[0], &size, base)));
} }
if (size != m.length()) UNREACHABLE(); if (size != m.length()) UNREACHABLE();
} }

View File

@ -206,7 +206,7 @@ void init_builtins(VM* _vm) {
const Str& s = vm->PyStr_AS_C(args[0]); const Str& s = vm->PyStr_AS_C(args[0]);
try{ try{
size_t parsed = 0; size_t parsed = 0;
i64 val = std::stoll(s, &parsed, 10); i64 val = S_TO_INT(s, &parsed, 10);
if(parsed != s.size()) throw std::invalid_argument("<?>"); if(parsed != s.size()) throw std::invalid_argument("<?>");
return vm->PyInt(val); return vm->PyInt(val);
}catch(std::invalid_argument&){ }catch(std::invalid_argument&){
@ -253,7 +253,7 @@ void init_builtins(VM* _vm) {
if(s == "inf") return vm->PyFloat(INFINITY); if(s == "inf") return vm->PyFloat(INFINITY);
if(s == "-inf") return vm->PyFloat(-INFINITY); if(s == "-inf") return vm->PyFloat(-INFINITY);
try{ try{
f64 val = std::stod(s); f64 val = S_TO_FLOAT(s);
return vm->PyFloat(val); return vm->PyFloat(val);
}catch(std::invalid_argument&){ }catch(std::invalid_argument&){
vm->ValueError("invalid literal for float(): '" + s + "'"); vm->ValueError("invalid literal for float(): '" + s + "'");