Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Features shared by parsing and pre-parsing scanners. | 5 // Features shared by parsing and pre-parsing scanners. |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 894 Advance(); | 894 Advance(); |
| 895 uc32 result = ScanHexNumber(4); | 895 uc32 result = ScanHexNumber(4); |
| 896 if (result < 0) PushBack('u'); | 896 if (result < 0) PushBack('u'); |
| 897 return result; | 897 return result; |
| 898 } | 898 } |
| 899 | 899 |
| 900 | 900 |
| 901 // ---------------------------------------------------------------------------- | 901 // ---------------------------------------------------------------------------- |
| 902 // Keyword Matcher | 902 // Keyword Matcher |
| 903 | 903 |
| 904 #define KEYWORDS(KEYWORD_GROUP, KEYWORD) \ | 904 #define KEYWORDS(KEYWORD_GROUP, KEYWORD) \ |
| 905 KEYWORD_GROUP('b') \ | 905 KEYWORD_GROUP('b') \ |
| 906 KEYWORD("break", Token::BREAK) \ | 906 KEYWORD("break", Token::BREAK) \ |
| 907 KEYWORD_GROUP('c') \ | 907 KEYWORD_GROUP('c') \ |
| 908 KEYWORD("case", Token::CASE) \ | 908 KEYWORD("case", Token::CASE) \ |
| 909 KEYWORD("catch", Token::CATCH) \ | 909 KEYWORD("catch", Token::CATCH) \ |
| 910 KEYWORD("class", Token::FUTURE_RESERVED_WORD) \ | 910 KEYWORD("class", Token::FUTURE_RESERVED_WORD) \ |
|
arv (Not doing code reviews)
2014/08/15 19:41:07
I see your comment is not really reflecting this.
Dmitry Lomov (no reviews)
2014/08/15 22:11:41
Updated comment to reflect reality of this patch.
| |
| 911 KEYWORD("const", Token::CONST) \ | 911 KEYWORD("const", Token::CONST) \ |
| 912 KEYWORD("continue", Token::CONTINUE) \ | 912 KEYWORD("continue", Token::CONTINUE) \ |
| 913 KEYWORD_GROUP('d') \ | 913 KEYWORD_GROUP('d') \ |
| 914 KEYWORD("debugger", Token::DEBUGGER) \ | 914 KEYWORD("debugger", Token::DEBUGGER) \ |
| 915 KEYWORD("default", Token::DEFAULT) \ | 915 KEYWORD("default", Token::DEFAULT) \ |
| 916 KEYWORD("delete", Token::DELETE) \ | 916 KEYWORD("delete", Token::DELETE) \ |
| 917 KEYWORD("do", Token::DO) \ | 917 KEYWORD("do", Token::DO) \ |
| 918 KEYWORD_GROUP('e') \ | 918 KEYWORD_GROUP('e') \ |
| 919 KEYWORD("else", Token::ELSE) \ | 919 KEYWORD("else", Token::ELSE) \ |
| 920 KEYWORD("enum", Token::FUTURE_RESERVED_WORD) \ | 920 KEYWORD("enum", Token::FUTURE_RESERVED_WORD) \ |
| 921 KEYWORD("export", harmony_modules \ | 921 KEYWORD("export", \ |
| 922 ? Token::EXPORT : Token::FUTURE_RESERVED_WORD) \ | 922 harmony_modules ? Token::EXPORT : Token::FUTURE_RESERVED_WORD) \ |
| 923 KEYWORD("extends", Token::FUTURE_RESERVED_WORD) \ | 923 KEYWORD("extends", Token::FUTURE_RESERVED_WORD) \ |
| 924 KEYWORD_GROUP('f') \ | 924 KEYWORD_GROUP('f') \ |
| 925 KEYWORD("false", Token::FALSE_LITERAL) \ | 925 KEYWORD("false", Token::FALSE_LITERAL) \ |
| 926 KEYWORD("finally", Token::FINALLY) \ | 926 KEYWORD("finally", Token::FINALLY) \ |
| 927 KEYWORD("for", Token::FOR) \ | 927 KEYWORD("for", Token::FOR) \ |
| 928 KEYWORD("function", Token::FUNCTION) \ | 928 KEYWORD("function", Token::FUNCTION) \ |
| 929 KEYWORD_GROUP('i') \ | 929 KEYWORD_GROUP('i') \ |
| 930 KEYWORD("if", Token::IF) \ | 930 KEYWORD("if", Token::IF) \ |
| 931 KEYWORD("implements", Token::FUTURE_STRICT_RESERVED_WORD) \ | 931 KEYWORD("implements", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 932 KEYWORD("import", harmony_modules \ | 932 KEYWORD("import", \ |
| 933 ? Token::IMPORT : Token::FUTURE_RESERVED_WORD) \ | 933 harmony_modules ? Token::IMPORT : Token::FUTURE_RESERVED_WORD) \ |
| 934 KEYWORD("in", Token::IN) \ | 934 KEYWORD("in", Token::IN) \ |
| 935 KEYWORD("instanceof", Token::INSTANCEOF) \ | 935 KEYWORD("instanceof", Token::INSTANCEOF) \ |
| 936 KEYWORD("interface", Token::FUTURE_STRICT_RESERVED_WORD) \ | 936 KEYWORD("interface", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 937 KEYWORD_GROUP('l') \ | 937 KEYWORD_GROUP('l') \ |
| 938 KEYWORD("let", harmony_scoping \ | 938 KEYWORD("let", \ |
| 939 ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \ | 939 harmony_scoping ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 940 KEYWORD_GROUP('n') \ | 940 KEYWORD_GROUP('n') \ |
| 941 KEYWORD("new", Token::NEW) \ | 941 KEYWORD("new", Token::NEW) \ |
| 942 KEYWORD("null", Token::NULL_LITERAL) \ | 942 KEYWORD("null", Token::NULL_LITERAL) \ |
| 943 KEYWORD_GROUP('p') \ | 943 KEYWORD_GROUP('p') \ |
| 944 KEYWORD("package", Token::FUTURE_STRICT_RESERVED_WORD) \ | 944 KEYWORD("package", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 945 KEYWORD("private", Token::FUTURE_STRICT_RESERVED_WORD) \ | 945 KEYWORD("private", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 946 KEYWORD("protected", Token::FUTURE_STRICT_RESERVED_WORD) \ | 946 KEYWORD("protected", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 947 KEYWORD("public", Token::FUTURE_STRICT_RESERVED_WORD) \ | 947 KEYWORD("public", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 948 KEYWORD_GROUP('r') \ | 948 KEYWORD_GROUP('r') \ |
| 949 KEYWORD("return", Token::RETURN) \ | 949 KEYWORD("return", Token::RETURN) \ |
| 950 KEYWORD_GROUP('s') \ | 950 KEYWORD_GROUP('s') \ |
| 951 KEYWORD("static", Token::FUTURE_STRICT_RESERVED_WORD) \ | 951 KEYWORD("static", Token::FUTURE_STRICT_RESERVED_WORD) \ |
| 952 KEYWORD("super", Token::FUTURE_RESERVED_WORD) \ | 952 KEYWORD("super", \ |
| 953 KEYWORD("switch", Token::SWITCH) \ | 953 harmony_classes ? Token::SUPER : Token::FUTURE_RESERVED_WORD) \ |
| 954 KEYWORD_GROUP('t') \ | 954 KEYWORD("switch", Token::SWITCH) \ |
| 955 KEYWORD("this", Token::THIS) \ | 955 KEYWORD_GROUP('t') \ |
| 956 KEYWORD("throw", Token::THROW) \ | 956 KEYWORD("this", Token::THIS) \ |
| 957 KEYWORD("true", Token::TRUE_LITERAL) \ | 957 KEYWORD("throw", Token::THROW) \ |
| 958 KEYWORD("try", Token::TRY) \ | 958 KEYWORD("true", Token::TRUE_LITERAL) \ |
| 959 KEYWORD("typeof", Token::TYPEOF) \ | 959 KEYWORD("try", Token::TRY) \ |
| 960 KEYWORD_GROUP('v') \ | 960 KEYWORD("typeof", Token::TYPEOF) \ |
| 961 KEYWORD("var", Token::VAR) \ | 961 KEYWORD_GROUP('v') \ |
| 962 KEYWORD("void", Token::VOID) \ | 962 KEYWORD("var", Token::VAR) \ |
| 963 KEYWORD_GROUP('w') \ | 963 KEYWORD("void", Token::VOID) \ |
| 964 KEYWORD("while", Token::WHILE) \ | 964 KEYWORD_GROUP('w') \ |
| 965 KEYWORD("with", Token::WITH) \ | 965 KEYWORD("while", Token::WHILE) \ |
| 966 KEYWORD_GROUP('y') \ | 966 KEYWORD("with", Token::WITH) \ |
| 967 KEYWORD_GROUP('y') \ | |
| 967 KEYWORD("yield", Token::YIELD) | 968 KEYWORD("yield", Token::YIELD) |
| 968 | 969 |
| 969 | 970 |
| 970 static Token::Value KeywordOrIdentifierToken(const uint8_t* input, | 971 static Token::Value KeywordOrIdentifierToken(const uint8_t* input, |
| 971 int input_length, | 972 int input_length, |
| 972 bool harmony_scoping, | 973 bool harmony_scoping, |
| 973 bool harmony_modules) { | 974 bool harmony_modules, |
| 975 bool harmony_classes) { | |
| 974 DCHECK(input_length >= 1); | 976 DCHECK(input_length >= 1); |
| 975 const int kMinLength = 2; | 977 const int kMinLength = 2; |
| 976 const int kMaxLength = 10; | 978 const int kMaxLength = 10; |
| 977 if (input_length < kMinLength || input_length > kMaxLength) { | 979 if (input_length < kMinLength || input_length > kMaxLength) { |
| 978 return Token::IDENTIFIER; | 980 return Token::IDENTIFIER; |
| 979 } | 981 } |
| 980 switch (input[0]) { | 982 switch (input[0]) { |
| 981 default: | 983 default: |
| 982 #define KEYWORD_GROUP_CASE(ch) \ | 984 #define KEYWORD_GROUP_CASE(ch) \ |
| 983 break; \ | 985 break; \ |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1007 return Token::IDENTIFIER; | 1009 return Token::IDENTIFIER; |
| 1008 } | 1010 } |
| 1009 | 1011 |
| 1010 | 1012 |
| 1011 bool Scanner::IdentifierIsFutureStrictReserved( | 1013 bool Scanner::IdentifierIsFutureStrictReserved( |
| 1012 const AstRawString* string) const { | 1014 const AstRawString* string) const { |
| 1013 // Keywords are always 1-byte strings. | 1015 // Keywords are always 1-byte strings. |
| 1014 return string->is_one_byte() && | 1016 return string->is_one_byte() && |
| 1015 Token::FUTURE_STRICT_RESERVED_WORD == | 1017 Token::FUTURE_STRICT_RESERVED_WORD == |
| 1016 KeywordOrIdentifierToken(string->raw_data(), string->length(), | 1018 KeywordOrIdentifierToken(string->raw_data(), string->length(), |
| 1017 harmony_scoping_, harmony_modules_); | 1019 harmony_scoping_, harmony_modules_, |
| 1020 harmony_classes_); | |
| 1018 } | 1021 } |
| 1019 | 1022 |
| 1020 | 1023 |
| 1021 Token::Value Scanner::ScanIdentifierOrKeyword() { | 1024 Token::Value Scanner::ScanIdentifierOrKeyword() { |
| 1022 DCHECK(unicode_cache_->IsIdentifierStart(c0_)); | 1025 DCHECK(unicode_cache_->IsIdentifierStart(c0_)); |
| 1023 LiteralScope literal(this); | 1026 LiteralScope literal(this); |
| 1024 // Scan identifier start character. | 1027 // Scan identifier start character. |
| 1025 if (c0_ == '\\') { | 1028 if (c0_ == '\\') { |
| 1026 uc32 c = ScanIdentifierUnicodeEscape(); | 1029 uc32 c = ScanIdentifierUnicodeEscape(); |
| 1027 // Only allow legal identifier start characters. | 1030 // Only allow legal identifier start characters. |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1050 return ScanIdentifierSuffix(&literal); | 1053 return ScanIdentifierSuffix(&literal); |
| 1051 } | 1054 } |
| 1052 | 1055 |
| 1053 literal.Complete(); | 1056 literal.Complete(); |
| 1054 | 1057 |
| 1055 if (next_.literal_chars->is_one_byte()) { | 1058 if (next_.literal_chars->is_one_byte()) { |
| 1056 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal(); | 1059 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal(); |
| 1057 return KeywordOrIdentifierToken(chars.start(), | 1060 return KeywordOrIdentifierToken(chars.start(), |
| 1058 chars.length(), | 1061 chars.length(), |
| 1059 harmony_scoping_, | 1062 harmony_scoping_, |
| 1060 harmony_modules_); | 1063 harmony_modules_, |
| 1064 harmony_classes_); | |
| 1061 } | 1065 } |
| 1062 | 1066 |
| 1063 return Token::IDENTIFIER; | 1067 return Token::IDENTIFIER; |
| 1064 } | 1068 } |
| 1065 | 1069 |
| 1066 | 1070 |
| 1067 Token::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) { | 1071 Token::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) { |
| 1068 // Scan the rest of the identifier characters. | 1072 // Scan the rest of the identifier characters. |
| 1069 while (unicode_cache_->IsIdentifierPart(c0_)) { | 1073 while (unicode_cache_->IsIdentifierPart(c0_)) { |
| 1070 if (c0_ == '\\') { | 1074 if (c0_ == '\\') { |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1355 } | 1359 } |
| 1356 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); | 1360 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); |
| 1357 } | 1361 } |
| 1358 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); | 1362 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); |
| 1359 | 1363 |
| 1360 backing_store_.AddBlock(bytes); | 1364 backing_store_.AddBlock(bytes); |
| 1361 return backing_store_.EndSequence().start(); | 1365 return backing_store_.EndSequence().start(); |
| 1362 } | 1366 } |
| 1363 | 1367 |
| 1364 } } // namespace v8::internal | 1368 } } // namespace v8::internal |
| OLD | NEW |