Revision: 3179 Author: [email protected] Date: Thu Oct 29 16:06:59 2009 Log: Add a test which verifies that weak reference callbacks cannot be invoked while scavenging.
BUG=25819 Review URL: http://codereview.chromium.org/334043 http://code.google.com/p/v8/source/detail?r=3179 Modified: /branches/bleeding_edge/test/cctest/test-api.cc ======================================= --- /branches/bleeding_edge/test/cctest/test-api.cc Thu Oct 29 06:17:11 2009 +++ /branches/bleeding_edge/test/cctest/test-api.cc Thu Oct 29 16:06:59 2009 @@ -3155,6 +3155,58 @@ context.Dispose(); } + + +static bool in_scavenge = false; +static int last = -1; + +static void ForceScavenge(v8::Persistent<v8::Value> obj, void* data) { + CHECK_EQ(-1, last); + last = 0; + obj.Dispose(); + obj.Clear(); + in_scavenge = true; + i::Heap::PerformScavenge(); + in_scavenge = false; + *(reinterpret_cast<bool*>(data)) = true; +} + +static void CheckIsNotInvokedInScavenge(v8::Persistent<v8::Value> obj, + void* data) { + CHECK_EQ(0, last); + last = 1; + *(reinterpret_cast<bool*>(data)) = in_scavenge; + obj.Dispose(); + obj.Clear(); +} + +THREADED_TEST(NoWeakRefCallbacksInScavenge) { + // Test verifies that scavenge cannot invoke WeakReferenceCallbacks. + // Calling callbacks from scavenges is unsafe as objects held by those + // handlers might have become strongly reachable, but scavenge doesn't + // check that. + v8::Persistent<Context> context = Context::New(); + Context::Scope context_scope(context); + + v8::Persistent<v8::Object> object_a; + v8::Persistent<v8::Object> object_b; + + { + v8::HandleScope handle_scope; + object_b = v8::Persistent<v8::Object>::New(v8::Object::New()); + object_a = v8::Persistent<v8::Object>::New(v8::Object::New()); + } + + bool object_a_disposed = false; + object_a.MakeWeak(&object_a_disposed, &ForceScavenge); + bool released_in_scavenge = false; + object_b.MakeWeak(&released_in_scavenge, &CheckIsNotInvokedInScavenge); + + while (!object_a_disposed) { + i::Heap::CollectAllGarbage(false); + } + CHECK(!released_in_scavenge); +} v8::Handle<Function> args_fun; --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
