| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index ca0e2d86e1c74989d0b35fc02c667a96f94d34d3..7911be0cdbd95aed372f94968888d5f9f367d3aa 100755
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -50,35 +50,22 @@ StaticResource<Scanner::Utf8Decoder> Scanner::utf8_decoder_;
|
| // ----------------------------------------------------------------------------
|
| // UTF8Buffer
|
|
|
| -UTF8Buffer::UTF8Buffer() : data_(NULL), limit_(NULL) { }
|
| +UTF8Buffer::UTF8Buffer() : buffer_(kInitialCapacity) { }
|
|
|
|
|
| -UTF8Buffer::~UTF8Buffer() {
|
| - if (data_ != NULL) DeleteArray(data_);
|
| -}
|
| +UTF8Buffer::~UTF8Buffer() {}
|
|
|
|
|
| void UTF8Buffer::AddCharSlow(uc32 c) {
|
| - static const int kCapacityGrowthLimit = 1 * MB;
|
| - if (cursor_ > limit_) {
|
| - int old_capacity = Capacity();
|
| - int old_position = pos();
|
| - int new_capacity =
|
| - Min(old_capacity * 3, old_capacity + kCapacityGrowthLimit);
|
| - char* new_data = NewArray<char>(new_capacity);
|
| - memcpy(new_data, data_, old_position);
|
| - DeleteArray(data_);
|
| - data_ = new_data;
|
| - cursor_ = new_data + old_position;
|
| - limit_ = ComputeLimit(new_data, new_capacity);
|
| - ASSERT(Capacity() == new_capacity && pos() == old_position);
|
| - }
|
| - if (static_cast<unsigned>(c) <= unibrow::Utf8::kMaxOneByteChar) {
|
| - *cursor_++ = c; // Common case: 7-bit ASCII.
|
| - } else {
|
| - cursor_ += unibrow::Utf8::Encode(cursor_, c);
|
| - }
|
| - ASSERT(pos() <= Capacity());
|
| + ASSERT(static_cast<unsigned>(c) > unibrow::Utf8::kMaxOneByteChar);
|
| + int length = unibrow::Utf8::Length(c);
|
| + Vector<char> block = buffer_.AddBlock(length, '\0');
|
| +#ifdef DEBUG
|
| + int written_length = unibrow::Utf8::Encode(block.start(), c);
|
| + CHECK_EQ(length, written_length);
|
| +#else
|
| + unibrow::Utf8::Encode(block.start(), c);
|
| +#endif
|
| }
|
|
|
|
|
| @@ -399,8 +386,8 @@ void Scanner::Init(Handle<String> source,
|
| // Set c0_ (one character ahead)
|
| ASSERT(kCharacterLookaheadBufferSize == 1);
|
| Advance();
|
| - // Initializer current_ to not refer to a literal buffer.
|
| - current_.literal_buffer = NULL;
|
| + // Initialise current_ to not refer to a literal.
|
| + current_.literal_chars = Vector<const char>();
|
|
|
| // Skip initial whitespace allowing HTML comment ends just like
|
| // after a newline and scan first token.
|
| @@ -428,24 +415,16 @@ Token::Value Scanner::Next() {
|
|
|
|
|
| void Scanner::StartLiteral() {
|
| - // 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();
|
| + literal_buffer_.StartLiteral();
|
| }
|
|
|
|
|
| void Scanner::AddChar(uc32 c) {
|
| - next_.literal_buffer->AddChar(c);
|
| + literal_buffer_.AddChar(c);
|
| }
|
|
|
| -
|
| void Scanner::TerminateLiteral() {
|
| - AddChar(0);
|
| + next_.literal_chars = literal_buffer_.EndLiteral();
|
| }
|
|
|
|
|
| @@ -575,7 +554,7 @@ Token::Value Scanner::ScanHtmlComment() {
|
|
|
|
|
| void Scanner::ScanJson() {
|
| - next_.literal_buffer = NULL;
|
| + next_.literal_chars = Vector<const char>();
|
| Token::Value token;
|
| has_line_terminator_before_next_ = false;
|
| do {
|
| @@ -761,7 +740,7 @@ Token::Value Scanner::ScanJsonIdentifier(const char* text,
|
|
|
|
|
| void Scanner::ScanJavaScript() {
|
| - next_.literal_buffer = NULL;
|
| + next_.literal_chars = Vector<const char>();
|
| Token::Value token;
|
| has_line_terminator_before_next_ = false;
|
| do {
|
|
|