| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index 23b8aff9c41488001bf12fb475aaf6ff46a91963..a834150c04788878f71f9b3bf1ee4679112e265c 100644
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -49,13 +49,7 @@ StaticResource<Scanner::Utf8Decoder> Scanner::utf8_decoder_;
|
| // ----------------------------------------------------------------------------
|
| // UTF8Buffer
|
|
|
| -UTF8Buffer::UTF8Buffer() {
|
| - static const int kInitialCapacity = 1 * KB;
|
| - data_ = NewArray<char>(kInitialCapacity);
|
| - limit_ = ComputeLimit(data_, kInitialCapacity);
|
| - Reset();
|
| - ASSERT(Capacity() == kInitialCapacity && pos() == 0);
|
| -}
|
| +UTF8Buffer::UTF8Buffer() : data_(NULL), limit_(NULL) { }
|
|
|
|
|
| UTF8Buffer::~UTF8Buffer() {
|
| @@ -69,7 +63,7 @@ void UTF8Buffer::AddCharSlow(uc32 c) {
|
| int old_capacity = Capacity();
|
| int old_position = pos();
|
| int new_capacity =
|
| - Min(old_capacity * 2, old_capacity + kCapacityGrowthLimit);
|
| + Min(old_capacity * 3, old_capacity + kCapacityGrowthLimit);
|
| char* new_data = NewArray<char>(new_capacity);
|
| memcpy(new_data, data_, old_position);
|
| DeleteArray(data_);
|
| @@ -346,9 +340,6 @@ void Scanner::Init(Handle<String> source, unibrow::CharacterStream* stream,
|
|
|
| position_ = position;
|
|
|
| - // Reset literals buffer
|
| - literals_.Reset();
|
| -
|
| // Set c0_ (one character ahead)
|
| ASSERT(kCharacterLookaheadBufferSize == 1);
|
| Advance();
|
| @@ -376,6 +367,7 @@ Token::Value Scanner::Next() {
|
| if (check.HasOverflowed()) {
|
| stack_overflow_ = true;
|
| next_.token = Token::ILLEGAL;
|
| + next_.literal_buffer = NULL;
|
| } else {
|
| Scan();
|
| }
|
| @@ -384,17 +376,23 @@ Token::Value Scanner::Next() {
|
|
|
|
|
| void Scanner::StartLiteral() {
|
| - next_.literal_pos = literals_.pos();
|
| + // Use the first buffer, unless it's currently in use by the current_ token.
|
| + // In most cases, we won't have two literals/identifiers in a row, so
|
| + // the second buffer won't be used very often and is unlikely to grow much.
|
| + UTF8Buffer* free_buffer =
|
| + (current_.literal_buffer != &literal_buffer_1_) ? &literal_buffer_1_
|
| + : &literal_buffer_2_;
|
| + next_.literal_buffer = free_buffer;
|
| + free_buffer->Reset();
|
| }
|
|
|
|
|
| void Scanner::AddChar(uc32 c) {
|
| - literals_.AddChar(c);
|
| + next_.literal_buffer->AddChar(c);
|
| }
|
|
|
|
|
| void Scanner::TerminateLiteral() {
|
| - next_.literal_end = literals_.pos();
|
| AddChar(0);
|
| }
|
|
|
|
|