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 { |