Revision: 22211
Author:   [email protected]
Date:     Thu Jul  3 20:21:00 2014 UTC
Log:      Revert "Remove unnecessary check in RegExpExecStub."

This reverts r22203 and r22205.

[email protected]

Review URL: https://codereview.chromium.org/369063005
http://code.google.com/p/v8/source/detail?r=22211

Deleted:
 /branches/bleeding_edge/test/mjsunit/regexp-stack-overflow.js
Modified:
 /branches/bleeding_edge/src/arm/code-stubs-arm.cc
 /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc
 /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
 /branches/bleeding_edge/src/mips/code-stubs-mips.cc
 /branches/bleeding_edge/src/x64/code-stubs-x64.cc

=======================================
--- /branches/bleeding_edge/test/mjsunit/regexp-stack-overflow.js Thu Jul 3 14:57:55 2014 UTC
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 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: --stack-size=100
-
-var result = null;
-var re = /\w/;
-re.test("a");  // Trigger regexp compile.
-
-function rec() {
-  try {
-    return rec();
-  } catch (e) {
-    return re.test("b");
-  }
-}
-
-assertTrue(rec());
=======================================
--- /branches/bleeding_edge/src/arm/code-stubs-arm.cc Thu Jul 3 17:01:14 2014 UTC +++ /branches/bleeding_edge/src/arm/code-stubs-arm.cc Thu Jul 3 20:21:00 2014 UTC
@@ -2520,12 +2520,17 @@
   __ cmp(r0, Operand(NativeRegExpMacroAssembler::EXCEPTION));
// If not exception it can only be retry. Handle that in the runtime system.
   __ b(ne, &runtime);
-
-  // Result must now be exception.
+ // Result must now be exception. If there is no pending exception already a + // stack overflow (on the backtrack stack) was detected in RegExp code but
+  // haven't created the exception yet. Handle that in the runtime system.
+  // TODO(592): Rerunning the RegExp to get the stack overflow exception.
   __ mov(r1, Operand(isolate()->factory()->the_hole_value()));
   __ mov(r2, Operand(ExternalReference(Isolate::kPendingExceptionAddress,
                                        isolate())));
   __ ldr(r0, MemOperand(r2, 0));
+  __ cmp(r0, r1);
+  __ b(eq, &runtime);
+
   __ str(r1, MemOperand(r2, 0));  // Clear pending exception.

   // Check if the exception is a termination. If so, throw as uncatchable.
=======================================
--- /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc Thu Jul 3 14:03:10 2014 UTC +++ /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc Thu Jul 3 20:21:00 2014 UTC
@@ -2855,12 +2855,17 @@

   __ Bind(&exception);
   Register exception_value = x0;
-  // Result must now be exception.
+  // A stack overflow (on the backtrack stack) may have occured
+  // in the RegExp code but no exception has been created yet.
+  // If there is no pending exception, handle that in the runtime system.
   __ Mov(x10, Operand(isolate()->factory()->the_hole_value()));
   __ Mov(x11,
          Operand(ExternalReference(Isolate::kPendingExceptionAddress,
                                    isolate())));
   __ Ldr(exception_value, MemOperand(x11));
+  __ Cmp(x10, exception_value);
+  __ B(eq, &runtime);
+
   __ Str(x10, MemOperand(x11));  // Clear pending exception.

   // Check if the exception is a termination. If so, throw as uncatchable.
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Thu Jul 3 14:03:10 2014 UTC +++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Thu Jul 3 20:21:00 2014 UTC
@@ -1596,14 +1596,19 @@
   __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION);
// If not exception it can only be retry. Handle that in the runtime system.
   __ j(not_equal, &runtime);
-
-  // Result must now be exception.
+ // Result must now be exception. If there is no pending exception already a + // stack overflow (on the backtrack stack) was detected in RegExp code but
+  // haven't created the exception yet. Handle that in the runtime system.
+  // TODO(592): Rerunning the RegExp to get the stack overflow exception.
   ExternalReference pending_exception(Isolate::kPendingExceptionAddress,
                                       isolate());
   __ mov(edx, Immediate(isolate()->factory()->the_hole_value()));
   __ mov(eax, Operand::StaticVariable(pending_exception));
+  __ cmp(edx, eax);
+  __ j(equal, &runtime);
+  // For exception, throw the exception again.

-  // Clear pending exception.
+  // Clear the pending exception variable.
   __ mov(Operand::StaticVariable(pending_exception), edx);

   // Special handling of termination exceptions which are uncatchable
=======================================
--- /branches/bleeding_edge/src/mips/code-stubs-mips.cc Thu Jul 3 16:22:34 2014 UTC +++ /branches/bleeding_edge/src/mips/code-stubs-mips.cc Thu Jul 3 20:21:00 2014 UTC
@@ -2670,12 +2670,16 @@
__ Branch(&failure, eq, v0, Operand(NativeRegExpMacroAssembler::FAILURE)); // If not exception it can only be retry. Handle that in the runtime system. __ Branch(&runtime, ne, v0, Operand(NativeRegExpMacroAssembler::EXCEPTION));
-
-  // Result must now be exception.
+ // Result must now be exception. If there is no pending exception already a + // stack overflow (on the backtrack stack) was detected in RegExp code but
+  // haven't created the exception yet. Handle that in the runtime system.
+  // TODO(592): Rerunning the RegExp to get the stack overflow exception.
   __ li(a1, Operand(isolate()->factory()->the_hole_value()));
   __ li(a2, Operand(ExternalReference(Isolate::kPendingExceptionAddress,
                                       isolate())));
   __ lw(v0, MemOperand(a2, 0));
+  __ Branch(&runtime, eq, v0, Operand(a1));
+
   __ sw(a1, MemOperand(a2, 0));  // Clear pending exception.

   // Check if the exception is a termination. If so, throw as uncatchable.
=======================================
--- /branches/bleeding_edge/src/x64/code-stubs-x64.cc Thu Jul 3 14:03:10 2014 UTC +++ /branches/bleeding_edge/src/x64/code-stubs-x64.cc Thu Jul 3 20:21:00 2014 UTC
@@ -1574,14 +1574,19 @@
   __ ret(REG_EXP_EXEC_ARGUMENT_COUNT * kPointerSize);

   __ bind(&exception);
-  // Result must now be exception.
+ // Result must now be exception. If there is no pending exception already a + // stack overflow (on the backtrack stack) was detected in RegExp code but
+  // haven't created the exception yet. Handle that in the runtime system.
+  // TODO(592): Rerunning the RegExp to get the stack overflow exception.
   ExternalReference pending_exception_address(
       Isolate::kPendingExceptionAddress, isolate());
   Operand pending_exception_operand =
       masm->ExternalOperand(pending_exception_address, rbx);
+  __ movp(rax, pending_exception_operand);
   __ LoadRoot(rdx, Heap::kTheHoleValueRootIndex);
-  __ movp(rax, pending_exception_operand);
-  __ movp(pending_exception_operand, rdx);  // Clear pending exception.
+  __ cmpp(rax, rdx);
+  __ j(equal, &runtime);
+  __ movp(pending_exception_operand, rdx);

   __ CompareRoot(rax, Heap::kTerminationExceptionRootIndex);
   Label termination_exception;

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