Chromium Code Reviews| Index: src/x87/code-stubs-x87.cc |
| diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc |
| index 5da200d66e8c6b60d66dd9deeaabb10197981820..58200bca823db3112af0f8addc38c3f44bf9ecbf 100644 |
| --- a/src/x87/code-stubs-x87.cc |
| +++ b/src/x87/code-stubs-x87.cc |
| @@ -4288,7 +4288,7 @@ void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| // ----------- S t a t e ------------- |
| - // -- eax : argc (only if argument_count() == ANY) |
| + // -- eax : argc (only if argument_count() is ANY or MORE_THAN_ONE) |
| // -- ebx : AllocationSite or undefined |
| // -- edi : constructor |
| // -- edx : Original constructor |
| @@ -4322,9 +4322,6 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| __ cmp(ebx, isolate()->factory()->undefined_value()); |
| __ j(equal, &no_info); |
| - __ cmp(edx, edi); |
|
Dmitry Lomov (no reviews)
2015/03/23 17:42:49
Why this comparison and branch got removed?
The la
|
| - __ j(not_equal, &subclassing); |
| - |
| // Only look at the lower 16 bits of the transition info. |
| __ mov(edx, FieldOperand(ebx, AllocationSite::kTransitionInfoOffset)); |
| __ SmiUntag(edx); |
| @@ -4335,8 +4332,29 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| __ bind(&no_info); |
| GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
| + // Subclassing. |
| __ bind(&subclassing); |
| - __ TailCallRuntime(Runtime::kThrowArrayNotSubclassableError, 0, 1); |
| + __ pop(ecx); // return address. |
| + __ push(edi); |
| + __ push(edx); |
| + |
| + // Adjust argc. |
| + switch (argument_count()) { |
| + case ANY: |
| + case MORE_THAN_ONE: |
| + __ add(eax, Immediate(2)); |
| + break; |
| + case NONE: |
| + __ mov(eax, Immediate(2)); |
| + break; |
| + case ONE: |
| + __ mov(eax, Immediate(3)); |
| + break; |
| + } |
| + |
| + __ push(ecx); |
| + __ JumpToExternalReference( |
| + ExternalReference(Runtime::kArrayConstructorWithSubclassing, isolate())); |
| } |