Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index 344905e212081be287fdbd33d692ebefc9361399..64b1b44e1d9ff3bbb92355f382b3f200c0b489c7 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -1106,18 +1106,29 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
// We got a map in register rax. Get the enumeration cache from it. |
__ bind(&use_cache); |
+ |
+ Label no_descriptors; |
+ |
+ __ EnumLength(rdx, rax); |
+ __ cmpq(rdx, Immediate(0)); |
+ __ j(equal, &no_descriptors); |
+ |
__ LoadInstanceDescriptors(rax, rcx); |
__ movq(rcx, FieldOperand(rcx, DescriptorArray::kEnumCacheOffset)); |
- __ movq(rdx, FieldOperand(rcx, DescriptorArray::kEnumCacheBridgeCacheOffset)); |
+ __ movq(rcx, FieldOperand(rcx, DescriptorArray::kEnumCacheBridgeCacheOffset)); |
// Set up the four remaining stack slots. |
__ push(rax); // Map. |
- __ push(rdx); // Enumeration cache. |
- __ movq(rax, FieldOperand(rdx, FixedArray::kLengthOffset)); |
- __ push(rax); // Enumeration cache length (as smi). |
+ __ push(rcx); // Enumeration cache. |
+ __ Integer32ToSmi(rdx, rdx); |
+ __ push(rdx); // Number of valid entries for the map in the enum cache. |
__ Push(Smi::FromInt(0)); // Initial index. |
__ jmp(&loop); |
+ __ bind(&no_descriptors); |
+ __ addq(rsp, Immediate(kPointerSize)); |
+ __ jmp(&exit); |
+ |
// We got a fixed array in register rax. Iterate through that. |
Label non_proxy; |
__ bind(&fixed_array); |
@@ -2658,7 +2669,8 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( |
__ movq(rdx, FieldOperand(rbx, 0)); |
__ Cmp(rdx, FACTORY->value_of_symbol()); |
__ j(equal, if_false); |
- __ addq(rbx, Immediate(kPointerSize)); |
+ |
+ __ addq(rbx, Immediate(kPointerSize * DescriptorArray::kDescriptorSize)); |
__ bind(&entry); |
__ cmpq(rbx, rcx); |
__ j(not_equal, &loop); |