Reviewers: Igor Sheludko,
Message:
PTAL
Description:
Only swap undefined for the global object if necessary in the prologue
BUG=
Please review this at https://codereview.chromium.org/1120093002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+22, -11 lines):
M src/arm/full-codegen-arm.cc
M src/arm64/full-codegen-arm64.cc
M src/compiler.h
M src/compiler.cc
M src/compiler/ast-graph-builder.cc
M src/ia32/full-codegen-ia32.cc
M src/mips/full-codegen-mips.cc
M src/mips64/full-codegen-mips64.cc
M src/x64/full-codegen-x64.cc
M src/x87/full-codegen-x87.cc
Index: src/arm/full-codegen-arm.cc
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc
index
2154b6eb4f9477a8413f035942d5e48152242655..2522b09a68886257be64c5843fd77cb02a36ba94
100644
--- a/src/arm/full-codegen-arm.cc
+++ b/src/arm/full-codegen-arm.cc
@@ -126,7 +126,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
int receiver_offset = info->scope()->num_parameters() * kPointerSize;
__ ldr(r2, MemOperand(sp, receiver_offset));
Index: src/arm64/full-codegen-arm64.cc
diff --git a/src/arm64/full-codegen-arm64.cc
b/src/arm64/full-codegen-arm64.cc
index
d1ee80e54a56a7e838387a7674c5cef3fc141681..af4a6d647d9f3e2d54900a6c863078ab16368888
100644
--- a/src/arm64/full-codegen-arm64.cc
+++ b/src/arm64/full-codegen-arm64.cc
@@ -124,7 +124,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
int receiver_offset = info->scope()->num_parameters() * kXRegSize;
__ Peek(x10, receiver_offset);
Index: src/compiler.cc
diff --git a/src/compiler.cc b/src/compiler.cc
index
ada773c3861eb177629de03f60cc279d8eb2518e..2ad1ff447e26d51a7b4750ab979e8a9b96d0a1bb
100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -214,6 +214,12 @@ bool CompilationInfo::is_simple_parameter_list() {
}
+bool CompilationInfo::MayUseThis() const {
+ return scope()->uses_this() || scope()->inner_uses_this() ||
+ scope()->calls_sloppy_eval();
+}
+
+
int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo>
shared,
SourcePosition position,
int parent_id) {
Index: src/compiler.h
diff --git a/src/compiler.h b/src/compiler.h
index
8e0aab931ca9bb8fa2ad7e9a3b74c1fcf0c0221d..ff3a86a10c47f2db9d32958bb3debfb4be4671ff
100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -148,6 +148,7 @@ class CompilationInfo {
Handle<JSFunction> closure() const;
FunctionLiteral* function() const;
Scope* scope() const;
+ bool MayUseThis() const;
Handle<Context> context() const;
Handle<SharedFunctionInfo> shared_info() const;
bool has_shared_info() const;
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc
b/src/compiler/ast-graph-builder.cc
index
e62e34ef07809b8ee0062614472d09699ac820ce..88422886edeea86ac4d6e8ab9d48cee772484d04
100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -2642,10 +2642,7 @@ Node*
AstGraphBuilder::BuildPatchReceiverToGlobalProxy(Node* receiver) {
// There is no need to perform patching if the receiver is never used.
Note
// that scope predicates are purely syntactical, a call to eval might
still
// inspect the receiver value.
- if (!info()->scope()->uses_this() && !info()->scope()->inner_uses_this()
&&
- !info()->scope()->calls_sloppy_eval()) {
- return receiver;
- }
+ if (!info()->MayUseThis()) return receiver;
IfBuilder receiver_check(this);
Node* undefined = jsgraph()->UndefinedConstant();
Index: src/ia32/full-codegen-ia32.cc
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc
index
6c38b70e5464d4552574034b20008f8837796166..703330142e12aa3b00f90b63f42aa9f6cfc01749
100644
--- a/src/ia32/full-codegen-ia32.cc
+++ b/src/ia32/full-codegen-ia32.cc
@@ -114,7 +114,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
// +1 for return address.
int receiver_offset = (info->scope()->num_parameters() + 1) *
kPointerSize;
Index: src/mips/full-codegen-mips.cc
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
index
24d448d585aa9253ac71cf9f16ca973d020e1e41..0756b092f39f27359e7a441219651c165f5ecb5f
100644
--- a/src/mips/full-codegen-mips.cc
+++ b/src/mips/full-codegen-mips.cc
@@ -134,7 +134,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
int receiver_offset = info->scope()->num_parameters() * kPointerSize;
__ lw(at, MemOperand(sp, receiver_offset));
Index: src/mips64/full-codegen-mips64.cc
diff --git a/src/mips64/full-codegen-mips64.cc
b/src/mips64/full-codegen-mips64.cc
index
b3ed1bb9d83c5e759600275147152f5b8856092c..0e3f0725e6360671947716dd01174da5575199b0
100644
--- a/src/mips64/full-codegen-mips64.cc
+++ b/src/mips64/full-codegen-mips64.cc
@@ -134,7 +134,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
int receiver_offset = info->scope()->num_parameters() * kPointerSize;
__ ld(at, MemOperand(sp, receiver_offset));
Index: src/x64/full-codegen-x64.cc
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
index
94da774891d40872bfa5302e32a52e760bf41823..7f0f66d0e5f7d2686ec10f4c1aeb6ca5684faef8
100644
--- a/src/x64/full-codegen-x64.cc
+++ b/src/x64/full-codegen-x64.cc
@@ -114,7 +114,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
// +1 for return address.
StackArgumentsAccessor args(rsp, info->scope()->num_parameters());
Index: src/x87/full-codegen-x87.cc
diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc
index
3a6edec82be993d679f2ddd75c34726a46a9d4d0..3dbb6d41b128b27ddce603a58aff3e7c49f83d38
100644
--- a/src/x87/full-codegen-x87.cc
+++ b/src/x87/full-codegen-x87.cc
@@ -114,7 +114,8 @@ void FullCodeGenerator::Generate() {
// 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->is_native()) {
+ if (is_sloppy(info->language_mode()) && !info->is_native() &&
+ info->MayUseThis()) {
Label ok;
// +1 for return address.
int receiver_offset = (info->scope()->num_parameters() + 1) *
kPointerSize;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.