Revision: 6308
Author: [email protected]
Date: Fri Jan 14 02:49:18 2011
Log: Fix bug when the scanner does a pushback at the end of input.
We don't advance the input cursor past the end of input, so we shouldn't
decrease it when we pushback the kEndOfInput marker.
Review URL: http://codereview.chromium.org/6246004
http://code.google.com/p/v8/source/detail?r=6308
Modified:
/branches/bleeding_edge/src/preparser-api.cc
/branches/bleeding_edge/src/scanner-base.h
/branches/bleeding_edge/src/scanner.cc
/branches/bleeding_edge/src/scanner.h
=======================================
--- /branches/bleeding_edge/src/preparser-api.cc Tue Jan 4 04:07:16 2011
+++ /branches/bleeding_edge/src/preparser-api.cc Fri Jan 14 02:49:18 2011
@@ -69,8 +69,12 @@
}
}
- virtual void PushBack(uc16 ch) {
+ virtual void PushBack(uc32 ch) {
ASSERT(pos_ > 0);
+ if (ch == kEndOfInput) {
+ pos_--;
+ return;
+ }
if (buffer_cursor_ <= pushback_buffer_) {
// No more room in the current buffer to do pushbacks.
if (pushback_buffer_end_cache_ == NULL) {
@@ -98,7 +102,8 @@
buffer_end_ = pushback_buffer_backing_ +
pushback_buffer_backing_size_;
}
}
- pushback_buffer_[buffer_cursor_ - pushback_buffer_- 1] = ch;
+ pushback_buffer_[buffer_cursor_ - pushback_buffer_- 1] =
+ static_cast<uc16>(ch);
pos_--;
}
=======================================
--- /branches/bleeding_edge/src/scanner-base.h Tue Jan 4 03:25:59 2011
+++ /branches/bleeding_edge/src/scanner-base.h Fri Jan 14 02:49:18 2011
@@ -64,10 +64,10 @@
// Returns and advances past the next UC16 character in the input
// stream. If there are no more characters, it returns a negative
// value.
- inline int32_t Advance() {
+ inline uc32 Advance() {
if (buffer_cursor_ < buffer_end_ || ReadBlock()) {
pos_++;
- return *(buffer_cursor_++);
+ return static_cast<uc32>(*(buffer_cursor_++));
}
// Note: currently the following increment is necessary to avoid a
// parser problem! The scanner treats the final kEndOfInput as
@@ -97,13 +97,14 @@
return SlowSeekForward(character_count);
}
- // Pushes back the most recently read UC16 character, i.e.,
- // the value returned by the most recent call to Advance.
+ // Pushes back the most recently read UC16 character (or negative
+ // value if at end of input), i.e., the value returned by the most recent
+ // call to Advance.
// Must not be used right after calling SeekForward.
- virtual void PushBack(uc16 character) = 0;
+ virtual void PushBack(int32_t character) = 0;
protected:
- static const int32_t kEndOfInput = -1;
+ static const uc32 kEndOfInput = -1;
// Ensures that the buffer_cursor_ points to the character at
// position pos_ of the input, if possible. If the position
=======================================
--- /branches/bleeding_edge/src/scanner.cc Mon Jan 3 02:51:34 2011
+++ /branches/bleeding_edge/src/scanner.cc Fri Jan 14 02:49:18 2011
@@ -48,14 +48,18 @@
BufferedUC16CharacterStream::~BufferedUC16CharacterStream() { }
-void BufferedUC16CharacterStream::PushBack(uc16 character) {
+void BufferedUC16CharacterStream::PushBack(uc32 character) {
+ if (character == kEndOfInput) {
+ pos_--;
+ return;
+ }
if (pushback_limit_ == NULL && buffer_cursor_ > buffer_) {
// buffer_ is writable, buffer_cursor_ is const pointer.
- buffer_[--buffer_cursor_ - buffer_] = character;
+ buffer_[--buffer_cursor_ - buffer_] = static_cast<uc16>(character);
pos_--;
return;
}
- SlowPushBack(character);
+ SlowPushBack(static_cast<uc16>(character));
}
=======================================
--- /branches/bleeding_edge/src/scanner.h Wed Dec 22 12:14:19 2010
+++ /branches/bleeding_edge/src/scanner.h Fri Jan 14 02:49:18 2011
@@ -43,7 +43,7 @@
BufferedUC16CharacterStream();
virtual ~BufferedUC16CharacterStream();
- virtual void PushBack(uc16 character);
+ virtual void PushBack(uc32 character);
protected:
static const unsigned kBufferSize = 512;
@@ -107,11 +107,12 @@
int end_position);
virtual ~ExternalTwoByteStringUC16CharacterStream();
- virtual void PushBack(uc16 character) {
+ virtual void PushBack(uc32 character) {
ASSERT(buffer_cursor_ > raw_data_);
buffer_cursor_--;
pos_--;
}
+
protected:
virtual unsigned SlowSeekForward(unsigned delta) {
// Fast case always handles seeking.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev