Index: src/preparser-api.cc |
=================================================================== |
--- src/preparser-api.cc (revision 10944) |
+++ src/preparser-api.cc (working copy) |
@@ -46,10 +46,10 @@ |
namespace internal { |
// UTF16Buffer based on a v8::UnicodeInputStream. |
-class InputStreamUTF16Buffer : public UC16CharacterStream { |
+class InputStreamUtf16Buffer : public Utf16CharacterStream { |
public: |
- /* The InputStreamUTF16Buffer maintains an internal buffer |
- * that is filled in chunks from the UC16CharacterStream. |
+ /* The InputStreamUtf16Buffer maintains an internal buffer |
+ * that is filled in chunks from the Utf16CharacterStream. |
* It also maintains unlimited pushback capability, but optimized |
* for small pushbacks. |
* The pushback_buffer_ pointer points to the limit of pushbacks |
@@ -60,8 +60,8 @@ |
* new buffer. When this buffer is read to the end again, the cursor is |
* switched back to the internal buffer |
*/ |
- explicit InputStreamUTF16Buffer(v8::UnicodeInputStream* stream) |
- : UC16CharacterStream(), |
+ explicit InputStreamUtf16Buffer(v8::UnicodeInputStream* stream) |
+ : Utf16CharacterStream(), |
stream_(stream), |
pushback_buffer_(buffer_), |
pushback_buffer_end_cache_(NULL), |
@@ -70,7 +70,7 @@ |
buffer_cursor_ = buffer_end_ = buffer_ + kPushBackSize; |
} |
- virtual ~InputStreamUTF16Buffer() { |
+ virtual ~InputStreamUtf16Buffer() { |
if (pushback_buffer_backing_ != NULL) { |
DeleteArray(pushback_buffer_backing_); |
} |
@@ -127,12 +127,18 @@ |
uc16* buffer_start = buffer_ + kPushBackSize; |
buffer_cursor_ = buffer_end_ = buffer_start; |
while ((value = stream_->Next()) >= 0) { |
- if (value > static_cast<int32_t>(unibrow::Utf8::kMaxThreeByteChar)) { |
- value = unibrow::Utf8::kBadChar; |
+ if (value > |
+ static_cast<int32_t>(unibrow::Utf16::kMaxNonSurrogateCharCode)) { |
+ buffer_start[buffer_end_++ - buffer_start] = |
+ unibrow::Utf16::LeadSurrogate(value); |
+ buffer_start[buffer_end_++ - buffer_start] = |
+ unibrow::Utf16::TrailSurrogate(value); |
+ } else { |
+ // buffer_end_ is a const pointer, but buffer_ is writable. |
+ buffer_start[buffer_end_++ - buffer_start] = static_cast<uc16>(value); |
} |
- // buffer_end_ is a const pointer, but buffer_ is writable. |
- buffer_start[buffer_end_++ - buffer_start] = static_cast<uc16>(value); |
- if (buffer_end_ == buffer_ + kPushBackSize + kBufferSize) break; |
+ // Stop one before the end of the buffer in case we get a surrogate pair. |
+ if (buffer_end_ <= buffer_ + 1 + kPushBackSize + kBufferSize) break; |
} |
return buffer_end_ > buffer_start; |
} |
@@ -179,7 +185,7 @@ |
PreParserData Preparse(UnicodeInputStream* input, size_t max_stack) { |
- internal::InputStreamUTF16Buffer buffer(input); |
+ internal::InputStreamUtf16Buffer buffer(input); |
uintptr_t stack_limit = reinterpret_cast<uintptr_t>(&buffer) - max_stack; |
internal::UnicodeCache unicode_cache; |
internal::Scanner scanner(&unicode_cache); |