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

Reply via email to