X87: new classes: implement correct check for uninitialized this in 'super()'

port fdcf3e59ba (r26599)

original commit message:

    new classes: implement correct check for uninitialized this in 'super()'

BUG=
R=weiliang.lin@intel.com

Review URL: https://codereview.chromium.org/913383002

Cr-Commit-Position: refs/heads/master@{#26603}
This commit is contained in:
cdai2 2015-02-12 16:10:56 +08:00
parent 42c30b8f39
commit 71784ec03c

View File

@ -3133,19 +3133,9 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) {
GetVar(eax, new_target_var);
__ push(eax);
SuperReference* super_ref = expr->expression()->AsSuperReference();
EmitLoadSuperConstructor();
__ push(result_register());
Variable* this_var = super_ref->this_var()->var();
GetVar(eax, this_var);
__ cmp(eax, isolate()->factory()->the_hole_value());
Label uninitialized_this;
__ j(equal, &uninitialized_this);
__ push(Immediate(this_var->name()));
__ CallRuntime(Runtime::kThrowReferenceError, 1);
__ bind(&uninitialized_this);
// Push the arguments ("left-to-right") on the stack.
ZoneList<Expression*>* args = expr->arguments();
int arg_count = args->length();
@ -3181,6 +3171,16 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) {
RecordJSReturnSite(expr);
SuperReference* super_ref = expr->expression()->AsSuperReference();
Variable* this_var = super_ref->this_var()->var();
GetVar(ecx, this_var);
__ cmp(ecx, isolate()->factory()->the_hole_value());
Label uninitialized_this;
__ j(equal, &uninitialized_this);
__ push(Immediate(this_var->name()));
__ CallRuntime(Runtime::kThrowReferenceError, 1);
__ bind(&uninitialized_this);
EmitVariableAssignment(this_var, Token::INIT_CONST);
context()->Plug(eax);
}