Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index b85b612d1373527570eaa3da55ad13ef0bdd190f..0a272cf16e2a771fe773731663cc43249f2e0fc3 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -3024,6 +3024,21 @@ void FullCodeGenerator::EmitLoadSuperConstructor() { |
} |
+void FullCodeGenerator::EmitInitializeThisAfterSuper( |
+ SuperReference* super_ref) { |
+ Variable* this_var = super_ref->this_var()->var(); |
+ GetVar(rcx, this_var); |
+ __ CompareRoot(rcx, Heap::kTheHoleValueRootIndex); |
+ Label uninitialized_this; |
+ __ j(equal, &uninitialized_this); |
+ __ Push(this_var->name()); |
+ __ CallRuntime(Runtime::kThrowReferenceError, 1); |
+ __ bind(&uninitialized_this); |
+ |
+ EmitVariableAssignment(this_var, Token::INIT_CONST); |
+} |
+ |
+ |
void FullCodeGenerator::VisitCall(Call* expr) { |
#ifdef DEBUG |
// We want to verify that RecordJSReturnSite gets called on all paths |
@@ -3238,17 +3253,7 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) { |
RecordJSReturnSite(expr); |
- SuperReference* super_ref = expr->expression()->AsSuperReference(); |
- Variable* this_var = super_ref->this_var()->var(); |
- GetVar(rcx, this_var); |
- __ CompareRoot(rcx, Heap::kTheHoleValueRootIndex); |
- Label uninitialized_this; |
- __ j(equal, &uninitialized_this); |
- __ Push(this_var->name()); |
- __ CallRuntime(Runtime::kThrowReferenceError, 1); |
- __ bind(&uninitialized_this); |
- |
- EmitVariableAssignment(this_var, Token::INIT_CONST); |
+ EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference()); |
context()->Plug(rax); |
} |
@@ -4596,7 +4601,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
// Push the arguments ("left-to-right"). |
for (int i = 0; i < arg_count; i++) { |
- VisitForStackValue(args->at(i)); |
+ VisitForStackValue(args->at(i), true); |
} |
// Record source position of the IC call. |
@@ -4608,7 +4613,9 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
// Restore context register. |
__ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
context()->DropAndPlug(1, rax); |
- |
+ if (expr->IsSuperCall()) { |
arv (Not doing code reviews)
2015/03/30 22:19:49
This is a bit strange/hacky. I assume this comes f
caitp (gmail)
2015/03/30 22:38:12
it's kind of a hack, yeah... but, without it, `thi
Dmitry Lomov (no reviews)
2015/03/31 10:09:42
IsSuperCall flag on CallRuntime node is super-hack
|
+ EmitInitializeThisAfterSuper(args->at(0)->AsSuperReference()); |
+ } |
} else { |
const Runtime::Function* function = expr->function(); |
switch (function->function_id) { |