From d6742c7fae2d3bcc325ff997102ecaefdb150a27 Mon Sep 17 00:00:00 2001 From: "yurys@chromium.org" Date: Thu, 21 May 2009 14:21:14 +0000 Subject: [PATCH] For ScriptCollected events current context may be null. Message.GetEventContext will return an empty handle in such cases. Review URL: http://codereview.chromium.org/113698 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2024 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/debug.cc | 5 +++++ test/cctest/test-debug.cc | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/debug.cc b/src/debug.cc index 2f73ef2..7de6579 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -2400,6 +2400,11 @@ v8::Handle MessageImpl::GetJSON() const { v8::Handle MessageImpl::GetEventContext() const { Handle context = Debug::debugger_entry()->GetContext(); + // Top::context() may have been NULL when "script collected" event occured. + if (*context == NULL) { + ASSERT(event_ == v8::ScriptCollected); + return v8::Local(); + } Handle global_context(context->global_context()); return v8::Utils::ToLocal(global_context); } diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc index edd8506..4afcc34 100644 --- a/test/cctest/test-debug.cc +++ b/test/cctest/test-debug.cc @@ -4817,7 +4817,7 @@ TEST(ScriptCollectedEvent) { v8::HandleScope scope; DebugLocalContext env; - // Request the loaded scripte to initialize the debugger script cache. + // Request the loaded scripts to initialize the debugger script cache. Debug::GetLoadedScripts(); // Do garbage collection to ensure that only the script in this test will be @@ -4841,3 +4841,49 @@ TEST(ScriptCollectedEvent) { v8::Debug::SetDebugEventListener(NULL); CheckDebuggerUnloaded(); } + + +// Debug event listener which counts the script collected events. +int script_collected_message_count = 0; +static void ScriptCollectedMessageHandler(const v8::Debug::Message& message) { + // Count the number of scripts collected. + if (message.IsEvent() && message.GetEvent() == v8::ScriptCollected) { + script_collected_message_count++; + v8::Handle context = message.GetEventContext(); + CHECK(context.IsEmpty()); + } +} + + +// Test that GetEventContext doesn't fail and return empty handle for +// ScriptCollected events. +TEST(ScriptCollectedEventContext) { + break_point_hit_count = 0; + v8::HandleScope scope; + + { // Scope for the DebugLocalContext. + DebugLocalContext env; + + // Request the loaded scripts to initialize the debugger script cache. + Debug::GetLoadedScripts(); + + // Do garbage collection to ensure that only the script in this test will be + // collected afterwards. + Heap::CollectAllGarbage(); + + script_collected_count = 0; + v8::Debug::SetMessageHandler2(ScriptCollectedMessageHandler); + { + v8::Script::Compile(v8::String::New("eval('a=1')"))->Run(); + v8::Script::Compile(v8::String::New("eval('a=2')"))->Run(); + } + } + + // Do garbage collection to collect the script above which is no longer + // referenced. + Heap::CollectAllGarbage(); + + CHECK_EQ(2, script_collected_message_count); + + v8::Debug::SetMessageHandler2(NULL); +} -- 2.7.4