Reviewers: Dmitry Lomov (chromium), dstence, michael_dawson,
Description:
PPC: Handle the case when derived constructor is [[Call]]ed with 0 args.
Port cf53fed972896bf23c037ce7ac9f8e1512463c62
Original commit message:
ArgumentsAdaptorStub for derived constructor (the one that needs
new.target) works in this way:
- If the constructor is invoked via the Construct stub, we know that
actual arguments always include new.target. ``arguments`` object
however should not include a new.target, therefore we remove it.
We achieve this by decrementing the argument count.
- If the constructor is invoked as a call, we do not care for a correct
``arguments`` array since the constructor will immediately throw on
entrance.
The bug is that the call could actually pass 0 actual arguments, but I
decrement unconditionally :(. The fix is to detect this case and avoid
decrementing. ``arguments`` is bogus, but it is ok as constructor
throws.
Long-term we should just remove mucking about with arguments for
new.target and just get it from the stack.
[email protected], [email protected], [email protected]
BUG=
Please review this at https://codereview.chromium.org/1125223002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+4, -0 lines):
M src/ppc/code-stubs-ppc.cc
Index: src/ppc/code-stubs-ppc.cc
diff --git a/src/ppc/code-stubs-ppc.cc b/src/ppc/code-stubs-ppc.cc
index
abcad08f35160815a94ecf827a02e46432dbd5b2..583c368b798e7925236c4ee29c490e8fc03fae90
100644
--- a/src/ppc/code-stubs-ppc.cc
+++ b/src/ppc/code-stubs-ppc.cc
@@ -1980,8 +1980,12 @@ void
ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
__ bind(&adaptor_frame);
__ LoadP(r4, MemOperand(r5,
ArgumentsAdaptorFrameConstants::kLengthOffset));
if (has_new_target()) {
+ __ CmpSmiLiteral(r4, Smi::FromInt(0), r0);
+ Label skip_decrement;
+ __ beq(&skip_decrement);
// Subtract 1 from smi-tagged arguments count.
__ SubSmiLiteral(r4, r4, Smi::FromInt(1), r0);
+ __ bind(&skip_decrement);
}
__ StoreP(r4, MemOperand(sp, 0));
__ SmiToPtrArrayOffset(r6, r4);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.