| Index: src/objects-inl.h
 | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h
 | 
| index 9ff35efbcf90aac117d2f1001fed87d705a8741e..638e62b289df6d829aaefe62521cdc96ba2acd92 100644
 | 
| --- a/src/objects-inl.h
 | 
| +++ b/src/objects-inl.h
 | 
| @@ -2517,14 +2517,12 @@ void String::Visit(
 | 
|      String* string,
 | 
|      unsigned offset,
 | 
|      Visitor& visitor,
 | 
| -    ConsOp& consOp,
 | 
| +    ConsOp& cons_op,
 | 
|      int32_t type,
 | 
|      unsigned length) {
 | 
| -
 | 
|    ASSERT(length == static_cast<unsigned>(string->length()));
 | 
|    ASSERT(offset <= length);
 | 
| -
 | 
| -  unsigned sliceOffset = offset;
 | 
| +  unsigned slice_offset = offset;
 | 
|    while (true) {
 | 
|      ASSERT(type == string->map()->instance_type());
 | 
|  
 | 
| @@ -2532,35 +2530,36 @@ void String::Visit(
 | 
|        case kSeqStringTag | kOneByteStringTag:
 | 
|          visitor.VisitOneByteString(
 | 
|              reinterpret_cast<const uint8_t*>(
 | 
| -                SeqOneByteString::cast(string)->GetChars()) + sliceOffset,
 | 
| +                SeqOneByteString::cast(string)->GetChars()) + slice_offset,
 | 
|                  length - offset);
 | 
|          return;
 | 
|  
 | 
|        case kSeqStringTag | kTwoByteStringTag:
 | 
|          visitor.VisitTwoByteString(
 | 
|              reinterpret_cast<const uint16_t*>(
 | 
| -                SeqTwoByteString::cast(string)->GetChars()) + sliceOffset,
 | 
| +                SeqTwoByteString::cast(string)->GetChars()) + slice_offset,
 | 
|                  length - offset);
 | 
|          return;
 | 
|  
 | 
|        case kExternalStringTag | kOneByteStringTag:
 | 
|          visitor.VisitOneByteString(
 | 
|              reinterpret_cast<const uint8_t*>(
 | 
| -                ExternalAsciiString::cast(string)->GetChars()) + sliceOffset,
 | 
| +                ExternalAsciiString::cast(string)->GetChars()) + slice_offset,
 | 
|                  length - offset);
 | 
|          return;
 | 
|  
 | 
|        case kExternalStringTag | kTwoByteStringTag:
 | 
|          visitor.VisitTwoByteString(
 | 
|              reinterpret_cast<const uint16_t*>(
 | 
| -                ExternalTwoByteString::cast(string)->GetChars()) + sliceOffset,
 | 
| +                ExternalTwoByteString::cast(string)->GetChars())
 | 
| +                    + slice_offset,
 | 
|                  length - offset);
 | 
|          return;
 | 
|  
 | 
|        case kSlicedStringTag | kOneByteStringTag:
 | 
|        case kSlicedStringTag | kTwoByteStringTag: {
 | 
|          SlicedString* slicedString = SlicedString::cast(string);
 | 
| -        sliceOffset += slicedString->offset();
 | 
| +        slice_offset += slicedString->offset();
 | 
|          string = slicedString->parent();
 | 
|          type = string->map()->instance_type();
 | 
|          continue;
 | 
| @@ -2568,10 +2567,10 @@ void String::Visit(
 | 
|  
 | 
|        case kConsStringTag | kOneByteStringTag:
 | 
|        case kConsStringTag | kTwoByteStringTag:
 | 
| -        string = consOp.Operate(ConsString::cast(string), &offset, &type,
 | 
| +        string = cons_op.Operate(ConsString::cast(string), &offset, &type,
 | 
|              &length);
 | 
|          if (string == NULL) return;
 | 
| -        sliceOffset = offset;
 | 
| +        slice_offset = offset;
 | 
|          ASSERT(length == static_cast<unsigned>(string->length()));
 | 
|          continue;
 | 
|  
 | 
| @@ -2766,34 +2765,14 @@ unsigned ConsStringIteratorOp::OffsetForDepth(unsigned depth) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -uint32_t ConsStringIteratorOp::MaskForDepth(unsigned depth) {
 | 
| -  return 1 << OffsetForDepth(depth);
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void ConsStringIteratorOp::SetRightDescent() {
 | 
| -  trace_ |= MaskForDepth(depth_ - 1);
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void ConsStringIteratorOp::ClearRightDescent() {
 | 
| -  trace_ &= ~MaskForDepth(depth_ - 1);
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void ConsStringIteratorOp::PushLeft(ConsString* string) {
 | 
|    frames_[depth_++ & kDepthMask] = string;
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void ConsStringIteratorOp::PushRight(ConsString* string, int32_t type) {
 | 
| -  // Inplace update
 | 
| +void ConsStringIteratorOp::PushRight(ConsString* string) {
 | 
| +  // Inplace update.
 | 
|    frames_[(depth_-1) & kDepthMask] = string;
 | 
| -  if (depth_ != 1) return;
 | 
| -  // Optimization: can replace root in this case.
 | 
| -  root_ = string;
 | 
| -  root_type_ = type;
 | 
| -  root_length_ = string->length();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2810,8 +2789,8 @@ void ConsStringIteratorOp::Pop() {
 | 
|  
 | 
|  
 | 
|  void ConsStringIteratorOp::Reset() {
 | 
| -  consumed_ = 0;
 | 
| -  ResetStack();
 | 
| +  depth_ = 0;
 | 
| +  maximum_depth_ = 0;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2820,19 +2799,13 @@ bool ConsStringIteratorOp::HasMore() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void ConsStringIteratorOp::ResetStack() {
 | 
| -  depth_ = 0;
 | 
| -  maximum_depth_ = 0;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  bool ConsStringIteratorOp::ContinueOperation(ContinueResponse* response) {
 | 
| -  bool blewStack;
 | 
| +  bool blew_stack;
 | 
|    int32_t type;
 | 
| -  String* string = NextLeaf(&blewStack, &type);
 | 
| +  unsigned length;
 | 
| +  String* string = NextLeaf(&blew_stack, &type, &length);
 | 
|    // String found.
 | 
|    if (string != NULL) {
 | 
| -    unsigned length = string->length();
 | 
|      consumed_ += length;
 | 
|      response->string_ = string;
 | 
|      response->offset_ = 0;
 | 
| @@ -2841,9 +2814,11 @@ bool ConsStringIteratorOp::ContinueOperation(ContinueResponse* response) {
 | 
|      return true;
 | 
|    }
 | 
|    // Traversal complete.
 | 
| -  if (!blewStack) return false;
 | 
| +  if (!blew_stack) return false;
 | 
|    // Restart search.
 | 
| -  ResetStack();
 | 
| +  Reset();
 | 
| +  // TODO(dcarney) This is unnecessary.
 | 
| +  // After a reset, we don't need a String::Visit
 | 
|    response->string_ = root_;
 | 
|    response->offset_ = consumed_;
 | 
|    response->length_ = root_length_;
 | 
| @@ -2853,14 +2828,14 @@ bool ConsStringIteratorOp::ContinueOperation(ContinueResponse* response) {
 | 
|  
 | 
|  
 | 
|  uint16_t StringCharacterStream::GetNext() {
 | 
| -  ASSERT(buffer8_ != NULL);
 | 
| +  ASSERT((buffer8_ == NULL && end_ == NULL) || buffer8_ < end_);
 | 
|    return is_one_byte_ ? *buffer8_++ : *buffer16_++;
 | 
|  }
 | 
|  
 | 
|  
 | 
|  StringCharacterStream::StringCharacterStream(
 | 
|      String* string, unsigned offset, ConsStringIteratorOp* op)
 | 
| -  : is_one_byte_(true),
 | 
| +  : is_one_byte_(false),
 | 
|      buffer8_(NULL),
 | 
|      end_(NULL),
 | 
|      op_(op) {
 | 
| @@ -2874,11 +2849,7 @@ bool StringCharacterStream::HasMore() {
 | 
|    if (buffer8_ != end_) return true;
 | 
|    if (!op_->HasMore()) return false;
 | 
|    ConsStringIteratorOp::ContinueResponse response;
 | 
| -  // This has been checked above
 | 
| -  if (!op_->ContinueOperation(&response)) {
 | 
| -    UNREACHABLE();
 | 
| -    return false;
 | 
| -  }
 | 
| +  if (!op_->ContinueOperation(&response)) return false;
 | 
|    String::Visit(response.string_,
 | 
|        response.offset_, *this, *op_, response.type_, response.length_);
 | 
|    return true;
 | 
| 
 |