Changeset 245697 in webkit
- Timestamp:
- May 23, 2019 11:07:49 AM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r245681 r245697 1 2019-05-23 Ross Kirsling <ross.kirsling@sony.com> 2 3 Lexer<T>::parseDecimal ought to ASSERT isASCIIDigit 4 https://bugs.webkit.org/show_bug.cgi?id=198156 5 6 Reviewed by Keith Miller. 7 8 * parser/Lexer.cpp: 9 (JSC::Lexer<T>::parseDecimal): 10 Add ASSERT -- apparently the issue with doing so earlier was simply 11 that m_current can be anything at all when m_buffer8 is non-empty. 12 13 (JSC::Lexer<T>::lexWithoutClearingLineTerminator): 14 Clean up a few things in the vicinity of r245655: 15 - fix token enum values in a couple of error cases added in the last patch 16 - add UNLIKELY for existing error cases that forgot to use it 17 - simplify some control flow 18 1 19 2019-05-23 Adrian Perez de Castro <aperez@igalia.com> 2 20 -
trunk/Source/JavaScriptCore/parser/Lexer.cpp
r245655 r245697 1679 1679 ALWAYS_INLINE auto Lexer<T>::parseDecimal() -> Optional<NumberParseResult> 1680 1680 { 1681 ASSERT(isASCIIDigit(m_current) || m_buffer8.size()); 1682 1681 1683 // Optimization: most decimal values fit into 4 bytes. 1682 1684 uint32_t decimalValue = 0; … … 2197 2199 if (UNLIKELY(!parseNumberAfterDecimalPoint())) { 2198 2200 m_lexErrorMessage = "Non-number found after decimal point"_s; 2199 token = INVALID_NUMERIC_LITERAL_ERRORTOK;2201 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2200 2202 goto returnError; 2201 2203 } 2202 2204 token = DOUBLE; 2203 if (isASCIIAlphaCaselessEqual(m_current, 'e')) { 2204 if (!parseNumberAfterExponentIndicator()) { 2205 m_lexErrorMessage = "Non-number found after exponent indicator"_s; 2206 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2207 goto returnError; 2208 } 2205 if (UNLIKELY(isASCIIAlphaCaselessEqual(m_current, 'e') && !parseNumberAfterExponentIndicator())) { 2206 m_lexErrorMessage = "Non-number found after exponent indicator"_s; 2207 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2208 goto returnError; 2209 2209 } 2210 2210 size_t parsedLength; … … 2223 2223 shift(); 2224 2224 if (isASCIIAlphaCaselessEqual(m_current, 'x')) { 2225 if ( !isASCIIHexDigit(peek(1))) {2225 if (UNLIKELY(!isASCIIHexDigit(peek(1)))) { 2226 2226 m_lexErrorMessage = "No hexadecimal digits after '0x'"_s; 2227 2227 token = UNTERMINATED_HEX_NUMBER_ERRORTOK; … … 2244 2244 } 2245 2245 2246 if ( isIdentStart(m_current)) {2246 if (UNLIKELY(isIdentStart(m_current))) { 2247 2247 m_lexErrorMessage = "No space between hexadecimal literal and identifier"_s; 2248 2248 token = UNTERMINATED_HEX_NUMBER_ERRORTOK; … … 2255 2255 } 2256 2256 if (isASCIIAlphaCaselessEqual(m_current, 'b')) { 2257 if ( !isASCIIBinaryDigit(peek(1))) {2257 if (UNLIKELY(!isASCIIBinaryDigit(peek(1)))) { 2258 2258 m_lexErrorMessage = "No binary digits after '0b'"_s; 2259 2259 token = UNTERMINATED_BINARY_NUMBER_ERRORTOK; … … 2276 2276 } 2277 2277 2278 if ( isIdentStart(m_current)) {2278 if (UNLIKELY(isIdentStart(m_current))) { 2279 2279 m_lexErrorMessage = "No space between binary literal and identifier"_s; 2280 2280 token = UNTERMINATED_BINARY_NUMBER_ERRORTOK; … … 2288 2288 2289 2289 if (isASCIIAlphaCaselessEqual(m_current, 'o')) { 2290 if ( !isASCIIOctalDigit(peek(1))) {2290 if (UNLIKELY(!isASCIIOctalDigit(peek(1)))) { 2291 2291 m_lexErrorMessage = "No octal digits after '0o'"_s; 2292 2292 token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK; … … 2309 2309 } 2310 2310 2311 if ( isIdentStart(m_current)) {2311 if (UNLIKELY(isIdentStart(m_current))) { 2312 2312 m_lexErrorMessage = "No space between octal literal and identifier"_s; 2313 2313 token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK; … … 2327 2327 2328 2328 record8('0'); 2329 if ( strictMode && isASCIIDigit(m_current)) {2329 if (UNLIKELY(strictMode && isASCIIDigit(m_current))) { 2330 2330 m_lexErrorMessage = "Decimal integer literals with a leading zero are forbidden in strict mode"_s; 2331 2331 token = UNTERMINATED_OCTAL_NUMBER_ERRORTOK; … … 2343 2343 if (LIKELY(token != INTEGER && token != DOUBLE)) { 2344 2344 auto parseNumberResult = parseDecimal(); 2345 if (parseNumberResult && WTF::holds_alternative<double>(*parseNumberResult)) { 2346 tokenData->doubleValue = WTF::get<double>(*parseNumberResult); 2347 token = tokenTypeForIntegerLikeToken(tokenData->doubleValue); 2348 } else { 2349 if (parseNumberResult) { 2350 ASSERT(WTF::get<const Identifier*>(*parseNumberResult)); 2345 if (parseNumberResult) { 2346 if (WTF::holds_alternative<double>(*parseNumberResult)) { 2347 tokenData->doubleValue = WTF::get<double>(*parseNumberResult); 2348 token = tokenTypeForIntegerLikeToken(tokenData->doubleValue); 2349 } else { 2351 2350 token = BIGINT; 2352 2351 shift(); 2353 2352 tokenData->bigIntString = WTF::get<const Identifier*>(*parseNumberResult); 2354 2353 tokenData->radix = 10; 2355 } else { 2356 token = INTEGER; 2357 if (m_current == '.') { 2358 shift(); 2359 if (UNLIKELY(isASCIIDigit(m_current) && !parseNumberAfterDecimalPoint())) { 2360 m_lexErrorMessage = "Non-number found after decimal point"_s; 2361 token = INVALID_NUMERIC_LITERAL_ERRORTOK; 2362 goto returnError; 2363 } 2364 token = DOUBLE; 2354 } 2355 } else { 2356 token = INTEGER; 2357 if (m_current == '.') { 2358 shift(); 2359 if (UNLIKELY(isASCIIDigit(m_current) && !parseNumberAfterDecimalPoint())) { 2360 m_lexErrorMessage = "Non-number found after decimal point"_s; 2361 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2362 goto returnError; 2365 2363 } 2366 if (isASCIIAlphaCaselessEqual(m_current, 'e')) { 2367 if (!parseNumberAfterExponentIndicator()) { 2368 m_lexErrorMessage = "Non-number found after exponent indicator"_s; 2369 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2370 goto returnError; 2371 } 2372 } 2373 size_t parsedLength; 2374 tokenData->doubleValue = parseDouble(m_buffer8.data(), m_buffer8.size(), parsedLength); 2375 if (token == INTEGER) 2376 token = tokenTypeForIntegerLikeToken(tokenData->doubleValue); 2364 token = DOUBLE; 2377 2365 } 2366 if (UNLIKELY(isASCIIAlphaCaselessEqual(m_current, 'e') && !parseNumberAfterExponentIndicator())) { 2367 m_lexErrorMessage = "Non-number found after exponent indicator"_s; 2368 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 2369 goto returnError; 2370 } 2371 size_t parsedLength; 2372 tokenData->doubleValue = parseDouble(m_buffer8.data(), m_buffer8.size(), parsedLength); 2373 if (token == INTEGER) 2374 token = tokenTypeForIntegerLikeToken(tokenData->doubleValue); 2378 2375 } 2379 2376 }
Note: See TracChangeset
for help on using the changeset viewer.