summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2020-12-14 13:05:24 +0000
committerAndreas Kling <kling@serenityos.org>2020-12-14 22:25:46 +0100
commit0974991d051517802ad319022d9e46313d6cd4d4 (patch)
tree5938efceafbef9807c5b5147f14bbd6ccd07a600
parent6e7edd6e77e1e5e0f5ed341a5fccf66fd4b921e5 (diff)
downloadserenity-0974991d051517802ad319022d9e46313d6cd4d4.zip
LibJS: Don't treat '?.' followed by decimal digit as QuestionMarkPeriod
From the spec: https://tc39.es/ecma262/#sec-punctuators OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] We were missing the lookahead and therefore incorrectly treating any '?.' as TokenType::QuestionMarkPeriod. Fixes #4409.
-rw-r--r--Libraries/LibJS/Lexer.cpp11
-rw-r--r--Libraries/LibJS/Tests/operators/ternary-basic.js4
2 files changed, 11 insertions, 4 deletions
diff --git a/Libraries/LibJS/Lexer.cpp b/Libraries/LibJS/Lexer.cpp
index 047c5437e9..89758ded1c 100644
--- a/Libraries/LibJS/Lexer.cpp
+++ b/Libraries/LibJS/Lexer.cpp
@@ -598,10 +598,13 @@ Token Lexer::next()
auto two_chars_view = m_source.substring_view(m_position - 1, 2);
auto it = s_two_char_tokens.find(two_chars_view.hash(), [&](auto& entry) { return entry.key == two_chars_view; });
if (it != s_two_char_tokens.end()) {
- found_two_char_token = true;
- consume();
- consume();
- token_type = it->value;
+ // OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit]
+ if (!(it->value == TokenType::QuestionMarkPeriod && m_position + 1 < m_source.length() && isdigit(m_source[m_position + 1]))) {
+ found_two_char_token = true;
+ consume();
+ consume();
+ token_type = it->value;
+ }
}
}
diff --git a/Libraries/LibJS/Tests/operators/ternary-basic.js b/Libraries/LibJS/Tests/operators/ternary-basic.js
index 164d01e534..c0f68fdf83 100644
--- a/Libraries/LibJS/Tests/operators/ternary-basic.js
+++ b/Libraries/LibJS/Tests/operators/ternary-basic.js
@@ -14,3 +14,7 @@ test("object values", () => {
expect(o.f ? true : false).toBeTrue();
expect(1 ? o.f : null).toBeTrue();
});
+
+test("issue #4409, '?.' followed by decimal digit", () => {
+ expect("return false?.1:.2").toEvalTo(0.2);
+});