| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index 23b8aff9c41488001bf12fb475aaf6ff46a91963..0d3b789f9b31a6a501748bbb4b3dd0ae61bdd755 100644
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -49,17 +49,11 @@ 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() {
|
| - DeleteArray(data_);
|
| + if (data_ != NULL) DeleteArray(data_);
|
| }
|
|
|
|
|
| @@ -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,12 +340,11 @@ 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();
|
| + // Initializer current_ to not refer to a literal buffer.
|
| + current_.literal_buffer = NULL;
|
|
|
| // Skip initial whitespace allowing HTML comment ends just like
|
| // after a newline and scan first token.
|
| @@ -384,17 +377,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);
|
| }
|
|
|
| @@ -514,6 +513,7 @@ Token::Value Scanner::ScanHtmlComment() {
|
|
|
|
|
| void Scanner::Scan() {
|
| + next_.literal_buffer = NULL;
|
| Token::Value token;
|
| has_line_terminator_before_next_ = false;
|
| do {
|
|
|