Index: src/arm/full-codegen-arm.cc |
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
index f2b195ec9843420a0e6c2011fa2ab043a3caa006..968fcb6251ff08b709f69b8c04dd47a3a6080cc3 100644 |
--- a/src/arm/full-codegen-arm.cc |
+++ b/src/arm/full-codegen-arm.cc |
@@ -1132,19 +1132,29 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
__ b(ne, &fixed_array); |
// We got a map in register r0. Get the enumeration cache from it. |
+ Label no_descriptors; |
__ bind(&use_cache); |
- __ LoadInstanceDescriptors(r0, r1, r2); |
+ |
+ __ EnumLength(r2, r0); |
+ __ cmp(r2, Operand(Smi::FromInt(0))); |
+ __ b(eq, &no_descriptors); |
+ |
+ __ LoadInstanceDescriptors(r0, r1, r4); |
__ ldr(r1, FieldMemOperand(r1, DescriptorArray::kEnumCacheOffset)); |
- __ ldr(r2, FieldMemOperand(r1, DescriptorArray::kEnumCacheBridgeCacheOffset)); |
+ __ ldr(r1, FieldMemOperand(r1, DescriptorArray::kEnumCacheBridgeCacheOffset)); |
// Set up the four remaining stack slots. |
__ push(r0); // Map. |
- __ ldr(r1, FieldMemOperand(r2, FixedArray::kLengthOffset)); |
__ mov(r0, Operand(Smi::FromInt(0))); |
// Push enumeration cache, enumeration cache length (as smi) and zero. |
- __ Push(r2, r1, r0); |
+ __ ldr(r2, FieldMemOperand(r1, FixedArray::kLengthOffset)); |
+ __ Push(r1, r2, r0); |
Jakob Kummerow
2012/08/28 12:24:44
Please try to keep the registers that are being pu
Toon Verwaest
2012/08/28 12:30:23
Done.
|
__ jmp(&loop); |
+ __ bind(&no_descriptors); |
+ __ Drop(1); |
+ __ jmp(&exit); |
+ |
// We got a fixed array in register r0. Iterate through that. |
Label non_proxy; |
__ bind(&fixed_array); |