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/scanner.h" | 9 #include "src/scanner.h" |
| 10 | 10 |
| 11 #include "include/v8stdint.h" | 11 #include "include/v8stdint.h" |
| 12 #include "src/ast-value-factory.h" | 12 #include "src/ast-value-factory.h" |
| 13 #include "src/char-predicates-inl.h" | 13 #include "src/char-predicates-inl.h" |
| 14 #include "src/conversions-inl.h" | 14 #include "src/conversions-inl.h" |
| 15 #include "src/list-inl.h" | 15 #include "src/list-inl.h" |
| 16 #include "src/v8.h" | 16 #include "src/v8.h" |
| 17 #include "src/parser.h" | 17 #include "src/parser.h" |
| 18 | 18 |
| 19 namespace v8 { | 19 namespace v8 { |
| 20 namespace internal { | 20 namespace internal { |
| 21 | 21 |
| 22 // ---------------------------------------------------------------------------- | 22 // ---------------------------------------------------------------------------- |
| 23 // Scanner | 23 // Scanner |
| 24 | 24 |
| 25 Scanner::Scanner(UnicodeCache* unicode_cache) | 25 Scanner::Scanner(UnicodeCache* unicode_cache) |
| 26 : unicode_cache_(unicode_cache), | 26 : unicode_cache_(unicode_cache), |
| 27 param_list_finder_(unicode_cache_), | |
| 27 octal_pos_(Location::invalid()), | 28 octal_pos_(Location::invalid()), |
| 28 harmony_scoping_(false), | 29 harmony_scoping_(false), |
| 29 harmony_modules_(false), | 30 harmony_modules_(false), |
| 30 harmony_numeric_literals_(false) { } | 31 harmony_numeric_literals_(false) { } |
| 31 | 32 |
| 32 | 33 |
| 33 void Scanner::Initialize(Utf16CharacterStream* source) { | 34 void Scanner::Initialize(Utf16CharacterStream* source) { |
| 34 source_ = source; | 35 source_ = source; |
| 35 // Need to capture identifiers in order to recognize "get" and "set" | 36 // Need to capture identifiers in order to recognize "get" and "set" |
| 36 // in object literals. | 37 // in object literals. |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 203 Token::RBRACE, // 0x7d | 204 Token::RBRACE, // 0x7d |
| 204 Token::BIT_NOT, // 0x7e | 205 Token::BIT_NOT, // 0x7e |
| 205 Token::ILLEGAL | 206 Token::ILLEGAL |
| 206 }; | 207 }; |
| 207 | 208 |
| 208 | 209 |
| 209 Token::Value Scanner::Next() { | 210 Token::Value Scanner::Next() { |
| 210 current_ = next_; | 211 current_ = next_; |
| 211 has_line_terminator_before_next_ = false; | 212 has_line_terminator_before_next_ = false; |
| 212 has_multiline_comment_before_next_ = false; | 213 has_multiline_comment_before_next_ = false; |
| 214 param_list_finder_.Update(this); | |
| 213 if (static_cast<unsigned>(c0_) <= 0x7f) { | 215 if (static_cast<unsigned>(c0_) <= 0x7f) { |
| 214 Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]); | 216 Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]); |
| 215 if (token != Token::ILLEGAL) { | 217 if (token != Token::ILLEGAL) { |
| 216 int pos = source_pos(); | 218 int pos = source_pos(); |
| 217 next_.token = token; | 219 next_.token = token; |
| 218 next_.location.beg_pos = pos; | 220 next_.location.beg_pos = pos; |
| 219 next_.location.end_pos = pos + 1; | 221 next_.location.end_pos = pos + 1; |
| 220 Advance(); | 222 Advance(); |
| 221 return current_.token; | 223 return current_.token; |
| 222 } | 224 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 token = Select('=', Token::ASSIGN_SHR, Token::SHR); | 390 token = Select('=', Token::ASSIGN_SHR, Token::SHR); |
| 389 } else { | 391 } else { |
| 390 token = Token::SAR; | 392 token = Token::SAR; |
| 391 } | 393 } |
| 392 } else { | 394 } else { |
| 393 token = Token::GT; | 395 token = Token::GT; |
| 394 } | 396 } |
| 395 break; | 397 break; |
| 396 | 398 |
| 397 case '=': | 399 case '=': |
| 398 // = == === | 400 // = == === => |
| 399 Advance(); | 401 Advance(); |
| 400 if (c0_ == '=') { | 402 if (c0_ == '=') { |
| 401 token = Select('=', Token::EQ_STRICT, Token::EQ); | 403 token = Select('=', Token::EQ_STRICT, Token::EQ); |
| 404 } else if (c0_ == '>') { | |
| 405 token = Select(Token::ARROW); | |
| 402 } else { | 406 } else { |
| 403 token = Token::ASSIGN; | 407 token = Token::ASSIGN; |
| 404 } | 408 } |
| 405 break; | 409 break; |
| 406 | 410 |
| 407 case '!': | 411 case '!': |
| 408 // ! != !== | 412 // ! != !== |
| 409 Advance(); | 413 Advance(); |
| 410 if (c0_ == '=') { | 414 if (c0_ == '=') { |
| 411 token = Select('=', Token::NE_STRICT, Token::NE); | 415 token = Select('=', Token::NE_STRICT, Token::NE); |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 921 (keyword_length <= 9 || input[9] == keyword[9])) { \ | 925 (keyword_length <= 9 || input[9] == keyword[9])) { \ |
| 922 return token; \ | 926 return token; \ |
| 923 } \ | 927 } \ |
| 924 } | 928 } |
| 925 KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD) | 929 KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD) |
| 926 } | 930 } |
| 927 return Token::IDENTIFIER; | 931 return Token::IDENTIFIER; |
| 928 } | 932 } |
| 929 | 933 |
| 930 | 934 |
| 935 bool Scanner::IdentifierIsFutureStrictReserved(const AstString* string) const { | |
|
marja
2014/06/17 11:47:38
This sounds wrong, since we have a separate token
| |
| 936 if (string->is_one_byte()) { | |
| 937 return Token::FUTURE_STRICT_RESERVED_WORD == KeywordOrIdentifierToken( | |
| 938 string->raw_data(), string->length(), | |
| 939 harmony_scoping_, harmony_modules_); | |
| 940 } | |
| 941 | |
| 942 // Language keywords are always ASCII-only, so we can just pick the | |
| 943 // lower bytes to have a one-byte representation of the keyword. | |
| 944 const unsigned len = string->length(); | |
| 945 Vector<unsigned char> chars = Vector<unsigned char>::New(len); | |
| 946 const uint16_t* uchars = reinterpret_cast<const uint16_t*>(string->raw_data()) ; | |
| 947 | |
| 948 for (unsigned i = 0; i < len; i++) | |
| 949 (chars.start())[i] = 0xFF & uchars[i]; | |
| 950 | |
| 951 bool result = Token::FUTURE_STRICT_RESERVED_WORD == KeywordOrIdentifierToken( | |
| 952 chars.start(), len, harmony_scoping_, harmony_modules_); | |
| 953 chars.Dispose(); | |
| 954 return result; | |
| 955 } | |
| 956 | |
| 957 | |
| 931 Token::Value Scanner::ScanIdentifierOrKeyword() { | 958 Token::Value Scanner::ScanIdentifierOrKeyword() { |
| 932 ASSERT(unicode_cache_->IsIdentifierStart(c0_)); | 959 ASSERT(unicode_cache_->IsIdentifierStart(c0_)); |
| 933 LiteralScope literal(this); | 960 LiteralScope literal(this); |
| 934 // Scan identifier start character. | 961 // Scan identifier start character. |
| 935 if (c0_ == '\\') { | 962 if (c0_ == '\\') { |
| 936 uc32 c = ScanIdentifierUnicodeEscape(); | 963 uc32 c = ScanIdentifierUnicodeEscape(); |
| 937 // Only allow legal identifier start characters. | 964 // Only allow legal identifier start characters. |
| 938 if (c < 0 || | 965 if (c < 0 || |
| 939 c == '\\' || // No recursive escapes. | 966 c == '\\' || // No recursive escapes. |
| 940 !unicode_cache_->IsIdentifierStart(c)) { | 967 !unicode_cache_->IsIdentifierStart(c)) { |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1265 } | 1292 } |
| 1266 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); | 1293 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); |
| 1267 } | 1294 } |
| 1268 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); | 1295 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); |
| 1269 | 1296 |
| 1270 backing_store_.AddBlock(bytes); | 1297 backing_store_.AddBlock(bytes); |
| 1271 return backing_store_.EndSequence().start(); | 1298 return backing_store_.EndSequence().start(); |
| 1272 } | 1299 } |
| 1273 | 1300 |
| 1274 } } // namespace v8::internal | 1301 } } // namespace v8::internal |
| OLD | NEW |