Revision: 12096
Author:   [email protected]
Date:     Mon Jul 16 06:38:17 2012
Log:      Fix missing tagging of stack value in finally block.

[email protected]
BUG=chromium:137496
TEST=cctest/test-api/Regress137496

Review URL: https://chromiumcodereview.appspot.com/10787017
http://code.google.com/p/v8/source/detail?r=12096

Modified:
 /branches/bleeding_edge/src/arm/full-codegen-arm.cc
 /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc
 /branches/bleeding_edge/src/mips/full-codegen-mips.cc
 /branches/bleeding_edge/src/x64/full-codegen-x64.cc
 /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/src/arm/full-codegen-arm.cc Fri Jul 13 09:33:27 2012 +++ /branches/bleeding_edge/src/arm/full-codegen-arm.cc Mon Jul 16 06:38:17 2012
@@ -4509,6 +4509,7 @@
       ExternalReference::address_of_has_pending_message(isolate());
   __ mov(ip, Operand(has_pending_message));
   __ ldr(r1, MemOperand(ip));
+  __ SmiTag(r1);
   __ push(r1);

   ExternalReference pending_message_script =
@@ -4529,6 +4530,7 @@
   __ str(r1, MemOperand(ip));

   __ pop(r1);
+  __ SmiUntag(r1);
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ mov(ip, Operand(has_pending_message));
=======================================
--- /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Fri Jul 13 09:33:27 2012 +++ /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Mon Jul 16 06:38:17 2012
@@ -4485,6 +4485,7 @@
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ mov(edx, Operand::StaticVariable(has_pending_message));
+  __ SmiTag(edx);
   __ push(edx);

   ExternalReference pending_message_script =
@@ -4503,6 +4504,7 @@
   __ mov(Operand::StaticVariable(pending_message_script), edx);

   __ pop(edx);
+  __ SmiUntag(edx);
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ mov(Operand::StaticVariable(has_pending_message), edx);
=======================================
--- /branches/bleeding_edge/src/mips/full-codegen-mips.cc Fri Jul 13 02:14:43 2012 +++ /branches/bleeding_edge/src/mips/full-codegen-mips.cc Mon Jul 16 06:38:17 2012
@@ -4545,6 +4545,7 @@
       ExternalReference::address_of_has_pending_message(isolate());
   __ li(at, Operand(has_pending_message));
   __ lw(a1, MemOperand(at));
+  __ SmiTag(a1);
   __ push(a1);

   ExternalReference pending_message_script =
@@ -4565,6 +4566,7 @@
   __ sw(a1, MemOperand(at));

   __ pop(a1);
+  __ SmiUntag(a1);
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ li(at, Operand(has_pending_message));
=======================================
--- /branches/bleeding_edge/src/x64/full-codegen-x64.cc Fri Jul 13 09:33:27 2012 +++ /branches/bleeding_edge/src/x64/full-codegen-x64.cc Mon Jul 16 06:38:17 2012
@@ -4477,6 +4477,7 @@
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ Load(rdx, has_pending_message);
+  __ Integer32ToSmi(rdx, rdx);
   __ push(rdx);

   ExternalReference pending_message_script =
@@ -4496,6 +4497,7 @@
   __ Store(pending_message_script, rdx);

   __ pop(rdx);
+  __ SmiToInteger32(rdx, rdx);
   ExternalReference has_pending_message =
       ExternalReference::address_of_has_pending_message(isolate());
   __ Store(has_pending_message, rdx);
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc     Mon Jul 16 02:53:32 2012
+++ /branches/bleeding_edge/test/cctest/test-api.cc     Mon Jul 16 06:38:17 2012
@@ -16856,3 +16856,17 @@
              "var result = f(obj);");
   CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
 }
+
+
+THREADED_TEST(Regress137496) {
+  i::FLAG_expose_gc = true;
+  v8::HandleScope scope;
+  LocalContext context;
+
+  // Compile a try-finally clause where the finally block causes a GC
+  // while there still is a message pending for external reporting.
+  TryCatch try_catch;
+  try_catch.SetVerbose(true);
+  CompileRun("try { throw new Error(); } finally { gc(); }");
+  CHECK(try_catch.HasCaught());
+}

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to