diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index d8ab3f7a40..764f6b5833 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -861,6 +861,8 @@ NonnullRefPtr Parser::parse_string_literal(Token token, bool in_t syntax_error(message, token.line_number(), token.line_column()); } + auto is_use_strict_directive = token.value() == "'use strict'" || token.value() == "\"use strict\""; + // It is possible for string literals to precede a Use Strict Directive that places the // enclosing code in strict mode, and implementations must take care to not use this // extended definition of EscapeSequence with such literals. For example, attempting to @@ -868,15 +870,14 @@ NonnullRefPtr Parser::parse_string_literal(Token token, bool in_t // // function invalid() { "\7"; "use strict"; } - if (m_parser_state.m_string_legacy_octal_escape_sequence_in_scope && string == "use strict") + if (m_parser_state.m_string_legacy_octal_escape_sequence_in_scope && is_use_strict_directive) syntax_error("Octal escape sequence in string literal not allowed in strict mode"); if (m_parser_state.m_use_strict_directive == UseStrictDirectiveState::Looking) { - if (string == "use strict" && token.type() != TokenType::TemplateLiteralString) { + if (is_use_strict_directive) m_parser_state.m_use_strict_directive = UseStrictDirectiveState::Found; - } else { + else m_parser_state.m_use_strict_directive = UseStrictDirectiveState::None; - } } return create_ast_node(string); diff --git a/Libraries/LibJS/Tests/use-strict-directive.js b/Libraries/LibJS/Tests/use-strict-directive.js new file mode 100644 index 0000000000..3979ca6dd8 --- /dev/null +++ b/Libraries/LibJS/Tests/use-strict-directive.js @@ -0,0 +1,48 @@ +test("valid 'use strict; directive", () => { + expect( + (() => { + "use strict"; + return isStrictMode(); + })() + ).toBeTrue(); + expect( + (() => { + 'use strict'; + return isStrictMode(); + })() + ).toBeTrue(); +}); + +test("invalid 'use strict; directive", () => { + expect( + (() => { + " use strict "; + return isStrictMode(); + })() + ).toBeFalse(); + expect( + (() => { + `use strict`; + return isStrictMode(); + })() + ).toBeFalse(); + expect( + (() => { + "use\ + strict"; + return isStrictMode(); + })() + ).toBeFalse(); + expect( + (() => { + "use\ strict"; + return isStrictMode(); + })() + ).toBeFalse(); + expect( + (() => { + "use \163trict"; + return isStrictMode(); + })() + ).toBeFalse(); +});