Chromium Code Reviews| 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)); |
|
antonm
2011/07/27 14:04:49
maybe add an assert that result_ is always a flat
|
| // 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; |
| + 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); |
|
antonm
2011/07/27 14:04:49
again, might be worth adding a generated code chec
|
| // Now check if both strings have the same encoding (ASCII/Two-byte). |
| // r0: first string. |
| // r1: second string. |