Chromium Code Reviews| 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; |