From 6eea252463648d81cf3ae128e6f0d5f815a108bb Mon Sep 17 00:00:00 2001 From: "chunyang.dai" Date: Wed, 13 May 2015 04:18:41 -0700 Subject: [PATCH] X87: Resolve references to "this" the same way as normal variables port bd56d279b612f92d2d1d25f92d32fe7f42a455ca (R28340). original commit message: Make the parser handle references to "this" as unresolved variables, so the same logic as for the rest of function parameters is used for the receiver. Minor additions to the code generation handle copying the receiver to the context, along with the rest of the function parameters. Based on work by Adrian Perez de Castro . BUG= Review URL: https://codereview.chromium.org/1136953010 Cr-Commit-Position: refs/heads/master@{#28390} --- src/x87/full-codegen-x87.cc | 9 ++++++--- src/x87/lithium-codegen-x87.cc | 9 +++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc index 5c51fe3..2ffbc79 100644 --- a/src/x87/full-codegen-x87.cc +++ b/src/x87/full-codegen-x87.cc @@ -210,8 +210,9 @@ void FullCodeGenerator::Generate() { // Copy parameters into context if necessary. int num_parameters = info->scope()->num_parameters(); - for (int i = 0; i < num_parameters; i++) { - Variable* var = scope()->parameter(i); + int first_parameter = info->scope()->has_this_declaration() ? -1 : 0; + for (int i = first_parameter; i < num_parameters; i++) { + Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); if (var->IsContextSlot()) { int parameter_offset = StandardFrameConstants::kCallerSPOffset + (num_parameters - 1 - i) * kPointerSize; @@ -2951,7 +2952,9 @@ void FullCodeGenerator::EmitResolvePossiblyDirectEval(int arg_count) { // Push the enclosing function. __ push(Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); // Push the receiver of the enclosing function. - __ push(Operand(ebp, (2 + info_->scope()->num_parameters()) * kPointerSize)); + Variable* this_var = scope()->LookupThis(); + DCHECK_NOT_NULL(this_var); + __ push(VarOperand(this_var, ecx)); // Push the language mode. __ push(Immediate(Smi::FromInt(language_mode()))); diff --git a/src/x87/lithium-codegen-x87.cc b/src/x87/lithium-codegen-x87.cc index cee37cf..57c1d39 100644 --- a/src/x87/lithium-codegen-x87.cc +++ b/src/x87/lithium-codegen-x87.cc @@ -110,8 +110,8 @@ bool LCodeGen::GeneratePrologue() { // Sloppy mode functions and builtins need to replace the receiver with the // global proxy when called as functions (without an explicit receiver // object). - if (is_sloppy(info_->language_mode()) && info()->MayUseThis() && - !info_->is_native()) { + if (is_sloppy(info()->language_mode()) && info()->MayUseThis() && + !info()->is_native() && info()->scope()->has_this_declaration()) { Label ok; // +1 for return address. int receiver_offset = (scope()->num_parameters() + 1) * kPointerSize; @@ -242,8 +242,9 @@ bool LCodeGen::GeneratePrologue() { // Copy parameters into context if necessary. int num_parameters = scope()->num_parameters(); - for (int i = 0; i < num_parameters; i++) { - Variable* var = scope()->parameter(i); + int first_parameter = scope()->has_this_declaration() ? -1 : 0; + for (int i = first_parameter; i < num_parameters; i++) { + Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); if (var->IsContextSlot()) { int parameter_offset = StandardFrameConstants::kCallerSPOffset + (num_parameters - 1 - i) * kPointerSize; -- 2.7.4