diff --git a/.gitignore b/.gitignore index 91ed038b..0e27b9dc 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,6 @@ main.obj pocketpy.exp pocketpy.lib APPS -build \ No newline at end of file +build + +pocketpy.dSYM \ No newline at end of file diff --git a/build.py b/build.py index 9d975e05..7d46f675 100644 --- a/build.py +++ b/build.py @@ -15,7 +15,7 @@ main_src_arg = " ".join(src_file_list+["src2/main.cpp"]) print(main_src_arg) -linux_common = " -Wfatal-errors --std=c++17 -O2 -Wall -fno-rtti -stdlib=libc++ -Iinclude/ " +linux_common = " -Wfatal-errors --std=c++17 -O1 -Wall -fno-rtti -stdlib=libc++ -Iinclude/ " linux_cmd = "clang++ -o pocketpy " + main_src_arg + linux_common if "web" in sys.argv: diff --git a/src/lexer.cpp b/src/lexer.cpp index bd30e9c0..d6e12020 100644 --- a/src/lexer.cpp +++ b/src/lexer.cpp @@ -217,7 +217,7 @@ namespace pkpy{ char code; try{ code = (char)Number::stoi(hex, &parsed, 16); - }catch(std::invalid_argument&){ + }catch(...){ SyntaxError("invalid hex char"); } if (parsed != 2) SyntaxError("invalid hex char"); @@ -259,21 +259,24 @@ namespace pkpy{ return; } + if(m[1].matched && m[2].matched){ + SyntaxError("hex literal should not contain a dot"); + } + try{ int base = 10; size_t size; if (m[1].matched) base = 16; if (m[2].matched) { - if(base == 16) SyntaxError("hex literal should not contain a dot"); + PK_ASSERT(base == 10); add_token(TK("@num"), Number::stof(m[0], &size)); } else { add_token(TK("@num"), Number::stoi(m[0], &size, base)); } PK_ASSERT((int)size == (int)m.length()); - }catch(std::exception& e){ - PK_UNUSED(e); + }catch(...){ SyntaxError("invalid number literal"); - } + } } bool Lexer::lex_one_token() { diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index c322c6a6..c055a2d8 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -308,9 +308,9 @@ void init_builtins(VM* _vm) { try{ size_t parsed = 0; i64 val = Number::stoi(s.str(), &parsed, base); - if(parsed != s.length()) throw std::invalid_argument(""); + PK_ASSERT(parsed == s.length()); return VAR(val); - }catch(std::invalid_argument&){ + }catch(...){ vm->ValueError("invalid literal for int(): " + s.escape()); } } @@ -368,7 +368,7 @@ void init_builtins(VM* _vm) { try{ f64 val = Number::stof(s.str()); return VAR(val); - }catch(std::invalid_argument&){ + }catch(...){ vm->ValueError("invalid literal for float(): " + s.escape()); } }