| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index f6c04dcd3840b0a435f867633da949b15c68618b..4052b151648effa708aa2ee784b82e070e7f00d9 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -3489,17 +3489,17 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) {
|
| str1->TryFlatten();
|
| str2->TryFlatten();
|
|
|
| - StringInputBuffer& buf1 =
|
| - *isolate->runtime_state()->string_locale_compare_buf1();
|
| - StringInputBuffer& buf2 =
|
| - *isolate->runtime_state()->string_locale_compare_buf2();
|
| -
|
| - buf1.Reset(str1);
|
| - buf2.Reset(str2);
|
| + ConsStringIteratorOp* op1 =
|
| + isolate->runtime_state()->string_locale_compare_it1();
|
| + ConsStringIteratorOp* op2 =
|
| + isolate->runtime_state()->string_locale_compare_it2();
|
| + // TODO(dcarney) Can do array compares here more efficiently.
|
| + StringCharacterStream stream1(str1, op1);
|
| + StringCharacterStream stream2(str2, op2);
|
|
|
| for (int i = 0; i < end; i++) {
|
| - uint16_t char1 = buf1.GetNext();
|
| - uint16_t char2 = buf2.GetNext();
|
| + uint16_t char1 = stream1.GetNext();
|
| + uint16_t char2 = stream2.GetNext();
|
| if (char1 != char2) return Smi::FromInt(char1 - char2);
|
| }
|
|
|
| @@ -5143,11 +5143,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) {
|
| int escaped_length = 0;
|
| int length = source->length();
|
| {
|
| - Access<StringInputBuffer> buffer(
|
| - isolate->runtime_state()->string_input_buffer());
|
| - buffer->Reset(source);
|
| - while (buffer->has_more()) {
|
| - uint16_t character = buffer->GetNext();
|
| + Access<ConsStringIteratorOp> op(
|
| + isolate->runtime_state()->string_iterator());
|
| + StringCharacterStream stream(source, op.value());
|
| + while (stream.HasMore()) {
|
| + uint16_t character = stream.GetNext();
|
| if (character >= 256) {
|
| escaped_length += 6;
|
| } else if (IsNotEscaped(character)) {
|
| @@ -5175,11 +5175,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) {
|
| String* destination = String::cast(o);
|
| int dest_position = 0;
|
|
|
| - Access<StringInputBuffer> buffer(
|
| - isolate->runtime_state()->string_input_buffer());
|
| - buffer->Rewind();
|
| - while (buffer->has_more()) {
|
| - uint16_t chr = buffer->GetNext();
|
| + Access<ConsStringIteratorOp> op(
|
| + isolate->runtime_state()->string_iterator());
|
| + StringCharacterStream stream(source, op.value());
|
| + while (stream.HasMore()) {
|
| + uint16_t chr = stream.GetNext();
|
| if (chr >= 256) {
|
| destination->Set(dest_position, '%');
|
| destination->Set(dest_position+1, 'u');
|
| @@ -5717,15 +5717,15 @@ MUST_USE_RESULT static MaybeObject* ConvertCaseHelper(
|
|
|
| // Convert all characters to upper case, assuming that they will fit
|
| // in the buffer
|
| - Access<StringInputBuffer> buffer(
|
| - isolate->runtime_state()->string_input_buffer());
|
| - buffer->Reset(s);
|
| + Access<ConsStringIteratorOp> op(
|
| + isolate->runtime_state()->string_iterator());
|
| + StringCharacterStream stream(s, op.value());
|
| unibrow::uchar chars[Converter::kMaxWidth];
|
| // We can assume that the string is not empty
|
| - uc32 current = buffer->GetNext();
|
| + uc32 current = stream.GetNext();
|
| for (int i = 0; i < length;) {
|
| - bool has_next = buffer->has_more();
|
| - uc32 next = has_next ? buffer->GetNext() : 0;
|
| + bool has_next = stream.HasMore();
|
| + uc32 next = has_next ? stream.GetNext() : 0;
|
| int char_length = mapping->get(current, next, chars);
|
| if (char_length == 0) {
|
| // The case conversion of this character is the character itself.
|
| @@ -5755,8 +5755,8 @@ MUST_USE_RESULT static MaybeObject* ConvertCaseHelper(
|
| if (next_length == 0) next_length = 1;
|
| }
|
| int current_length = i + char_length + next_length;
|
| - while (buffer->has_more()) {
|
| - current = buffer->GetNext();
|
| + while (stream.HasMore()) {
|
| + current = stream.GetNext();
|
| // NOTE: we use 0 as the next character here because, while
|
| // the next character may affect what a character converts to,
|
| // it does not in any case affect the length of what it convert
|
| @@ -6960,23 +6960,21 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) {
|
| }
|
|
|
|
|
| -static Object* StringInputBufferCompare(RuntimeState* state,
|
| +static Object* StringCharacterStreamCompare(RuntimeState* state,
|
| String* x,
|
| String* y) {
|
| - StringInputBuffer& bufx = *state->string_input_buffer_compare_bufx();
|
| - StringInputBuffer& bufy = *state->string_input_buffer_compare_bufy();
|
| - bufx.Reset(x);
|
| - bufy.Reset(y);
|
| - while (bufx.has_more() && bufy.has_more()) {
|
| - int d = bufx.GetNext() - bufy.GetNext();
|
| + StringCharacterStream stream_x(x, state->string_iterator_compare_x());
|
| + StringCharacterStream stream_y(y, state->string_iterator_compare_y());
|
| + while (stream_x.HasMore() && stream_y.HasMore()) {
|
| + int d = stream_x.GetNext() - stream_y.GetNext();
|
| if (d < 0) return Smi::FromInt(LESS);
|
| else if (d > 0) return Smi::FromInt(GREATER);
|
| }
|
|
|
| // x is (non-trivial) prefix of y:
|
| - if (bufy.has_more()) return Smi::FromInt(LESS);
|
| + if (stream_y.HasMore()) return Smi::FromInt(LESS);
|
| // y is prefix of x:
|
| - return Smi::FromInt(bufx.has_more() ? GREATER : EQUAL);
|
| + return Smi::FromInt(stream_x.HasMore() ? GREATER : EQUAL);
|
| }
|
|
|
|
|
| @@ -7020,7 +7018,7 @@ static Object* FlatStringCompare(String* x, String* y) {
|
| result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
|
| }
|
| ASSERT(result ==
|
| - StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y));
|
| + StringCharacterStreamCompare(Isolate::Current()->runtime_state(), x, y));
|
| return result;
|
| }
|
|
|
| @@ -7056,7 +7054,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) {
|
| }
|
|
|
| return (x->IsFlat() && y->IsFlat()) ? FlatStringCompare(x, y)
|
| - : StringInputBufferCompare(isolate->runtime_state(), x, y);
|
| + : StringCharacterStreamCompare(isolate->runtime_state(), x, y);
|
| }
|
|
|
|
|
| @@ -9885,9 +9883,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) {
|
| ASSERT(args.length() == 1);
|
|
|
| CONVERT_ARG_CHECKED(String, string, 0);
|
| - StringInputBuffer buffer(string);
|
| - while (buffer.has_more()) {
|
| - uint16_t character = buffer.GetNext();
|
| + ConsStringIteratorOp op;
|
| + StringCharacterStream stream(string, &op);
|
| + while (stream.HasMore()) {
|
| + uint16_t character = stream.GetNext();
|
| PrintF("%c", character);
|
| }
|
| return string;
|
|
|