From 15e018db2d936fa512c46359dcd5919ccdbcf91e Mon Sep 17 00:00:00 2001 From: "balazs.kilvady@imgtec.com" Date: Fri, 17 Oct 2014 11:30:13 +0000 Subject: [PATCH] MIPS: Implement the new semantics for 'super(...)'. Port r24683 (b1533f6) Original commit message: Per the latest ES6 draft, super(...) translates into a call to function's prototype. BUG=v8:3330 LOG=N R=dusan.milosavljevic@imgtec.com Review URL: https://codereview.chromium.org/661043003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24690 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/full-codegen-mips.cc | 9 +++++++++ src/mips64/full-codegen-mips64.cc | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 6f7166b..9f26d4c 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -3049,6 +3049,15 @@ void FullCodeGenerator::VisitCall(Call* expr) { EmitKeyedCallWithLoadIC(expr, property->key()); } } + } else if (call_type == Call::SUPER_CALL) { + SuperReference* super_ref = callee->AsSuperReference(); + DCHECK(super_ref != NULL); + __ lw(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); + __ Push(a0); + __ CallRuntime(Runtime::kGetPrototype, 1); + __ Push(result_register()); + VisitForStackValue(super_ref->this_var()); + EmitCall(expr, CallICState::METHOD); } else { DCHECK(call_type == Call::OTHER_CALL); // Call to an arbitrary expression not handled specially above. diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index 79eec06..1a76c52 100644 --- a/src/mips64/full-codegen-mips64.cc +++ b/src/mips64/full-codegen-mips64.cc @@ -3048,6 +3048,15 @@ void FullCodeGenerator::VisitCall(Call* expr) { EmitKeyedCallWithLoadIC(expr, property->key()); } } + } else if (call_type == Call::SUPER_CALL) { + SuperReference* super_ref = callee->AsSuperReference(); + DCHECK(super_ref != NULL); + __ ld(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); + __ Push(a0); + __ CallRuntime(Runtime::kGetPrototype, 1); + __ Push(result_register()); + VisitForStackValue(super_ref->this_var()); + EmitCall(expr, CallICState::METHOD); } else { DCHECK(call_type == Call::OTHER_CALL); // Call to an arbitrary expression not handled specially above. -- 2.7.4