| 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);
|
|
|