Index: test/cctest/test-regexp.cc |
diff --git a/test/cctest/test-regexp.cc b/test/cctest/test-regexp.cc |
index cc946464b26ab47c1aa78a0e9fe5d2e0837b3ea2..741acbc147700da7a598e9026524dc49c7ca59a3 100644 |
--- a/test/cctest/test-regexp.cc |
+++ b/test/cctest/test-regexp.cc |
@@ -1816,3 +1816,36 @@ TEST(Graph) { |
V8::Initialize(NULL); |
Execute("\\b\\w+\\b", false, true, true); |
} |
+ |
+ |
+class TimeoutThread : public i::Thread { |
+ public: |
+ explicit TimeoutThread(v8::Isolate* isolate) |
+ : Thread("TimeoutThread"), isolate_(isolate) {} |
+ |
+ virtual void Run() { |
+ OS::Sleep(500); // Wait a bit before terminating thread. |
+ v8::V8::TerminateExecution(isolate_); |
+ } |
+ |
+ private: |
+ v8::Isolate* isolate_; |
+}; |
+ |
+ |
+// Test that a regular expression execution can be interrupted and |
+// survive a garbage collection. |
+TEST(RegExpInterruption) { |
+ v8::HandleScope scope(CcTest::isolate()); |
+ LocalContext env; |
+ |
+ TimeoutThread timeout_thread(CcTest::isolate()); |
+ v8::TryCatch try_catch; |
+ |
+ timeout_thread.Start(); |
+ // Run a regexp that does not terminate in reasonable time unless forced. |
+ CompileRun("/((a*)*)*b/.exec('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"); |
+ CHECK(try_catch.HasTerminated()); |
+ |
+ timeout_thread.Join(); |
+} |