Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1053)

Side by Side Diff: src/scanner.cc

Issue 1297253002: [es6] Handle unicode escapes before checking for keywords (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Skip mozilla test Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/scanner.h ('k') | test/mozilla/mozilla.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/scanner.h ('k') | test/mozilla/mozilla.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698