diff --git a/Libraries/LibJS/Parser.h b/Libraries/LibJS/Parser.h index 5b4ed288915..10d6607073e 100644 --- a/Libraries/LibJS/Parser.h +++ b/Libraries/LibJS/Parser.h @@ -72,7 +72,7 @@ public: NonnullRefPtr parse_new_expression(); RefPtr try_parse_arrow_function_expression(bool expect_parens); - bool has_errors() const { return m_parser_state.m_has_errors; } + bool has_errors() const { return m_parser_state.m_lexer.has_errors() || m_parser_state.m_has_errors; } private: int operator_precedence(TokenType) const; diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 6162deaac2d..4815013292d 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -374,7 +374,11 @@ JS::Interpreter& Document::interpreter() JS::Value Document::run_javascript(const StringView& source) { - auto program = JS::Parser(JS::Lexer(source)).parse_program(); + auto parser = JS::Parser(JS::Lexer(source)); + auto program = parser.parse_program(); + if (parser.has_errors()) { + return JS::js_undefined(); + } dbg() << "Document::run_javascript('" << source << "') will run:"; program->dump(0); return document().interpreter().run(*program); diff --git a/Libraries/LibWeb/DOM/HTMLScriptElement.cpp b/Libraries/LibWeb/DOM/HTMLScriptElement.cpp index 9061b893e3d..45b39305545 100644 --- a/Libraries/LibWeb/DOM/HTMLScriptElement.cpp +++ b/Libraries/LibWeb/DOM/HTMLScriptElement.cpp @@ -59,7 +59,11 @@ void HTMLScriptElement::children_changed() if (source.is_empty()) return; - auto program = JS::Parser(JS::Lexer(source)).parse_program(); + auto parser = JS::Parser(JS::Lexer(source)); + auto program = parser.parse_program(); + if (parser.has_errors()) + return; + document().interpreter().run(*program); } @@ -90,7 +94,11 @@ void HTMLScriptElement::inserted_into(Node& new_parent) return; } - auto program = JS::Parser(JS::Lexer(source)).parse_program(); + auto parser = JS::Parser(JS::Lexer(source)); + auto program = parser.parse_program(); + if (parser.has_errors()) + return; + document().interpreter().run(*program); } diff --git a/Userland/js.cpp b/Userland/js.cpp index 2043a3cf2e3..9e1412c0c96 100644 --- a/Userland/js.cpp +++ b/Userland/js.cpp @@ -328,9 +328,14 @@ JS::Value ReplObject::load_file(JS::Interpreter& interpreter) } else { source = file_contents; } - auto program = JS::Parser(JS::Lexer(source)).parse_program(); + auto parser = JS::Parser(JS::Lexer(source)); + auto program = parser.parse_program(); if (dump_ast) program->dump(0); + + if (parser.has_errors()) + continue; + interpreter.run(*program); if (print_last_result) print(interpreter.last_value()); @@ -345,10 +350,16 @@ void repl(JS::Interpreter& interpreter) if (piece.is_empty()) continue; repl_statements.append(piece); - auto program = JS::Parser(JS::Lexer(piece)).parse_program(); + auto parser = JS::Parser(JS::Lexer(piece)); + auto program = parser.parse_program(); if (dump_ast) program->dump(0); + if (parser.has_errors()) { + printf("Parse error\n"); + continue; + } + interpreter.run(*program); if (interpreter.exception()) { printf("Uncaught exception: "); @@ -634,11 +645,17 @@ int main(int argc, char** argv) } else { source = file_contents; } - auto program = JS::Parser(JS::Lexer(source)).parse_program(); + auto parser = JS::Parser(JS::Lexer(source)); + auto program = parser.parse_program(); if (dump_ast) program->dump(0); + if (parser.has_errors()) { + printf("Parse Error\n"); + return 1; + } + auto result = interpreter->run(*program); if (interpreter->exception()) {