X87: Resolve references to "this" the same way as normal variables
port bd56d279b6
(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 <aperez@igalia.com>.
BUG=
Review URL: https://codereview.chromium.org/1136953010
Cr-Commit-Position: refs/heads/master@{#28390}
This commit is contained in:
parent
5494920a18
commit
6eea252463
@ -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())));
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user