Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 6164) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -2173,7 +2173,30 @@ |
void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { |
- Abort("DoArrayLiteral unimplemented."); |
+ __ ldr(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
+ __ ldr(r3, FieldMemOperand(r3, JSFunction::kLiteralsOffset)); |
+ __ mov(r2, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); |
+ __ mov(r1, Operand(instr->hydrogen()->constant_elements())); |
+ __ Push(r3, r2, r1); |
+ |
+ // Pick the right runtime function or stub to call. |
+ int length = instr->hydrogen()->length(); |
+ if (instr->hydrogen()->IsCopyOnWrite()) { |
+ ASSERT(instr->hydrogen()->depth() == 1); |
+ FastCloneShallowArrayStub::Mode mode = |
+ FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS; |
+ FastCloneShallowArrayStub stub(mode, length); |
+ CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
+ } else if (instr->hydrogen()->depth() > 1) { |
+ CallRuntime(Runtime::kCreateArrayLiteral, 3, instr); |
+ } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { |
+ CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr); |
+ } else { |
+ FastCloneShallowArrayStub::Mode mode = |
+ FastCloneShallowArrayStub::CLONE_ELEMENTS; |
+ FastCloneShallowArrayStub stub(mode, length); |
+ CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
+ } |
} |