LibJS: Don't VERIFY that the token after 'import' is one of '.' and '('

Although those are the only valid options parse_primary_expression is
sometimes called when only an expression is valid which means it did not
check match_expression and might fail the now removed VERIFY.
This commit is contained in:
davidot 2021-12-29 12:15:29 +01:00 committed by Linus Groh
parent 56c425eec1
commit e179cf2540
Notes: sideshowbarker 2024-07-17 21:58:55 +09:00
2 changed files with 27 additions and 5 deletions

View file

@ -1425,14 +1425,18 @@ Parser::PrimaryExpressionParseResult Parser::parse_primary_expression()
}
case TokenType::Import: {
auto lookahead_token = next_token();
VERIFY(lookahead_token.type() == TokenType::Period || lookahead_token.type() == TokenType::ParenOpen);
if (lookahead_token.type() == TokenType::ParenOpen)
return { parse_import_call() };
if (auto import_meta = try_parse_import_meta_expression()) {
if (m_program_type != Program::Type::Module)
syntax_error("import.meta is only allowed in modules");
return { import_meta.release_nonnull() };
if (lookahead_token.type() == TokenType::Period) {
if (auto import_meta = try_parse_import_meta_expression()) {
if (m_program_type != Program::Type::Module)
syntax_error("import.meta is only allowed in modules");
return { import_meta.release_nonnull() };
}
} else {
consume();
expected("import.meta or import call");
}
break;
}

View file

@ -0,0 +1,18 @@
describe("parsing", () => {
test("can parse call import call", () => {
expect("import('a')").toEval();
expect("import('a', )").toEval();
expect("import('a', {options: true})").toEval();
});
test("does not crash on unexpected tokens after import", () => {
expect("f = import('a')").toEval();
expect("f= import").not.toEval();
expect("f= import;").not.toEval();
expect("f= import?").not.toEval();
expect("f= import'").not.toEval();
expect("f= import 'a'").not.toEval();
expect("f= import['a']").not.toEval();
});
});