Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index eaad9f293b330eb0936a5dceeb45ae51bb5f840b..3889371b82e6ff4be438a71ce73ed028676583cf 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -4775,6 +4775,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
Label flat_string; |
Label ascii_string; |
Label got_char_code; |
+ Label sliced_string; |
// If the receiver is a smi trigger the non-string case. |
__ JumpIfSmi(object_, receiver_not_string_); |
@@ -4804,7 +4805,10 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
__ b(eq, &flat_string); |
// Handle non-flat strings. |
- __ tst(result_, Operand(kIsConsStringMask)); |
+ __ and_(result_, result_, Operand(kStringRepresentationMask)); |
+ __ cmp(result_, Operand(kSlicedStringTag)); |
+ __ b(eq, &sliced_string); |
+ __ cmp(result_, Operand(kExternalStringTag)); |
__ b(eq, &call_runtime_); |
// ConsString. |
@@ -4824,6 +4828,15 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
STATIC_ASSERT(kSeqStringTag == 0); |
__ tst(result_, Operand(kStringRepresentationMask)); |
__ b(ne, &call_runtime_); |
+ __ jmp(&flat_string); |
+ |
+ // SlicedString, unpack and add offset. |
+ __ bind(&sliced_string); |
+ __ ldr(result_, FieldMemOperand(object_, SlicedString::kOffsetOffset)); |
+ __ add(scratch_, scratch_, result_); |
+ __ ldr(object_, FieldMemOperand(object_, SlicedString::kParentOffset)); |
+ __ ldr(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); |
+ __ ldrb(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); |
// Check for 1-byte or 2-byte string. |
__ bind(&flat_string); |
@@ -5380,6 +5393,9 @@ void StringHelper::GenerateHashGetHash(MacroAssembler* masm, |
void SubStringStub::Generate(MacroAssembler* masm) { |
Label runtime; |
Yang
2011/07/27 11:51:58
Do not create string slice unless experimental fla
|
+ if (FLAG_string_slices) { |
+ __ jmp(&runtime); |
+ } |
// Stack frame on entry. |
// lr: return address |
// sp[0]: to |
@@ -5918,6 +5934,8 @@ void StringAddStub::Generate(MacroAssembler* masm) { |
__ tst(r4, Operand(kStringRepresentationMask)); |
__ tst(r5, Operand(kStringRepresentationMask), eq); |
__ b(ne, &string_add_runtime); |
+ // We cannot encounter sliced strings here since: |
+ STATIC_ASSERT(SlicedString::kMinLength >= String::kMinNonFlatLength); |
// Now check if both strings have the same encoding (ASCII/Two-byte). |
// r0: first string. |
// r1: second string. |