From 9b6a1cca5df8ad8990c1f42025d84e32c4699a92 Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Thu, 29 Oct 2009 07:31:23 +0000 Subject: [PATCH] Reverting 3153 TBR=erik.corry@gmail.com Review URL: http://codereview.chromium.org/341031 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3170 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/runtime.cc | 51 +++++++++----------------------------------------- src/string.js | 9 +++------ 2 files changed, 12 insertions(+), 48 deletions(-) diff --git a/src/runtime.cc b/src/runtime.cc index 76520e3aa..8ed13f239 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -1357,9 +1357,8 @@ class ReplacementStringBuilder { StringBuilderSubstringPosition::encode(from); AddElement(Smi::FromInt(encoded_slice)); } else { - // Otherwise encode as two smis. - AddElement(Smi::FromInt(-length)); - AddElement(Smi::FromInt(from)); + Handle slice = Factory::NewStringSlice(subject_, from, to); + AddElement(*slice); } IncrementCharacterCount(length); } @@ -3767,21 +3766,9 @@ static inline void StringBuilderConcatHelper(String* special, for (int i = 0; i < array_length; i++) { Object* element = fixed_array->get(i); if (element->IsSmi()) { - // Smi encoding of position and length. int encoded_slice = Smi::cast(element)->value(); - int pos; - int len; - if (encoded_slice > 0) { - // Position and length encoded in one smi. - pos = StringBuilderSubstringPosition::decode(encoded_slice); - len = StringBuilderSubstringLength::decode(encoded_slice); - } else { - // Position and length encoded in two smis. - Object* obj = fixed_array->get(++i); - ASSERT(obj->IsSmi()); - pos = Smi::cast(obj)->value(); - len = -encoded_slice; - } + int pos = StringBuilderSubstringPosition::decode(encoded_slice); + int len = StringBuilderSubstringLength::decode(encoded_slice); String::WriteToFlat(special, sink + position, pos, @@ -3802,10 +3789,6 @@ static Object* Runtime_StringBuilderConcat(Arguments args) { ASSERT(args.length() == 2); CONVERT_CHECKED(JSArray, array, args[0]); CONVERT_CHECKED(String, special, args[1]); - - // This assumption is used by the slice encoding in one or two smis. - ASSERT(Smi::kMaxValue >= String::kMaxLength); - int special_length = special->length(); Object* smi_array_length = array->length(); if (!smi_array_length->IsSmi()) { @@ -3833,29 +3816,13 @@ static Object* Runtime_StringBuilderConcat(Arguments args) { for (int i = 0; i < array_length; i++) { Object* elt = fixed_array->get(i); if (elt->IsSmi()) { - // Smi encoding of position and length. int len = Smi::cast(elt)->value(); - if (len > 0) { - // Position and length encoded in one smi. - int pos = len >> 11; - len &= 0x7ff; - if (pos + len > special_length) { - return Top::Throw(Heap::illegal_argument_symbol()); - } - position += len; - } else { - // Position and length encoded in two smis. - position += (-len); - // Get the position and check that it is also a smi. - i++; - if (i >= array_length) { - return Top::Throw(Heap::illegal_argument_symbol()); - } - Object* pos = fixed_array->get(i); - if (!pos->IsSmi()) { - return Top::Throw(Heap::illegal_argument_symbol()); - } + int pos = len >> 11; + len &= 0x7ff; + if (pos + len > special_length) { + return Top::Throw(Heap::illegal_argument_symbol()); } + position += len; } else if (elt->IsString()) { String* element = String::cast(elt); int element_length = element->length(); diff --git a/src/string.js b/src/string.js index bb2ad4f2a..d2d6e969d 100644 --- a/src/string.js +++ b/src/string.js @@ -1,4 +1,4 @@ -// Copyright 2006-2009 the V8 project authors. All rights reserved. +// Copyright 2006-2008 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -810,13 +810,10 @@ ReplaceResultBuilder.prototype.addSpecialSlice = function(start, end) { var len = end - start; if (len == 0) return; var elements = this.elements; - if (start < 0x80000 && len < 0x800) { + if (start >= 0 && len >= 0 && start < 0x80000 && len < 0x800) { elements[elements.length] = (start << 11) + len; } else { - // 0 < len <= String::kMaxLength and Smi::kMaxValue >= String::kMaxLength, - // so -len is a smi. - elements[elements.length] = -len; - elements[elements.length] = start; + elements[elements.length] = SubString(this.special_string, start, end); } } -- 2.34.1