Changeset 148849 in webkit for trunk/Source/JavaScriptCore/parser/Lexer.cpp
- Timestamp:
- Apr 21, 2013, 4:26:56 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/Lexer.cpp
r148696 r148849 597 597 598 598 template <typename T> 599 intLexer<T>::parseFourDigitUnicodeHex()599 typename Lexer<T>::UnicodeHexValue Lexer<T>::parseFourDigitUnicodeHex() 600 600 { 601 601 T char1 = peek(1); … … 604 604 605 605 if (UNLIKELY(!isASCIIHexDigit(m_current) || !isASCIIHexDigit(char1) || !isASCIIHexDigit(char2) || !isASCIIHexDigit(char3))) 606 return -1;606 return UnicodeHexValue((m_code + 4) >= m_codeEnd ? UnicodeHexValue::IncompleteHex : UnicodeHexValue::InvalidHex); 607 607 608 608 int result = convertUnicode(m_current, char1, char2, char3); … … 611 611 shift(); 612 612 shift(); 613 return result;613 return UnicodeHexValue(result); 614 614 } 615 615 … … 884 884 shift(); 885 885 if (UNLIKELY(m_current != 'u')) 886 return ERRORTOK;887 shift(); 888 intcharacter = parseFourDigitUnicodeHex();889 if (UNLIKELY( character == -1))890 return ERRORTOK;891 UChar ucharacter = static_cast<UChar>(character );886 return atEnd() ? UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK : INVALID_IDENTIFIER_ESCAPE_ERRORTOK; 887 shift(); 888 UnicodeHexValue character = parseFourDigitUnicodeHex(); 889 if (UNLIKELY(!character.isValid())) 890 return character.valueType() == UnicodeHexValue::IncompleteHex ? UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK : INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK; 891 UChar ucharacter = static_cast<UChar>(character.value()); 892 892 if (UNLIKELY(m_buffer16.size() ? !isIdentPart(ucharacter) : !isIdentStart(ucharacter))) 893 return ERRORTOK;893 return INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK; 894 894 if (shouldCreateIdentifier) 895 895 record16(ucharacter); … … 942 942 943 943 template <typename T> 944 template <bool shouldBuildStrings> ALWAYS_INLINE boolLexer<T>::parseString(JSTokenData* tokenData, bool strictMode)944 template <bool shouldBuildStrings> ALWAYS_INLINE typename Lexer<T>::StringParseResult Lexer<T>::parseString(JSTokenData* tokenData, bool strictMode) 945 945 { 946 946 int startingOffset = currentOffset(); … … 970 970 if (!isASCIIHexDigit(m_current) || !isASCIIHexDigit(peek(1))) { 971 971 m_lexErrorMessage = "\\x can only be followed by a hex character sequence"; 972 return false;972 return (atEnd() || (isASCIIHexDigit(m_current) && (m_code + 1 == m_codeEnd))) ? StringUnterminated : StringCannotBeParsed; 973 973 } 974 974 T prev = m_current; … … 1005 1005 tokenData->ident = 0; 1006 1006 1007 return true;1008 } 1009 1010 template <typename T> 1011 template <bool shouldBuildStrings> boolLexer<T>::parseStringSlowCase(JSTokenData* tokenData, bool strictMode)1007 return StringParsedSuccessfully; 1008 } 1009 1010 template <typename T> 1011 template <bool shouldBuildStrings> typename Lexer<T>::StringParseResult Lexer<T>::parseStringSlowCase(JSTokenData* tokenData, bool strictMode) 1012 1012 { 1013 1013 T stringQuoteCharacter = m_current; … … 1035 1035 if (!isASCIIHexDigit(m_current) || !isASCIIHexDigit(peek(1))) { 1036 1036 m_lexErrorMessage = "\\x can only be followed by a hex character sequence"; 1037 return false;1037 return StringCannotBeParsed; 1038 1038 } 1039 1039 T prev = m_current; … … 1044 1044 } else if (m_current == 'u') { 1045 1045 shift(); 1046 intcharacter = parseFourDigitUnicodeHex();1047 if (character != -1) {1046 UnicodeHexValue character = parseFourDigitUnicodeHex(); 1047 if (character.isValid()) { 1048 1048 if (shouldBuildStrings) 1049 record16(character );1049 record16(character.value()); 1050 1050 } else if (m_current == stringQuoteCharacter) { 1051 1051 if (shouldBuildStrings) … … 1053 1053 } else { 1054 1054 m_lexErrorMessage = "\\u can only be followed by a Unicode character sequence"; 1055 return false;1055 return character.valueType() == UnicodeHexValue::IncompleteHex ? StringUnterminated : StringCannotBeParsed; 1056 1056 } 1057 1057 } else if (strictMode && isASCIIDigit(m_current)) { … … 1061 1061 if (character1 != '0' || isASCIIDigit(m_current)) { 1062 1062 m_lexErrorMessage = "The only valid numeric escape in strict mode is '\\0'"; 1063 return false;1063 return StringCannotBeParsed; 1064 1064 } 1065 1065 if (shouldBuildStrings) … … 1091 1091 } else { 1092 1092 m_lexErrorMessage = "Unterminated string constant"; 1093 return false;1093 return StringUnterminated; 1094 1094 } 1095 1095 … … 1104 1104 if (atEnd() || isLineTerminator(m_current)) { 1105 1105 m_lexErrorMessage = "Unexpected EOF"; 1106 return false;1106 return atEnd() ? StringUnterminated : StringCannotBeParsed; 1107 1107 } 1108 1108 // Anything else is just a normal character … … 1119 1119 1120 1120 m_buffer16.resize(0); 1121 return true;1121 return StringParsedSuccessfully; 1122 1122 } 1123 1123 … … 1463 1463 goto start; 1464 1464 m_lexErrorMessage = "Multiline comment was not closed properly"; 1465 token = UNTERMINATED_MULTILINE_COMMENT_ERRORTOK; 1465 1466 goto returnError; 1466 1467 } … … 1582 1583 if (strictMode) { 1583 1584 m_lexErrorMessage = "Octal escapes are forbidden in strict mode"; 1585 token = INVALID_OCTAL_NUMBER_ERRORTOK; 1584 1586 goto returnError; 1585 1587 } … … 1600 1602 if (!parseNumberAfterExponentIndicator()) { 1601 1603 m_lexErrorMessage = "Non-number found after exponent indicator"; 1604 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 1602 1605 goto returnError; 1603 1606 } … … 1612 1615 if (UNLIKELY(isIdentStart(m_current))) { 1613 1616 m_lexErrorMessage = "At least one digit must occur after a decimal point"; 1617 token = atEnd() ? UNTERMINATED_NUMERIC_LITERAL_ERRORTOK : INVALID_NUMERIC_LITERAL_ERRORTOK; 1614 1618 goto returnError; 1615 1619 } … … 1618 1622 case CharacterQuote: 1619 1623 if (lexerFlags & LexerFlagsDontBuildStrings) { 1620 if (UNLIKELY(!parseString<false>(tokenData, strictMode))) 1624 StringParseResult result = parseString<false>(tokenData, strictMode); 1625 if (UNLIKELY(result != StringParsedSuccessfully)) { 1626 token = result == StringUnterminated ? UNTERMINATED_STRING_LITERAL_ERRORTOK : INVALID_STRING_LITERAL_ERRORTOK; 1621 1627 goto returnError; 1628 } 1622 1629 } else { 1623 if (UNLIKELY(!parseString<true>(tokenData, strictMode))) 1630 StringParseResult result = parseString<true>(tokenData, strictMode); 1631 if (UNLIKELY(result != StringParsedSuccessfully)) { 1632 token = result == StringUnterminated ? UNTERMINATED_STRING_LITERAL_ERRORTOK : INVALID_STRING_LITERAL_ERRORTOK; 1624 1633 goto returnError; 1634 } 1625 1635 } 1626 1636 shift(); … … 1644 1654 case CharacterInvalid: 1645 1655 m_lexErrorMessage = invalidCharacterMessage(); 1656 token = ERRORTOK; 1646 1657 goto returnError; 1647 1658 default: 1648 1659 RELEASE_ASSERT_NOT_REACHED(); 1649 1660 m_lexErrorMessage = "Internal Error"; 1661 token = ERRORTOK; 1650 1662 goto returnError; 1651 1663 } … … 1679 1691 tokenLocation->line = m_lineNumber; 1680 1692 tokenLocation->endOffset = currentOffset(); 1681 return ERRORTOK; 1693 RELEASE_ASSERT(token & ErrorTokenFlag); 1694 return token; 1682 1695 } 1683 1696
Note:
See TracChangeset
for help on using the changeset viewer.