Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 6378) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -3703,7 +3703,6 @@ |
// StringCharCodeAtGenerator |
- |
void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
Label flat_string; |
Label ascii_string; |
@@ -4862,6 +4861,56 @@ |
} |
+void StringCharAtStub::Generate(MacroAssembler* masm) { |
+ // Expects two arguments (object, index) on the stack: |
+ // lr: return address |
+ // sp[0]: index |
+ // sp[4]: object |
+ Register object = r1; |
+ Register index = r0; |
+ Register scratch1 = r2; |
+ Register scratch2 = r3; |
+ Register result = r0; |
+ |
+ // Get object and index from the stack. |
+ __ pop(index); |
+ __ pop(object); |
+ |
+ Label need_conversion; |
+ Label index_out_of_range; |
+ Label done; |
+ StringCharAtGenerator generator(object, |
+ index, |
+ scratch1, |
+ scratch2, |
+ result, |
+ &need_conversion, |
+ &need_conversion, |
+ &index_out_of_range, |
+ STRING_INDEX_IS_NUMBER); |
+ generator.GenerateFast(masm); |
+ __ b(&done); |
+ |
+ __ bind(&index_out_of_range); |
+ // When the index is out of range, the spec requires us to return |
+ // the empty string. |
+ __ LoadRoot(result, Heap::kEmptyStringRootIndex); |
+ __ jmp(&done); |
+ |
+ __ bind(&need_conversion); |
+ // Move smi zero into the result register, which will trigger |
+ // conversion. |
+ __ mov(result, Operand(Smi::FromInt(0))); |
+ __ jmp(&done); |
+ |
+ StubRuntimeCallHelper call_helper; |
Søren Thygesen Gjesse
2011/01/19 11:18:03
Control never goes here.
Mads Ager (chromium)
2011/01/19 11:32:42
It does but in a round-about way. |generator| has
|
+ generator.GenerateSlow(masm, call_helper); |
+ |
+ __ bind(&done); |
+ __ Ret(); |
+} |
+ |
+ |
void ICCompareStub::GenerateSmis(MacroAssembler* masm) { |
ASSERT(state_ == CompareIC::SMIS); |
Label miss; |