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

Side by Side Diff: src/scanner.cc

Issue 1102523003: Implement a 'trial parse' step, that will abort pre-parsing excessively (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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
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 11 matching lines...) Expand all
22 22
23 23
24 Handle<String> LiteralBuffer::Internalize(Isolate* isolate) const { 24 Handle<String> LiteralBuffer::Internalize(Isolate* isolate) const {
25 if (is_one_byte()) { 25 if (is_one_byte()) {
26 return isolate->factory()->InternalizeOneByteString(one_byte_literal()); 26 return isolate->factory()->InternalizeOneByteString(one_byte_literal());
27 } 27 }
28 return isolate->factory()->InternalizeTwoByteString(two_byte_literal()); 28 return isolate->factory()->InternalizeTwoByteString(two_byte_literal());
29 } 29 }
30 30
31 31
32 // 'Safe' default implementation for streams that do not support bookmarks.
33 bool Utf16CharacterStream::SetBookmark() { return false; }
34 bool Utf16CharacterStream::CanResetToBookmark() { return false; }
marja 2015/04/22 16:40:56 I don't get why we need CanResetToBookmark; if Set
35 bool Utf16CharacterStream::ResetToBookmark() { return false; }
marja 2015/04/22 16:40:56 Also here, if we successfully set a bookmark, I'd
36
37
marja 2015/04/22 16:40:56 ... or is there some logic here like "this bookmar
vogelheim 2015/04/22 17:08:35 (answered elsewhere:) The idea is to support a str
32 // ---------------------------------------------------------------------------- 38 // ----------------------------------------------------------------------------
33 // Scanner 39 // Scanner
34 40
35 Scanner::Scanner(UnicodeCache* unicode_cache) 41 Scanner::Scanner(UnicodeCache* unicode_cache)
36 : unicode_cache_(unicode_cache), 42 : unicode_cache_(unicode_cache),
43 bookmark_c0_(-1),
37 octal_pos_(Location::invalid()), 44 octal_pos_(Location::invalid()),
38 harmony_modules_(false), 45 harmony_modules_(false),
39 harmony_classes_(false), 46 harmony_classes_(false),
40 harmony_unicode_(false) {} 47 harmony_unicode_(false) {}
41 48
42 49
43 void Scanner::Initialize(Utf16CharacterStream* source) { 50 void Scanner::Initialize(Utf16CharacterStream* source) {
44 source_ = source; 51 source_ = source;
45 // Need to capture identifiers in order to recognize "get" and "set" 52 // Need to capture identifiers in order to recognize "get" and "set"
46 // in object literals. 53 // in object literals.
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 1426
1420 1427
1421 int Scanner::FindSymbol(DuplicateFinder* finder, int value) { 1428 int Scanner::FindSymbol(DuplicateFinder* finder, int value) {
1422 if (is_literal_one_byte()) { 1429 if (is_literal_one_byte()) {
1423 return finder->AddOneByteSymbol(literal_one_byte_string(), value); 1430 return finder->AddOneByteSymbol(literal_one_byte_string(), value);
1424 } 1431 }
1425 return finder->AddTwoByteSymbol(literal_two_byte_string(), value); 1432 return finder->AddTwoByteSymbol(literal_two_byte_string(), value);
1426 } 1433 }
1427 1434
1428 1435
1436 bool Scanner::SetBookmark() {
1437 bool can_bookmark = (bookmark_c0_ == -1) && source_->SetBookmark();
1438 if (can_bookmark) {
1439 bookmark_c0_ = c0_;
1440 bookmark_current_ = current_;
1441 bookmark_current_.literal_chars = nullptr;
1442 bookmark_current_.raw_literal_chars = nullptr;
1443 bookmark_next_ = next_;
1444 bookmark_next_.literal_chars = nullptr;
1445 bookmark_next_.raw_literal_chars = nullptr;
1446 bookmark_literal_.CopyFrom(next_.literal_chars);
1447 bookmark_raw_literal_.CopyFrom(next_.raw_literal_chars);
1448 }
1449 return can_bookmark;
1450 }
1451
1452
1453 bool Scanner::ResetToBookmark() {
1454 DCHECK(bookmark_c0_ >= 0); // Caller hasn't called SetBookmark.
1455 bool can_reset = CanResetBookmark();
1456 if (can_reset) {
1457 source_->ResetToBookmark();
1458 next_ = bookmark_next_;
1459 current_ = bookmark_current_;
1460 c0_ = bookmark_c0_;
1461
1462 next_.literal_chars = &literal_buffer1_;
1463 next_.literal_chars->CopyFrom(&bookmark_literal_);
1464 next_.raw_literal_chars = &raw_literal_buffer1_;
1465 next_.raw_literal_chars->CopyFrom(&bookmark_raw_literal_);
1466
1467 bookmark_c0_ = -2;
1468 }
1469
1470 return can_reset;
1471 }
1472
1473
1474 bool Scanner::CanResetBookmark() {
1475 return source_->CanResetToBookmark() && BookmarkHasBeenSet();
1476 }
1477
1478
1479 bool Scanner::BookmarkHasBeenSet() { return bookmark_c0_ >= 0; }
1480
1481
1482 bool Scanner::BookmarkHasBeenReset() { return bookmark_c0_ == -2; }
1483
1484
1485 void Scanner::DropBookmark() { bookmark_c0_ = -1; }
1486
1487
1429 int DuplicateFinder::AddOneByteSymbol(Vector<const uint8_t> key, int value) { 1488 int DuplicateFinder::AddOneByteSymbol(Vector<const uint8_t> key, int value) {
1430 return AddSymbol(key, true, value); 1489 return AddSymbol(key, true, value);
1431 } 1490 }
1432 1491
1433 1492
1434 int DuplicateFinder::AddTwoByteSymbol(Vector<const uint16_t> key, int value) { 1493 int DuplicateFinder::AddTwoByteSymbol(Vector<const uint16_t> key, int value) {
1435 return AddSymbol(Vector<const uint8_t>::cast(key), false, value); 1494 return AddSymbol(Vector<const uint8_t>::cast(key), false, value);
1436 } 1495 }
1437 1496
1438 1497
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1559 } 1618 }
1560 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u)); 1619 backing_store_.Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u));
1561 } 1620 }
1562 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f)); 1621 backing_store_.Add(static_cast<uint8_t>(one_byte_length & 0x7f));
1563 1622
1564 backing_store_.AddBlock(bytes); 1623 backing_store_.AddBlock(bytes);
1565 return backing_store_.EndSequence().start(); 1624 return backing_store_.EndSequence().start();
1566 } 1625 }
1567 1626
1568 } } // namespace v8::internal 1627 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698