Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 23565140bf890caf77a23ab2f313b9125754f19f..eabb22690ab7843ce198eb23a805ff384b1ccea1 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -2122,6 +2122,7 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) { |
__ j(not_equal, &miss); |
__ movp(rbx, rcx); |
+ __ movp(rdx, rdi); |
ArrayConstructorStub stub(masm->isolate(), arg_count()); |
__ TailCallStub(&stub); |
@@ -4572,6 +4573,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
// -- rax : argc |
// -- rbx : AllocationSite or undefined |
// -- rdi : constructor |
+ // -- rdx : original constructor |
// -- rsp[0] : return address |
// -- rsp[8] : last argument |
// ----------------------------------- |
@@ -4592,6 +4594,10 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
__ AssertUndefinedOrAllocationSite(rbx); |
} |
+ Label subclassing; |
+ __ cmpp(rdi, rdx); |
+ __ j(not_equal, &subclassing); |
+ |
Label no_info; |
// If the feedback vector is the undefined value call an array constructor |
// that doesn't use AllocationSites. |
@@ -4607,6 +4613,9 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
__ bind(&no_info); |
GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
+ |
+ __ bind(&subclassing); |
+ __ TailCallRuntime(Runtime::kThrowArrayNotSubclassableError, 0, 1); |
} |