Commit 32f433c1 authored by yangguo@chromium.org's avatar yangguo@chromium.org

Fix leak in debug mirror cache.

When fetching loaded scripts, mirror objects are created and cached.
If the cache is not cleared, it holds script objects alive.

This also fixes a minor issue with script unloading.

R=ulan@chromium.org
BUG=376534
LOG=N

Review URL: https://codereview.chromium.org/296953005

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21477 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent cdcee29e
......@@ -486,6 +486,12 @@ function GetScriptBreakPoints(script) {
}
function GetLoadedScripts() {
ClearMirrorCache(); // The mirror cache may be holding onto scripts.
return %DebugGetLoadedScripts();
}
Debug.setListener = function(listener, opt_data) {
if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) {
throw new Error('Parameters have wrong types.');
......@@ -915,7 +921,7 @@ Debug.showBreakPoints = function(f, full, opt_position_alignment) {
// scanning the heap.
Debug.scripts = function() {
// Collect all scripts in the heap.
return %DebugGetLoadedScripts();
return GetLoadedScripts();
};
......@@ -2244,7 +2250,7 @@ DebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) {
}
// Collect all scripts in the heap.
var scripts = %DebugGetLoadedScripts();
var scripts = GetLoadedScripts();
response.body = [];
......@@ -2316,7 +2322,7 @@ DebugCommandProcessor.prototype.changeLiveRequest_ = function(
var script_id = request.arguments.script_id;
var preview_only = !!request.arguments.preview_only;
var scripts = %DebugGetLoadedScripts();
var scripts = GetLoadedScripts();
var the_script = null;
for (var i = 0; i < scripts.length; i++) {
......
......@@ -3139,22 +3139,23 @@ void Debugger::SetMessageHandler(v8::Debug::MessageHandler handler) {
void Debugger::UpdateState() {
Debug* debug = isolate_->debug();
bool activate = message_handler_ != NULL ||
!event_listener_.is_null() ||
isolate_->debug()->InDebugger();
debug->InDebugger();
if (!is_active_ && activate) {
// Note that the debug context could have already been loaded to
// bootstrap test cases.
isolate_->compilation_cache()->Disable();
activate = isolate_->debug()->Load();
} else if (is_active_ && !activate) {
activate = debug->Load();
} else if (debug->IsLoaded() && !activate) {
isolate_->compilation_cache()->Enable();
isolate_->debug()->ClearAllBreakPoints();
isolate_->debug()->Unload();
debug->ClearAllBreakPoints();
debug->Unload();
}
is_active_ = activate;
// At this point the debug context is loaded iff the debugger is active.
ASSERT(isolate_->debug()->IsLoaded() == is_active_);
ASSERT(debug->IsLoaded() == is_active_);
}
......@@ -3271,22 +3272,9 @@ EnterDebugger::~EnterDebugger() {
// JavaScript. This can happen if the v8::Debug::Call is used in which
// case the exception should end up in the calling code.
if (!isolate_->has_pending_exception()) {
// Try to avoid any pending debug break breaking in the clear mirror
// cache JavaScript code.
if (isolate_->stack_guard()->CheckDebugBreak()) {
debug->set_has_pending_interrupt(true);
isolate_->stack_guard()->ClearDebugBreak();
}
debug->ClearMirrorCache();
}
// Request debug break when leaving the last debugger entry
// if one was recorded while debugging.
if (debug->has_pending_interrupt()) {
debug->set_has_pending_interrupt(false);
isolate_->stack_guard()->RequestDebugBreak();
}
// If there are commands in the queue when leaving the debugger request
// that these commands are processed.
if (isolate_->debugger()->HasCommands()) {
......
......@@ -108,3 +108,5 @@ debugger;
assertTrue(listenerComplete,
"listener did not run to completion, exception: " + exception);
assertFalse(exception, "exception in listener")
Debug.setListener(null);
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --expose-debug-as debug
Debug = debug.Debug;
Debug.setListener(null);
......@@ -51,7 +51,7 @@ EXPECTED_FUNCTION_COUNT = 358
EXPECTED_FUZZABLE_COUNT = 325
EXPECTED_CCTEST_COUNT = 6
EXPECTED_UNKNOWN_COUNT = 5
EXPECTED_BUILTINS_COUNT = 781
EXPECTED_BUILTINS_COUNT = 782
# Don't call these at all.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment