Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: test/cctest/test-api.cc

Issue 11970009: Make the Isolate parameter mandatory in Locker and Unlocker classes. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased. Added TODO. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/cctest.cc ('k') | test/cctest/test-lockers.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 10999 matching lines...) Expand 10 before | Expand all | Expand 10 after
11010 RegisterThreadedTest::nth(current_)->fuzzer_->gate_->Signal(); 11010 RegisterThreadedTest::nth(current_)->fuzzer_->gate_->Signal();
11011 return true; 11011 return true;
11012 } 11012 }
11013 11013
11014 11014
11015 void ApiTestFuzzer::Run() { 11015 void ApiTestFuzzer::Run() {
11016 // When it is our turn... 11016 // When it is our turn...
11017 gate_->Wait(); 11017 gate_->Wait();
11018 { 11018 {
11019 // ... get the V8 lock and start running the test. 11019 // ... get the V8 lock and start running the test.
11020 v8::Locker locker; 11020 v8::Locker locker(CcTest::default_isolate());
11021 CallTest(); 11021 CallTest();
11022 } 11022 }
11023 // This test finished. 11023 // This test finished.
11024 active_ = false; 11024 active_ = false;
11025 active_tests_--; 11025 active_tests_--;
11026 // If it was the last then signal that fact. 11026 // If it was the last then signal that fact.
11027 if (active_tests_ == 0) { 11027 if (active_tests_ == 0) {
11028 all_tests_done_->Signal(); 11028 all_tests_done_->Signal();
11029 } else { 11029 } else {
11030 // Otherwise select a new test and start that. 11030 // Otherwise select a new test and start that.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
11074 linear_congruential_generator += 1013904223u; 11074 linear_congruential_generator += 1013904223u;
11075 } while (!RegisterThreadedTest::nth(next_test)->fuzzer_->active_); 11075 } while (!RegisterThreadedTest::nth(next_test)->fuzzer_->active_);
11076 return next_test; 11076 return next_test;
11077 } 11077 }
11078 11078
11079 11079
11080 void ApiTestFuzzer::ContextSwitch() { 11080 void ApiTestFuzzer::ContextSwitch() {
11081 // If the new thread is the same as the current thread there is nothing to do. 11081 // If the new thread is the same as the current thread there is nothing to do.
11082 if (NextThread()) { 11082 if (NextThread()) {
11083 // Now it can start. 11083 // Now it can start.
11084 v8::Unlocker unlocker; 11084 v8::Unlocker unlocker(CcTest::default_isolate());
11085 // Wait till someone starts us again. 11085 // Wait till someone starts us again.
11086 gate_->Wait(); 11086 gate_->Wait();
11087 // And we're off. 11087 // And we're off.
11088 } 11088 }
11089 } 11089 }
11090 11090
11091 11091
11092 void ApiTestFuzzer::TearDown() { 11092 void ApiTestFuzzer::TearDown() {
11093 fuzzing_ = false; 11093 fuzzing_ = false;
11094 for (int i = 0; i < RegisterThreadedTest::count(); i++) { 11094 for (int i = 0; i < RegisterThreadedTest::count(); i++) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
11126 void ApiTestFuzzer::CallTest() { 11126 void ApiTestFuzzer::CallTest() {
11127 if (kLogThreading) 11127 if (kLogThreading)
11128 printf("Start test %d\n", test_number_); 11128 printf("Start test %d\n", test_number_);
11129 CallTestNumber(test_number_); 11129 CallTestNumber(test_number_);
11130 if (kLogThreading) 11130 if (kLogThreading)
11131 printf("End test %d\n", test_number_); 11131 printf("End test %d\n", test_number_);
11132 } 11132 }
11133 11133
11134 11134
11135 static v8::Handle<Value> ThrowInJS(const v8::Arguments& args) { 11135 static v8::Handle<Value> ThrowInJS(const v8::Arguments& args) {
11136 CHECK(v8::Locker::IsLocked()); 11136 CHECK(v8::Locker::IsLocked(CcTest::default_isolate()));
11137 ApiTestFuzzer::Fuzz(); 11137 ApiTestFuzzer::Fuzz();
11138 v8::Unlocker unlocker; 11138 v8::Unlocker unlocker(CcTest::default_isolate());
11139 const char* code = "throw 7;"; 11139 const char* code = "throw 7;";
11140 { 11140 {
11141 v8::Locker nested_locker; 11141 v8::Locker nested_locker(CcTest::default_isolate());
11142 v8::HandleScope scope; 11142 v8::HandleScope scope;
11143 v8::Handle<Value> exception; 11143 v8::Handle<Value> exception;
11144 { v8::TryCatch try_catch; 11144 { v8::TryCatch try_catch;
11145 v8::Handle<Value> value = CompileRun(code); 11145 v8::Handle<Value> value = CompileRun(code);
11146 CHECK(value.IsEmpty()); 11146 CHECK(value.IsEmpty());
11147 CHECK(try_catch.HasCaught()); 11147 CHECK(try_catch.HasCaught());
11148 // Make sure to wrap the exception in a new handle because 11148 // Make sure to wrap the exception in a new handle because
11149 // the handle returned from the TryCatch is destroyed 11149 // the handle returned from the TryCatch is destroyed
11150 // when the TryCatch is destroyed. 11150 // when the TryCatch is destroyed.
11151 exception = Local<Value>::New(try_catch.Exception()); 11151 exception = Local<Value>::New(try_catch.Exception());
11152 } 11152 }
11153 return v8::ThrowException(exception); 11153 return v8::ThrowException(exception);
11154 } 11154 }
11155 } 11155 }
11156 11156
11157 11157
11158 static v8::Handle<Value> ThrowInJSNoCatch(const v8::Arguments& args) { 11158 static v8::Handle<Value> ThrowInJSNoCatch(const v8::Arguments& args) {
11159 CHECK(v8::Locker::IsLocked()); 11159 CHECK(v8::Locker::IsLocked(CcTest::default_isolate()));
11160 ApiTestFuzzer::Fuzz(); 11160 ApiTestFuzzer::Fuzz();
11161 v8::Unlocker unlocker; 11161 v8::Unlocker unlocker(CcTest::default_isolate());
11162 const char* code = "throw 7;"; 11162 const char* code = "throw 7;";
11163 { 11163 {
11164 v8::Locker nested_locker; 11164 v8::Locker nested_locker(CcTest::default_isolate());
11165 v8::HandleScope scope; 11165 v8::HandleScope scope;
11166 v8::Handle<Value> value = CompileRun(code); 11166 v8::Handle<Value> value = CompileRun(code);
11167 CHECK(value.IsEmpty()); 11167 CHECK(value.IsEmpty());
11168 return v8_str("foo"); 11168 return v8_str("foo");
11169 } 11169 }
11170 } 11170 }
11171 11171
11172 11172
11173 // These are locking tests that don't need to be run again 11173 // These are locking tests that don't need to be run again
11174 // as part of the locking aggregation tests. 11174 // as part of the locking aggregation tests.
11175 TEST(NestedLockers) { 11175 TEST(NestedLockers) {
11176 v8::Locker locker; 11176 v8::Locker locker(CcTest::default_isolate());
11177 CHECK(v8::Locker::IsLocked()); 11177 CHECK(v8::Locker::IsLocked(CcTest::default_isolate()));
11178 v8::HandleScope scope; 11178 v8::HandleScope scope;
11179 LocalContext env; 11179 LocalContext env;
11180 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(ThrowInJS); 11180 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(ThrowInJS);
11181 Local<Function> fun = fun_templ->GetFunction(); 11181 Local<Function> fun = fun_templ->GetFunction();
11182 env->Global()->Set(v8_str("throw_in_js"), fun); 11182 env->Global()->Set(v8_str("throw_in_js"), fun);
11183 Local<Script> script = v8_compile("(function () {" 11183 Local<Script> script = v8_compile("(function () {"
11184 " try {" 11184 " try {"
11185 " throw_in_js();" 11185 " throw_in_js();"
11186 " return 42;" 11186 " return 42;"
11187 " } catch (e) {" 11187 " } catch (e) {"
11188 " return e * 13;" 11188 " return e * 13;"
11189 " }" 11189 " }"
11190 "})();"); 11190 "})();");
11191 CHECK_EQ(91, script->Run()->Int32Value()); 11191 CHECK_EQ(91, script->Run()->Int32Value());
11192 } 11192 }
11193 11193
11194 11194
11195 // These are locking tests that don't need to be run again 11195 // These are locking tests that don't need to be run again
11196 // as part of the locking aggregation tests. 11196 // as part of the locking aggregation tests.
11197 TEST(NestedLockersNoTryCatch) { 11197 TEST(NestedLockersNoTryCatch) {
11198 v8::Locker locker; 11198 v8::Locker locker(CcTest::default_isolate());
11199 v8::HandleScope scope; 11199 v8::HandleScope scope;
11200 LocalContext env; 11200 LocalContext env;
11201 Local<v8::FunctionTemplate> fun_templ = 11201 Local<v8::FunctionTemplate> fun_templ =
11202 v8::FunctionTemplate::New(ThrowInJSNoCatch); 11202 v8::FunctionTemplate::New(ThrowInJSNoCatch);
11203 Local<Function> fun = fun_templ->GetFunction(); 11203 Local<Function> fun = fun_templ->GetFunction();
11204 env->Global()->Set(v8_str("throw_in_js"), fun); 11204 env->Global()->Set(v8_str("throw_in_js"), fun);
11205 Local<Script> script = v8_compile("(function () {" 11205 Local<Script> script = v8_compile("(function () {"
11206 " try {" 11206 " try {"
11207 " throw_in_js();" 11207 " throw_in_js();"
11208 " return 42;" 11208 " return 42;"
11209 " } catch (e) {" 11209 " } catch (e) {"
11210 " return e * 13;" 11210 " return e * 13;"
11211 " }" 11211 " }"
11212 "})();"); 11212 "})();");
11213 CHECK_EQ(91, script->Run()->Int32Value()); 11213 CHECK_EQ(91, script->Run()->Int32Value());
11214 } 11214 }
11215 11215
11216 11216
11217 THREADED_TEST(RecursiveLocking) { 11217 THREADED_TEST(RecursiveLocking) {
11218 v8::Locker locker; 11218 v8::Locker locker(CcTest::default_isolate());
11219 { 11219 {
11220 v8::Locker locker2; 11220 v8::Locker locker2(CcTest::default_isolate());
11221 CHECK(v8::Locker::IsLocked()); 11221 CHECK(v8::Locker::IsLocked(CcTest::default_isolate()));
11222 } 11222 }
11223 } 11223 }
11224 11224
11225 11225
11226 static v8::Handle<Value> UnlockForAMoment(const v8::Arguments& args) { 11226 static v8::Handle<Value> UnlockForAMoment(const v8::Arguments& args) {
11227 ApiTestFuzzer::Fuzz(); 11227 ApiTestFuzzer::Fuzz();
11228 v8::Unlocker unlocker; 11228 v8::Unlocker unlocker(CcTest::default_isolate());
11229 return v8::Undefined(); 11229 return v8::Undefined();
11230 } 11230 }
11231 11231
11232 11232
11233 THREADED_TEST(LockUnlockLock) { 11233 THREADED_TEST(LockUnlockLock) {
11234 { 11234 {
11235 v8::Locker locker; 11235 v8::Locker locker(CcTest::default_isolate());
11236 v8::HandleScope scope; 11236 v8::HandleScope scope;
11237 LocalContext env; 11237 LocalContext env;
11238 Local<v8::FunctionTemplate> fun_templ = 11238 Local<v8::FunctionTemplate> fun_templ =
11239 v8::FunctionTemplate::New(UnlockForAMoment); 11239 v8::FunctionTemplate::New(UnlockForAMoment);
11240 Local<Function> fun = fun_templ->GetFunction(); 11240 Local<Function> fun = fun_templ->GetFunction();
11241 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); 11241 env->Global()->Set(v8_str("unlock_for_a_moment"), fun);
11242 Local<Script> script = v8_compile("(function () {" 11242 Local<Script> script = v8_compile("(function () {"
11243 " unlock_for_a_moment();" 11243 " unlock_for_a_moment();"
11244 " return 42;" 11244 " return 42;"
11245 "})();"); 11245 "})();");
11246 CHECK_EQ(42, script->Run()->Int32Value()); 11246 CHECK_EQ(42, script->Run()->Int32Value());
11247 } 11247 }
11248 { 11248 {
11249 v8::Locker locker; 11249 v8::Locker locker(CcTest::default_isolate());
11250 v8::HandleScope scope; 11250 v8::HandleScope scope;
11251 LocalContext env; 11251 LocalContext env;
11252 Local<v8::FunctionTemplate> fun_templ = 11252 Local<v8::FunctionTemplate> fun_templ =
11253 v8::FunctionTemplate::New(UnlockForAMoment); 11253 v8::FunctionTemplate::New(UnlockForAMoment);
11254 Local<Function> fun = fun_templ->GetFunction(); 11254 Local<Function> fun = fun_templ->GetFunction();
11255 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); 11255 env->Global()->Set(v8_str("unlock_for_a_moment"), fun);
11256 Local<Script> script = v8_compile("(function () {" 11256 Local<Script> script = v8_compile("(function () {"
11257 " unlock_for_a_moment();" 11257 " unlock_for_a_moment();"
11258 " return 42;" 11258 " return 42;"
11259 "})();"); 11259 "})();");
(...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after
12490 gc_count_ = 0; 12490 gc_count_ = 0;
12491 gc_during_regexp_ = 0; 12491 gc_during_regexp_ = 0;
12492 regexp_success_ = false; 12492 regexp_success_ = false;
12493 gc_success_ = false; 12493 gc_success_ = false;
12494 GCThread gc_thread(this); 12494 GCThread gc_thread(this);
12495 gc_thread.Start(); 12495 gc_thread.Start();
12496 v8::Locker::StartPreemption(1); 12496 v8::Locker::StartPreemption(1);
12497 12497
12498 LongRunningRegExp(); 12498 LongRunningRegExp();
12499 { 12499 {
12500 v8::Unlocker unlock; 12500 v8::Unlocker unlock(CcTest::default_isolate());
12501 gc_thread.Join(); 12501 gc_thread.Join();
12502 } 12502 }
12503 v8::Locker::StopPreemption(); 12503 v8::Locker::StopPreemption();
12504 CHECK(regexp_success_); 12504 CHECK(regexp_success_);
12505 CHECK(gc_success_); 12505 CHECK(gc_success_);
12506 } 12506 }
12507 12507
12508 private: 12508 private:
12509 // Number of garbage collections required. 12509 // Number of garbage collections required.
12510 static const int kRequiredGCs = 5; 12510 static const int kRequiredGCs = 5;
12511 12511
12512 class GCThread : public i::Thread { 12512 class GCThread : public i::Thread {
12513 public: 12513 public:
12514 explicit GCThread(RegExpInterruptTest* test) 12514 explicit GCThread(RegExpInterruptTest* test)
12515 : Thread("GCThread"), test_(test) {} 12515 : Thread("GCThread"), test_(test) {}
12516 virtual void Run() { 12516 virtual void Run() {
12517 test_->CollectGarbage(); 12517 test_->CollectGarbage();
12518 } 12518 }
12519 private: 12519 private:
12520 RegExpInterruptTest* test_; 12520 RegExpInterruptTest* test_;
12521 }; 12521 };
12522 12522
12523 void CollectGarbage() { 12523 void CollectGarbage() {
12524 block_->Wait(); 12524 block_->Wait();
12525 while (gc_during_regexp_ < kRequiredGCs) { 12525 while (gc_during_regexp_ < kRequiredGCs) {
12526 { 12526 {
12527 v8::Locker lock; 12527 v8::Locker lock(CcTest::default_isolate());
12528 // TODO(lrn): Perhaps create some garbage before collecting. 12528 // TODO(lrn): Perhaps create some garbage before collecting.
12529 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 12529 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
12530 gc_count_++; 12530 gc_count_++;
12531 } 12531 }
12532 i::OS::Sleep(1); 12532 i::OS::Sleep(1);
12533 } 12533 }
12534 gc_success_ = true; 12534 gc_success_ = true;
12535 } 12535 }
12536 12536
12537 void LongRunningRegExp() { 12537 void LongRunningRegExp() {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
12577 int gc_count_; 12577 int gc_count_;
12578 int gc_during_regexp_; 12578 int gc_during_regexp_;
12579 bool regexp_success_; 12579 bool regexp_success_;
12580 bool gc_success_; 12580 bool gc_success_;
12581 }; 12581 };
12582 12582
12583 12583
12584 // Test that a regular expression execution can be interrupted and 12584 // Test that a regular expression execution can be interrupted and
12585 // survive a garbage collection. 12585 // survive a garbage collection.
12586 TEST(RegExpInterruption) { 12586 TEST(RegExpInterruption) {
12587 v8::Locker lock; 12587 v8::Locker lock(CcTest::default_isolate());
12588 v8::V8::Initialize(); 12588 v8::V8::Initialize();
12589 v8::HandleScope scope; 12589 v8::HandleScope scope;
12590 Local<Context> local_env; 12590 Local<Context> local_env;
12591 { 12591 {
12592 LocalContext env; 12592 LocalContext env;
12593 local_env = env.local(); 12593 local_env = env.local();
12594 } 12594 }
12595 12595
12596 // Local context should still be live. 12596 // Local context should still be live.
12597 CHECK(!local_env.IsEmpty()); 12597 CHECK(!local_env.IsEmpty());
(...skipping 15 matching lines...) Expand all
12613 gc_count_ = 0; 12613 gc_count_ = 0;
12614 gc_during_apply_ = 0; 12614 gc_during_apply_ = 0;
12615 apply_success_ = false; 12615 apply_success_ = false;
12616 gc_success_ = false; 12616 gc_success_ = false;
12617 GCThread gc_thread(this); 12617 GCThread gc_thread(this);
12618 gc_thread.Start(); 12618 gc_thread.Start();
12619 v8::Locker::StartPreemption(1); 12619 v8::Locker::StartPreemption(1);
12620 12620
12621 LongRunningApply(); 12621 LongRunningApply();
12622 { 12622 {
12623 v8::Unlocker unlock; 12623 v8::Unlocker unlock(CcTest::default_isolate());
12624 gc_thread.Join(); 12624 gc_thread.Join();
12625 } 12625 }
12626 v8::Locker::StopPreemption(); 12626 v8::Locker::StopPreemption();
12627 CHECK(apply_success_); 12627 CHECK(apply_success_);
12628 CHECK(gc_success_); 12628 CHECK(gc_success_);
12629 } 12629 }
12630 12630
12631 private: 12631 private:
12632 // Number of garbage collections required. 12632 // Number of garbage collections required.
12633 static const int kRequiredGCs = 2; 12633 static const int kRequiredGCs = 2;
12634 12634
12635 class GCThread : public i::Thread { 12635 class GCThread : public i::Thread {
12636 public: 12636 public:
12637 explicit GCThread(ApplyInterruptTest* test) 12637 explicit GCThread(ApplyInterruptTest* test)
12638 : Thread("GCThread"), test_(test) {} 12638 : Thread("GCThread"), test_(test) {}
12639 virtual void Run() { 12639 virtual void Run() {
12640 test_->CollectGarbage(); 12640 test_->CollectGarbage();
12641 } 12641 }
12642 private: 12642 private:
12643 ApplyInterruptTest* test_; 12643 ApplyInterruptTest* test_;
12644 }; 12644 };
12645 12645
12646 void CollectGarbage() { 12646 void CollectGarbage() {
12647 block_->Wait(); 12647 block_->Wait();
12648 while (gc_during_apply_ < kRequiredGCs) { 12648 while (gc_during_apply_ < kRequiredGCs) {
12649 { 12649 {
12650 v8::Locker lock; 12650 v8::Locker lock(CcTest::default_isolate());
12651 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 12651 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
12652 gc_count_++; 12652 gc_count_++;
12653 } 12653 }
12654 i::OS::Sleep(1); 12654 i::OS::Sleep(1);
12655 } 12655 }
12656 gc_success_ = true; 12656 gc_success_ = true;
12657 } 12657 }
12658 12658
12659 void LongRunningApply() { 12659 void LongRunningApply() {
12660 block_->Signal(); 12660 block_->Signal();
(...skipping 25 matching lines...) Expand all
12686 int gc_count_; 12686 int gc_count_;
12687 int gc_during_apply_; 12687 int gc_during_apply_;
12688 bool apply_success_; 12688 bool apply_success_;
12689 bool gc_success_; 12689 bool gc_success_;
12690 }; 12690 };
12691 12691
12692 12692
12693 // Test that nothing bad happens if we get a preemption just when we were 12693 // Test that nothing bad happens if we get a preemption just when we were
12694 // about to do an apply(). 12694 // about to do an apply().
12695 TEST(ApplyInterruption) { 12695 TEST(ApplyInterruption) {
12696 v8::Locker lock; 12696 v8::Locker lock(CcTest::default_isolate());
12697 v8::V8::Initialize(); 12697 v8::V8::Initialize();
12698 v8::HandleScope scope; 12698 v8::HandleScope scope;
12699 Local<Context> local_env; 12699 Local<Context> local_env;
12700 { 12700 {
12701 LocalContext env; 12701 LocalContext env;
12702 local_env = env.local(); 12702 local_env = env.local();
12703 } 12703 }
12704 12704
12705 // Local context should still be live. 12705 // Local context should still be live.
12706 CHECK(!local_env.IsEmpty()); 12706 CHECK(!local_env.IsEmpty());
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
12924 *input_name, 12924 *input_name,
12925 *input_, 12925 *input_,
12926 NONE, 12926 NONE,
12927 i::kNonStrictMode)->ToObjectChecked(); 12927 i::kNonStrictMode)->ToObjectChecked();
12928 12928
12929 MorphThread morph_thread(this); 12929 MorphThread morph_thread(this);
12930 morph_thread.Start(); 12930 morph_thread.Start();
12931 v8::Locker::StartPreemption(1); 12931 v8::Locker::StartPreemption(1);
12932 LongRunningRegExp(); 12932 LongRunningRegExp();
12933 { 12933 {
12934 v8::Unlocker unlock; 12934 v8::Unlocker unlock(CcTest::default_isolate());
12935 morph_thread.Join(); 12935 morph_thread.Join();
12936 } 12936 }
12937 v8::Locker::StopPreemption(); 12937 v8::Locker::StopPreemption();
12938 CHECK(regexp_success_); 12938 CHECK(regexp_success_);
12939 CHECK(morph_success_); 12939 CHECK(morph_success_);
12940 } 12940 }
12941 12941
12942 private: 12942 private:
12943 // Number of string modifications required. 12943 // Number of string modifications required.
12944 static const int kRequiredModifications = 5; 12944 static const int kRequiredModifications = 5;
12945 static const int kMaxModifications = 100; 12945 static const int kMaxModifications = 100;
12946 12946
12947 class MorphThread : public i::Thread { 12947 class MorphThread : public i::Thread {
12948 public: 12948 public:
12949 explicit MorphThread(RegExpStringModificationTest* test) 12949 explicit MorphThread(RegExpStringModificationTest* test)
12950 : Thread("MorphThread"), test_(test) {} 12950 : Thread("MorphThread"), test_(test) {}
12951 virtual void Run() { 12951 virtual void Run() {
12952 test_->MorphString(); 12952 test_->MorphString();
12953 } 12953 }
12954 private: 12954 private:
12955 RegExpStringModificationTest* test_; 12955 RegExpStringModificationTest* test_;
12956 }; 12956 };
12957 12957
12958 void MorphString() { 12958 void MorphString() {
12959 block_->Wait(); 12959 block_->Wait();
12960 while (morphs_during_regexp_ < kRequiredModifications && 12960 while (morphs_during_regexp_ < kRequiredModifications &&
12961 morphs_ < kMaxModifications) { 12961 morphs_ < kMaxModifications) {
12962 { 12962 {
12963 v8::Locker lock; 12963 v8::Locker lock(CcTest::default_isolate());
12964 // Swap string between ascii and two-byte representation. 12964 // Swap string between ascii and two-byte representation.
12965 i::String* string = *input_; 12965 i::String* string = *input_;
12966 MorphAString(string, &ascii_resource_, &uc16_resource_); 12966 MorphAString(string, &ascii_resource_, &uc16_resource_);
12967 morphs_++; 12967 morphs_++;
12968 } 12968 }
12969 i::OS::Sleep(1); 12969 i::OS::Sleep(1);
12970 } 12970 }
12971 morph_success_ = true; 12971 morph_success_ = true;
12972 } 12972 }
12973 12973
(...skipping 27 matching lines...) Expand all
13001 bool morph_success_; 13001 bool morph_success_;
13002 i::Handle<i::String> input_; 13002 i::Handle<i::String> input_;
13003 AsciiVectorResource ascii_resource_; 13003 AsciiVectorResource ascii_resource_;
13004 UC16VectorResource uc16_resource_; 13004 UC16VectorResource uc16_resource_;
13005 }; 13005 };
13006 13006
13007 13007
13008 // Test that a regular expression execution can be interrupted and 13008 // Test that a regular expression execution can be interrupted and
13009 // the string changed without failing. 13009 // the string changed without failing.
13010 TEST(RegExpStringModification) { 13010 TEST(RegExpStringModification) {
13011 v8::Locker lock; 13011 v8::Locker lock(CcTest::default_isolate());
13012 v8::V8::Initialize(); 13012 v8::V8::Initialize();
13013 v8::HandleScope scope; 13013 v8::HandleScope scope;
13014 Local<Context> local_env; 13014 Local<Context> local_env;
13015 { 13015 {
13016 LocalContext env; 13016 LocalContext env;
13017 local_env = env.local(); 13017 local_env = env.local();
13018 } 13018 }
13019 13019
13020 // Local context should still be live. 13020 // Local context should still be live.
13021 CHECK(!local_env.IsEmpty()); 13021 CHECK(!local_env.IsEmpty());
(...skipping 2112 matching lines...) Expand 10 before | Expand all | Expand 10 after
15134 env->Global()->Set(v8_str("get_stack_limit"), fun); 15134 env->Global()->Set(v8_str("get_stack_limit"), fun);
15135 CompileRun("get_stack_limit();"); 15135 CompileRun("get_stack_limit();");
15136 15136
15137 CHECK(stack_limit == set_limit); 15137 CHECK(stack_limit == set_limit);
15138 } 15138 }
15139 15139
15140 15140
15141 TEST(SetResourceConstraintsInThread) { 15141 TEST(SetResourceConstraintsInThread) {
15142 uint32_t* set_limit; 15142 uint32_t* set_limit;
15143 { 15143 {
15144 v8::Locker locker; 15144 v8::Locker locker(CcTest::default_isolate());
15145 static const int K = 1024; 15145 static const int K = 1024;
15146 set_limit = ComputeStackLimit(128 * K); 15146 set_limit = ComputeStackLimit(128 * K);
15147 15147
15148 // Set stack limit. 15148 // Set stack limit.
15149 v8::ResourceConstraints constraints; 15149 v8::ResourceConstraints constraints;
15150 constraints.set_stack_limit(set_limit); 15150 constraints.set_stack_limit(set_limit);
15151 CHECK(v8::SetResourceConstraints(&constraints)); 15151 CHECK(v8::SetResourceConstraints(&constraints));
15152 15152
15153 // Execute a script. 15153 // Execute a script.
15154 v8::HandleScope scope; 15154 v8::HandleScope scope;
15155 LocalContext env; 15155 LocalContext env;
15156 Local<v8::FunctionTemplate> fun_templ = 15156 Local<v8::FunctionTemplate> fun_templ =
15157 v8::FunctionTemplate::New(GetStackLimitCallback); 15157 v8::FunctionTemplate::New(GetStackLimitCallback);
15158 Local<Function> fun = fun_templ->GetFunction(); 15158 Local<Function> fun = fun_templ->GetFunction();
15159 env->Global()->Set(v8_str("get_stack_limit"), fun); 15159 env->Global()->Set(v8_str("get_stack_limit"), fun);
15160 CompileRun("get_stack_limit();"); 15160 CompileRun("get_stack_limit();");
15161 15161
15162 CHECK(stack_limit == set_limit); 15162 CHECK(stack_limit == set_limit);
15163 } 15163 }
15164 { 15164 {
15165 v8::Locker locker; 15165 v8::Locker locker(CcTest::default_isolate());
15166 CHECK(stack_limit == set_limit); 15166 CHECK(stack_limit == set_limit);
15167 } 15167 }
15168 } 15168 }
15169 15169
15170 15170
15171 THREADED_TEST(GetHeapStatistics) { 15171 THREADED_TEST(GetHeapStatistics) {
15172 v8::HandleScope scope; 15172 v8::HandleScope scope;
15173 LocalContext c1; 15173 LocalContext c1;
15174 v8::HeapStatistics heap_statistics; 15174 v8::HeapStatistics heap_statistics;
15175 CHECK_EQ(static_cast<int>(heap_statistics.total_heap_size()), 0); 15175 CHECK_EQ(static_cast<int>(heap_statistics.total_heap_size()), 0);
(...skipping 2979 matching lines...) Expand 10 before | Expand all | Expand 10 after
18155 i::Semaphore* sem_; 18155 i::Semaphore* sem_;
18156 volatile int sem_value_; 18156 volatile int sem_value_;
18157 }; 18157 };
18158 18158
18159 18159
18160 THREADED_TEST(SemaphoreInterruption) { 18160 THREADED_TEST(SemaphoreInterruption) {
18161 ThreadInterruptTest().RunTest(); 18161 ThreadInterruptTest().RunTest();
18162 } 18162 }
18163 18163
18164 #endif // WIN32 18164 #endif // WIN32
OLDNEW
« no previous file with comments | « test/cctest/cctest.cc ('k') | test/cctest/test-lockers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698