Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 22e207785888f2857db01f6e20486a8a64c216d4..4f7e87d39749c14a775ffb6d660f4942c91af8bc 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -14323,129 +14323,6 @@ THREADED_TEST(CrossContextNew) { |
} |
-class RegExpInterruptTest { |
- public: |
- RegExpInterruptTest() : block_(0) {} |
- ~RegExpInterruptTest() {} |
- void RunTest() { |
- gc_count_ = 0; |
- gc_during_regexp_ = 0; |
- regexp_success_ = false; |
- gc_success_ = false; |
- GCThread gc_thread(this); |
- gc_thread.Start(); |
- v8::Isolate* isolate = CcTest::isolate(); |
- v8::Locker::StartPreemption(isolate, 1); |
- |
- LongRunningRegExp(); |
- { |
- v8::Unlocker unlock(isolate); |
- gc_thread.Join(); |
- } |
- v8::Locker::StopPreemption(isolate); |
- CHECK(regexp_success_); |
- CHECK(gc_success_); |
- } |
- |
- private: |
- // Number of garbage collections required. |
- static const int kRequiredGCs = 5; |
- |
- class GCThread : public i::Thread { |
- public: |
- explicit GCThread(RegExpInterruptTest* test) |
- : Thread("GCThread"), test_(test) {} |
- virtual void Run() { |
- test_->CollectGarbage(); |
- } |
- private: |
- RegExpInterruptTest* test_; |
- }; |
- |
- void CollectGarbage() { |
- block_.Wait(); |
- while (gc_during_regexp_ < kRequiredGCs) { |
- { |
- v8::Locker lock(CcTest::isolate()); |
- v8::Isolate::Scope isolate_scope(CcTest::isolate()); |
- // TODO(lrn): Perhaps create some garbage before collecting. |
- CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
- gc_count_++; |
- } |
- i::OS::Sleep(1); |
- } |
- gc_success_ = true; |
- } |
- |
- void LongRunningRegExp() { |
- block_.Signal(); // Enable garbage collection thread on next preemption. |
- int rounds = 0; |
- while (gc_during_regexp_ < kRequiredGCs) { |
- int gc_before = gc_count_; |
- { |
- // Match 15-30 "a"'s against 14 and a "b". |
- const char* c_source = |
- "/a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaa/" |
- ".exec('aaaaaaaaaaaaaaab') === null"; |
- Local<String> source = String::New(c_source); |
- Local<Script> script = Script::Compile(source); |
- Local<Value> result = script->Run(); |
- if (!result->BooleanValue()) { |
- gc_during_regexp_ = kRequiredGCs; // Allow gc thread to exit. |
- return; |
- } |
- } |
- { |
- // Match 15-30 "a"'s against 15 and a "b". |
- const char* c_source = |
- "/a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaa/" |
- ".exec('aaaaaaaaaaaaaaaab')[0] === 'aaaaaaaaaaaaaaaa'"; |
- Local<String> source = String::New(c_source); |
- Local<Script> script = Script::Compile(source); |
- Local<Value> result = script->Run(); |
- if (!result->BooleanValue()) { |
- gc_during_regexp_ = kRequiredGCs; |
- return; |
- } |
- } |
- int gc_after = gc_count_; |
- gc_during_regexp_ += gc_after - gc_before; |
- rounds++; |
- i::OS::Sleep(1); |
- } |
- regexp_success_ = true; |
- } |
- |
- i::Semaphore block_; |
- int gc_count_; |
- int gc_during_regexp_; |
- bool regexp_success_; |
- bool gc_success_; |
-}; |
- |
- |
-// Test that a regular expression execution can be interrupted and |
-// survive a garbage collection. |
-TEST(RegExpInterruption) { |
- v8::Locker lock(CcTest::isolate()); |
- v8::HandleScope scope(CcTest::isolate()); |
- Local<Context> local_env; |
- { |
- LocalContext env; |
- local_env = env.local(); |
- } |
- |
- // Local context should still be live. |
- CHECK(!local_env.IsEmpty()); |
- local_env->Enter(); |
- |
- // Should complete without problems. |
- RegExpInterruptTest().RunTest(); |
- |
- local_env->Exit(); |
-} |
- |
- |
class ApplyInterruptTest { |
jochen (gone - plz use gerrit)
2013/10/11 18:31:06
this and another test in this file also use the pr
|
public: |
ApplyInterruptTest() : block_(0) {} |