Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 3160) |
+++ src/runtime.cc (working copy) |
@@ -1357,9 +1357,8 @@ |
StringBuilderSubstringPosition::encode(from); |
AddElement(Smi::FromInt(encoded_slice)); |
} else { |
- // Otherwise encode as two smis. |
- AddElement(Smi::FromInt(-length)); |
- AddElement(Smi::FromInt(from)); |
+ Handle<String> slice = Factory::NewStringSlice(subject_, from, to); |
+ AddElement(*slice); |
} |
IncrementCharacterCount(length); |
} |
@@ -3767,21 +3766,9 @@ |
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 @@ |
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 @@ |
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(); |