Title: [245697] trunk/Source/_javascript_Core
Revision
245697
Author
[email protected]
Date
2019-05-23 11:07:49 -0700 (Thu, 23 May 2019)

Log Message

Lexer<T>::parseDecimal ought to ASSERT isASCIIDigit
https://bugs.webkit.org/show_bug.cgi?id=198156

Reviewed by Keith Miller.

* parser/Lexer.cpp:
(JSC::Lexer<T>::parseDecimal):
Add ASSERT -- apparently the issue with doing so earlier was simply
that m_current can be anything at all when m_buffer8 is non-empty.

(JSC::Lexer<T>::lexWithoutClearingLineTerminator):
Clean up a few things in the vicinity of r245655:
 - fix token enum values in a couple of error cases added in the last patch
 - add UNLIKELY for existing error cases that forgot to use it
 - simplify some control flow

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (245696 => 245697)


--- trunk/Source/_javascript_Core/ChangeLog	2019-05-23 18:04:49 UTC (rev 245696)
+++ trunk/Source/_javascript_Core/ChangeLog	2019-05-23 18:07:49 UTC (rev 245697)
@@ -1,3 +1,21 @@
+2019-05-23  Ross Kirsling  <[email protected]>
+
+        Lexer<T>::parseDecimal ought to ASSERT isASCIIDigit
+        https://bugs.webkit.org/show_bug.cgi?id=198156
+
+        Reviewed by Keith Miller.
+
+        * parser/Lexer.cpp:
+        (JSC::Lexer<T>::parseDecimal):
+        Add ASSERT -- apparently the issue with doing so earlier was simply
+        that m_current can be anything at all when m_buffer8 is non-empty.
+
+        (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
+        Clean up a few things in the vicinity of r245655:
+         - fix token enum values in a couple of error cases added in the last patch
+         - add UNLIKELY for existing error cases that forgot to use it
+         - simplify some control flow
+
 2019-05-23  Adrian Perez de Castro  <[email protected]>
 
         Fix a few missing header inclusions often masked by by unified sources

Modified: trunk/Source/_javascript_Core/parser/Lexer.cpp (245696 => 245697)


--- trunk/Source/_javascript_Core/parser/Lexer.cpp	2019-05-23 18:04:49 UTC (rev 245696)
+++ trunk/Source/_javascript_Core/parser/Lexer.cpp	2019-05-23 18:07:49 UTC (rev 245697)
@@ -1678,6 +1678,8 @@
 template <typename T>
 ALWAYS_INLINE auto Lexer<T>::parseDecimal() -> Optional<NumberParseResult>
 {
+    ASSERT(isASCIIDigit(m_current) || m_buffer8.size());
+
     // Optimization: most decimal values fit into 4 bytes.
     uint32_t decimalValue = 0;
 
@@ -2196,16 +2198,14 @@
         }
         if (UNLIKELY(!parseNumberAfterDecimalPoint())) {
             m_lexErrorMessage = "Non-number found after decimal point"_s;
-            token = INVALID_NUMERIC_LITERAL_ERRORTOK;
+            token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
             goto returnError;
         }
         token = DOUBLE;
-        if (isASCIIAlphaCaselessEqual(m_current, 'e')) {
-            if (!parseNumberAfterExponentIndicator()) {
-                m_lexErrorMessage = "Non-number found after exponent indicator"_s;
-                token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
-                goto returnError;
-            }
+        if (UNLIKELY(isASCIIAlphaCaselessEqual(m_current, 'e') && !parseNumberAfterExponentIndicator())) {
+            m_lexErrorMessage = "Non-number found after exponent indicator"_s;
+            token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
+            goto returnError;
         }
         size_t parsedLength;
         tokenData->doubleValue = parseDouble(m_buffer8.data(), m_buffer8.size(), parsedLength);
@@ -2222,7 +2222,7 @@
     case CharacterZero:
         shift();
         if (isASCIIAlphaCaselessEqual(m_current, 'x')) {
-            if (!isASCIIHexDigit(peek(1))) {
+            if (UNLIKELY(!isASCIIHexDigit(peek(1)))) {
                 m_lexErrorMessage = "No hexadecimal digits after '0x'"_s;
                 token = UNTERMINATED_HEX_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2243,7 +2243,7 @@
                 tokenData->radix = 16;
             }
 
-            if (isIdentStart(m_current)) {
+            if (UNLIKELY(isIdentStart(m_current))) {
                 m_lexErrorMessage = "No space between hexadecimal literal and identifier"_s;
                 token = UNTERMINATED_HEX_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2254,7 +2254,7 @@
             break;
         }
         if (isASCIIAlphaCaselessEqual(m_current, 'b')) {
-            if (!isASCIIBinaryDigit(peek(1))) {
+            if (UNLIKELY(!isASCIIBinaryDigit(peek(1)))) {
                 m_lexErrorMessage = "No binary digits after '0b'"_s;
                 token = UNTERMINATED_BINARY_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2275,7 +2275,7 @@
                 tokenData->radix = 2;
             }
 
-            if (isIdentStart(m_current)) {
+            if (UNLIKELY(isIdentStart(m_current))) {
                 m_lexErrorMessage = "No space between binary literal and identifier"_s;
                 token = UNTERMINATED_BINARY_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2287,7 +2287,7 @@
         }
 
         if (isASCIIAlphaCaselessEqual(m_current, 'o')) {
-            if (!isASCIIOctalDigit(peek(1))) {
+            if (UNLIKELY(!isASCIIOctalDigit(peek(1)))) {
                 m_lexErrorMessage = "No octal digits after '0o'"_s;
                 token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2308,7 +2308,7 @@
                 tokenData->radix = 8;
             }
 
-            if (isIdentStart(m_current)) {
+            if (UNLIKELY(isIdentStart(m_current))) {
                 m_lexErrorMessage = "No space between octal literal and identifier"_s;
                 token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK;
                 goto returnError;
@@ -2326,7 +2326,7 @@
         }
 
         record8('0');
-        if (strictMode && isASCIIDigit(m_current)) {
+        if (UNLIKELY(strictMode && isASCIIDigit(m_current))) {
             m_lexErrorMessage = "Decimal integer literals with a leading zero are forbidden in strict mode"_s;
             token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK;
             goto returnError;
@@ -2342,39 +2342,36 @@
     case CharacterNumber:
         if (LIKELY(token != INTEGER && token != DOUBLE)) {
             auto parseNumberResult = parseDecimal();
-            if (parseNumberResult && WTF::holds_alternative<double>(*parseNumberResult)) {
-                tokenData->doubleValue = WTF::get<double>(*parseNumberResult);
-                token = tokenTypeForIntegerLikeToken(tokenData->doubleValue);
-            } else {
-                if (parseNumberResult) {
-                    ASSERT(WTF::get<const Identifier*>(*parseNumberResult));
+            if (parseNumberResult) {
+                if (WTF::holds_alternative<double>(*parseNumberResult)) {
+                    tokenData->doubleValue = WTF::get<double>(*parseNumberResult);
+                    token = tokenTypeForIntegerLikeToken(tokenData->doubleValue);
+                } else {
                     token = BIGINT;
                     shift();
                     tokenData->bigIntString = WTF::get<const Identifier*>(*parseNumberResult);
                     tokenData->radix = 10;
-                } else {
-                    token = INTEGER;
-                    if (m_current == '.') {
-                        shift();
-                        if (UNLIKELY(isASCIIDigit(m_current) && !parseNumberAfterDecimalPoint())) {
-                            m_lexErrorMessage = "Non-number found after decimal point"_s;
-                            token = INVALID_NUMERIC_LITERAL_ERRORTOK;
-                            goto returnError;
-                        }
-                        token = DOUBLE;
+                }
+            } else {
+                token = INTEGER;
+                if (m_current == '.') {
+                    shift();
+                    if (UNLIKELY(isASCIIDigit(m_current) && !parseNumberAfterDecimalPoint())) {
+                        m_lexErrorMessage = "Non-number found after decimal point"_s;
+                        token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
+                        goto returnError;
                     }
-                    if (isASCIIAlphaCaselessEqual(m_current, 'e')) {
-                        if (!parseNumberAfterExponentIndicator()) {
-                            m_lexErrorMessage = "Non-number found after exponent indicator"_s;
-                            token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
-                            goto returnError;
-                        }
-                    }
-                    size_t parsedLength;
-                    tokenData->doubleValue = parseDouble(m_buffer8.data(), m_buffer8.size(), parsedLength);
-                    if (token == INTEGER)
-                        token = tokenTypeForIntegerLikeToken(tokenData->doubleValue);
+                    token = DOUBLE;
                 }
+                if (UNLIKELY(isASCIIAlphaCaselessEqual(m_current, 'e') && !parseNumberAfterExponentIndicator())) {
+                    m_lexErrorMessage = "Non-number found after exponent indicator"_s;
+                    token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK;
+                    goto returnError;
+                }
+                size_t parsedLength;
+                tokenData->doubleValue = parseDouble(m_buffer8.data(), m_buffer8.size(), parsedLength);
+                if (token == INTEGER)
+                    token = tokenTypeForIntegerLikeToken(tokenData->doubleValue);
             }
         }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to