| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <cmath> | 9 #include <cmath> |
| 10 | 10 |
| (...skipping 1248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1259 } else if (c0_ == '\\') { | 1259 } else if (c0_ == '\\') { |
| 1260 // Scan identifier start character. | 1260 // Scan identifier start character. |
| 1261 uc32 c = ScanIdentifierUnicodeEscape(); | 1261 uc32 c = ScanIdentifierUnicodeEscape(); |
| 1262 // Only allow legal identifier start characters. | 1262 // Only allow legal identifier start characters. |
| 1263 if (c < 0 || | 1263 if (c < 0 || |
| 1264 c == '\\' || // No recursive escapes. | 1264 c == '\\' || // No recursive escapes. |
| 1265 !unicode_cache_->IsIdentifierStart(c)) { | 1265 !unicode_cache_->IsIdentifierStart(c)) { |
| 1266 return Token::ILLEGAL; | 1266 return Token::ILLEGAL; |
| 1267 } | 1267 } |
| 1268 AddLiteralChar(c); | 1268 AddLiteralChar(c); |
| 1269 return ScanIdentifierSuffix(&literal); | 1269 return ScanIdentifierOrKeywordSuffix(&literal); |
| 1270 } else { | 1270 } else { |
| 1271 uc32 first_char = c0_; | 1271 uc32 first_char = c0_; |
| 1272 Advance(); | 1272 Advance(); |
| 1273 AddLiteralChar(first_char); | 1273 AddLiteralChar(first_char); |
| 1274 } | 1274 } |
| 1275 | 1275 |
| 1276 // Scan the rest of the identifier characters. | 1276 // Scan the rest of the identifier characters. |
| 1277 while (c0_ >= 0 && unicode_cache_->IsIdentifierPart(c0_)) { | 1277 while (c0_ >= 0 && unicode_cache_->IsIdentifierPart(c0_)) { |
| 1278 if (c0_ != '\\') { | 1278 if (c0_ != '\\') { |
| 1279 uc32 next_char = c0_; | 1279 uc32 next_char = c0_; |
| 1280 Advance(); | 1280 Advance(); |
| 1281 AddLiteralChar(next_char); | 1281 AddLiteralChar(next_char); |
| 1282 continue; | 1282 continue; |
| 1283 } | 1283 } |
| 1284 // Fallthrough if no longer able to complete keyword. | 1284 // Fallthrough if a unicode escape is found. |
| 1285 return ScanIdentifierSuffix(&literal); | 1285 return ScanIdentifierOrKeywordSuffix(&literal); |
| 1286 } | 1286 } |
| 1287 | 1287 |
| 1288 literal.Complete(); | 1288 literal.Complete(); |
| 1289 | 1289 |
| 1290 if (next_.literal_chars->is_one_byte()) { | 1290 if (next_.literal_chars->is_one_byte()) { |
| 1291 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal(); | 1291 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal(); |
| 1292 return KeywordOrIdentifierToken(chars.start(), chars.length()); | 1292 return KeywordOrIdentifierToken(chars.start(), chars.length()); |
| 1293 } | 1293 } |
| 1294 return Token::IDENTIFIER; | 1294 return Token::IDENTIFIER; |
| 1295 } | 1295 } |
| 1296 | 1296 |
| 1297 | 1297 |
| 1298 Token::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) { | 1298 Token::Value Scanner::ScanIdentifierOrKeywordSuffix(LiteralScope* literal) { |
| 1299 // Scan the rest of the identifier characters. | 1299 // Scan the rest of the identifier characters. |
| 1300 while (c0_ >= 0 && unicode_cache_->IsIdentifierPart(c0_)) { | 1300 while (c0_ >= 0 && unicode_cache_->IsIdentifierPart(c0_)) { |
| 1301 if (c0_ == '\\') { | 1301 if (c0_ == '\\') { |
| 1302 uc32 c = ScanIdentifierUnicodeEscape(); | 1302 uc32 c = ScanIdentifierUnicodeEscape(); |
| 1303 // Only allow legal identifier part characters. | 1303 // Only allow legal identifier part characters. |
| 1304 if (c < 0 || | 1304 if (c < 0 || |
| 1305 c == '\\' || | 1305 c == '\\' || |
| 1306 !unicode_cache_->IsIdentifierPart(c)) { | 1306 !unicode_cache_->IsIdentifierPart(c)) { |
| 1307 return Token::ILLEGAL; | 1307 return Token::ILLEGAL; |
| 1308 } | 1308 } |
| 1309 AddLiteralChar(c); | 1309 AddLiteralChar(c); |
| 1310 } else { | 1310 } else { |
| 1311 AddLiteralChar(c0_); | 1311 AddLiteralChar(c0_); |
| 1312 Advance(); | 1312 Advance(); |
| 1313 } | 1313 } |
| 1314 } | 1314 } |
| 1315 literal->Complete(); | 1315 literal->Complete(); |
| 1316 | 1316 |
| 1317 if (next_.literal_chars->is_one_byte()) { |
| 1318 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal(); |
| 1319 return KeywordOrIdentifierToken(chars.start(), chars.length()); |
| 1320 } |
| 1321 |
| 1317 return Token::IDENTIFIER; | 1322 return Token::IDENTIFIER; |
| 1318 } | 1323 } |
| 1319 | 1324 |
| 1320 | 1325 |
| 1321 bool Scanner::ScanRegExpPattern(bool seen_equal) { | 1326 bool Scanner::ScanRegExpPattern(bool seen_equal) { |
| 1322 // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags | 1327 // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags |
| 1323 bool in_character_class = false; | 1328 bool in_character_class = false; |
| 1324 | 1329 |
| 1325 // Previous token is either '/' or '/=', in the second case, the | 1330 // Previous token is either '/' or '/=', in the second case, the |
| 1326 // pattern starts at =. | 1331 // pattern starts at =. |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); | 1620 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); |
| 1616 } | 1621 } |
| 1617 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); | 1622 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); |
| 1618 | 1623 |
| 1619 backing_store_.AddBlock(bytes); | 1624 backing_store_.AddBlock(bytes); |
| 1620 return backing_store_.EndSequence().start(); | 1625 return backing_store_.EndSequence().start(); |
| 1621 } | 1626 } |
| 1622 | 1627 |
| 1623 } // namespace internal | 1628 } // namespace internal |
| 1624 } // namespace v8 | 1629 } // namespace v8 |
| OLD | NEW |