Reviewers: arv,

Description:
Fix clobbered register when setting this_function variable.

[email protected]
TEST=mjsunit/regress/regress-crbug-498022
BUG=chromium:498022
LOG=N

Please review this at https://codereview.chromium.org/1185703002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+38, -6 lines):
  M src/arm/full-codegen-arm.cc
  M src/arm64/full-codegen-arm64.cc
  M src/ia32/full-codegen-ia32.cc
  M src/mips/full-codegen-mips.cc
  M src/mips64/full-codegen-mips64.cc
  M src/ppc/full-codegen-ppc.cc
  M src/x64/full-codegen-x64.cc
  M src/x87/full-codegen-x87.cc
  A + test/mjsunit/regress/regress-crbug-498022.js


Index: src/arm/full-codegen-arm.cc
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc
index a2f24400a4fc53612d0b5123f618266a89f75bfb..32e7a545378906854db9cd68f5b67b1073f7e5b1 100644
--- a/src/arm/full-codegen-arm.cc
+++ b/src/arm/full-codegen-arm.cc
@@ -243,6 +243,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+ __ ldr(r1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, r1, r0, r2);
   }

Index: src/arm64/full-codegen-arm64.cc
diff --git a/src/arm64/full-codegen-arm64.cc b/src/arm64/full-codegen-arm64.cc index 454bf03ddcbd2862c1ea02a5edc63437c020e3fa..d35f28479a932772b43fc494ea7efbdc2b31ad9d 100644
--- a/src/arm64/full-codegen-arm64.cc
+++ b/src/arm64/full-codegen-arm64.cc
@@ -244,6 +244,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register_x1) {
+ __ Ldr(x1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register_x1 = true;
+    }
     SetVar(this_function_var, x1, x0, x2);
   }

Index: src/ia32/full-codegen-ia32.cc
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc
index 202740b385cc93bef3ba8e9a966d8d6a2708f004..6cbe73fd70178f2831e9ec47fc279f4fab1d1f40 100644
--- a/src/ia32/full-codegen-ia32.cc
+++ b/src/ia32/full-codegen-ia32.cc
@@ -239,6 +239,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+      __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, edi, ebx, edx);
   }

Index: src/mips/full-codegen-mips.cc
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
index 2440f9838362534dd70a472b133c2670b92824a7..e6fee96d35d066e4aea276aa24f330237a0a87ef 100644
--- a/src/mips/full-codegen-mips.cc
+++ b/src/mips/full-codegen-mips.cc
@@ -252,6 +252,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+      __ lw(a1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, a1, a2, a3);
   }

Index: src/mips64/full-codegen-mips64.cc
diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index 572b5b3a77569a637834ccfff86a49b553da7e04..34e37b37bf7edb85249e2816736e3323af534ea5 100644
--- a/src/mips64/full-codegen-mips64.cc
+++ b/src/mips64/full-codegen-mips64.cc
@@ -249,6 +249,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+      __ ld(a1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, a1, a2, a3);
   }

Index: src/ppc/full-codegen-ppc.cc
diff --git a/src/ppc/full-codegen-ppc.cc b/src/ppc/full-codegen-ppc.cc
index ebd7efe8fbdb5534631ed245aa7fae530a2f119f..493a1f9c7246226bc60f0b8a30f9a9fa1e14f7ae 100644
--- a/src/ppc/full-codegen-ppc.cc
+++ b/src/ppc/full-codegen-ppc.cc
@@ -248,6 +248,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+ __ LoadP(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, r4, r3, r5);
   }

Index: src/x64/full-codegen-x64.cc
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
index ed29faf4ed424d5fa0898ae2a8f48fdc47b3a5a7..64c56e2e07b2c4e93fe077f2f4f67c3d3942960c 100644
--- a/src/x64/full-codegen-x64.cc
+++ b/src/x64/full-codegen-x64.cc
@@ -235,6 +235,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+ __ movp(rdi, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, rdi, rbx, rdx);
   }

Index: src/x87/full-codegen-x87.cc
diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc
index e2abd9d311181c39cf4e8b17f26aea0c4138bf1d..f934d37385ae148462fe3f59d3ce3681a7fd4d13 100644
--- a/src/x87/full-codegen-x87.cc
+++ b/src/x87/full-codegen-x87.cc
@@ -236,6 +236,10 @@ void FullCodeGenerator::Generate() {
   Variable* this_function_var = scope()->this_function_var();
   if (this_function_var != nullptr) {
     Comment cmnt(masm_, "[ This function");
+    if (!function_in_register) {
+      __ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
+      function_in_register = true;
+    }
     SetVar(this_function_var, edi, ebx, edx);
   }

Index: test/mjsunit/regress/regress-crbug-498022.js
diff --git a/test/mjsunit/harmony/regress/regress-455141.js b/test/mjsunit/regress/regress-crbug-498022.js
similarity index 63%
copy from test/mjsunit/harmony/regress/regress-455141.js
copy to test/mjsunit/regress/regress-crbug-498022.js
index cf2141f903839222e1065fe49cdaabdd47b1e64d..cb8e0a460df7ed1189ccfa2781754f446b752b3f 100644
--- a/test/mjsunit/harmony/regress/regress-455141.js
+++ b/test/mjsunit/regress/regress-crbug-498022.js
@@ -1,15 +1,15 @@
 // Copyright 2015 the V8 project authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-//
-// Flags: --harmony-classes --no-lazy
+
+// Flags: --debug-code --nouse-gvn
+
 "use strict";
 class Base {
 }
-class Subclass extends Base {
+class Derived extends Base {
   constructor() {
-      this.prp1 = 3;
+    eval();
   }
 }
-function __f_1(){
-}
+assertThrows("new Derived()", ReferenceError);


--
--
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.

Reply via email to