Author: [EMAIL PROTECTED]
Date: Fri Oct 3 02:57:18 2008
New Revision: 421
Modified:
branches/bleeding_edge/src/debug.cc
branches/bleeding_edge/src/debug.h
branches/bleeding_edge/src/mirror-delay.js
branches/bleeding_edge/src/runtime.cc
branches/bleeding_edge/src/top.cc
Log:
Refactored the logic for entering the debugger into one abstraction
EnterDebugger.
Removed the static initializer for Top::break_access_.
Review URL: http://codereview.chromium.org/6234
Modified: branches/bleeding_edge/src/debug.cc
==============================================================================
--- branches/bleeding_edge/src/debug.cc (original)
+++ branches/bleeding_edge/src/debug.cc Fri Oct 3 02:57:18 2008
@@ -631,8 +631,11 @@
return Heap::undefined_value();
}
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) {
+ return Heap::undefined_value();
+ }
// Postpone interrupt during breakpoint processing.
PostponeInterruptsScope postpone;
@@ -1415,10 +1418,9 @@
if (!Debug::break_on_exception()) return;
}
- // Enter the debugger. Bail out if the debugger cannot be loaded.
- if (!Debug::Load()) return;
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) return;
// Clear all current stepping setup.
Debug::ClearStepping();
@@ -1479,10 +1481,9 @@
if (compiling_natives()) return;
if (!EventActive(v8::BeforeCompile)) return;
- // Enter the debugger. Bail out if the debugger cannot be loaded.
- if (!Debug::Load()) return;
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) return;
// Create the event data object.
bool caught_exception = false;
@@ -1509,10 +1510,9 @@
// No more to do if not debugging.
if (!debugger_active()) return;
- // Enter the debugger. Bail out if the debugger cannot be loaded.
- if (!Debug::Load()) return;
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) return;
// If debugging there might be script break points registered for this
// script. Make sure that these break points are set.
@@ -1567,10 +1567,9 @@
if (compiling_natives()) return;
if (!Debugger::EventActive(v8::NewFunction)) return;
- // Enter the debugger. Bail out if the debugger cannot be loaded.
- if (!Debug::Load()) return;
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) return;
// Create the event object.
bool caught_exception = false;
Modified: branches/bleeding_edge/src/debug.h
==============================================================================
--- branches/bleeding_edge/src/debug.h (original)
+++ branches/bleeding_edge/src/debug.h Fri Oct 3 02:57:18 2008
@@ -31,6 +31,7 @@
#include "../include/v8-debug.h"
#include "assembler.h"
#include "code-stubs.h"
+#include "execution.h"
#include "factory.h"
#include "platform.h"
#include "string-stream.h"
@@ -469,10 +470,15 @@
};
-// Helper class to support saving/restoring the top break frame id.
-class SaveBreakFrame {
+// This class is used for entering the debugger. Create an instance in the
stack
+// to enter the debugger. This will set the current break state, make sure
the
+// debugger is loaded and switch to the debugger context. If the debugger
for
+// some reason could not be entered FailedToEnter will return true.
+class EnterDebugger BASE_EMBEDDED {
public:
- SaveBreakFrame() : set_(!it_.done()) {
+ EnterDebugger() : set_(!it_.done()) {
+ // If there is no JavaScript frames on the stack don't switch to new
break
+ // and break frame.
if (set_) {
// Store the previous break is and frame id.
break_id_ = Top::break_id();
@@ -481,36 +487,34 @@
// Create the new break info.
Top::new_break(it_.frame()->id());
}
+
+ // Make sure that debugger is loaded and enter the debugger context.
+ load_failed_ = !Debug::Load();
+ if (!load_failed_) {
+ // NOTE the member variable save which saves the previous context
before
+ // this change.
+ Top::set_context(*Debug::debug_context());
+ Top::set_security_context(*Debug::debug_context());
+ }
}
- ~SaveBreakFrame() {
+ ~EnterDebugger() {
if (set_) {
- // restore to the previous break state.
+ // Restore to the previous break state.
Top::set_break(break_frame_id_, break_id_);
}
}
+ // Check whether the debugger could be entered.
+ inline bool FailedToEnter() { return load_failed_; }
+
private:
JavaScriptFrameIterator it_;
const bool set_; // Was the break actually set?
StackFrame::Id break_frame_id_; // Previous break frame id.
int break_id_; // Previous break id.
-};
-
-
-class EnterDebuggerContext BASE_EMBEDDED {
- public:
- // Enter the debugger by storing the previous top context and setting the
- // current top context to the debugger context.
- EnterDebuggerContext() {
- // NOTE the member variable save which saves the previous context
before
- // this change.
- Top::set_context(*Debug::debug_context());
- Top::set_security_context(*Debug::debug_context());
- }
-
- private:
- SaveContext save;
+ bool load_failed_; // Did the debugger fail to load?
+ SaveContext save_; // Saves previous context.
};
Modified: branches/bleeding_edge/src/mirror-delay.js
==============================================================================
--- branches/bleeding_edge/src/mirror-delay.js (original)
+++ branches/bleeding_edge/src/mirror-delay.js Fri Oct 3 02:57:18 2008
@@ -1608,7 +1608,7 @@
// For constructor frames display new followed by the function name.
result += 'new ';
result += func.name() ? func.name() : '[anonymous]';
- } else if (this.isDebuggerFrame()) {
+ } else if (this.isDebuggerFrame()) {
result += '[debugger]';
} else {
// If the receiver has a className which is 'global' don't display it.
Modified: branches/bleeding_edge/src/runtime.cc
==============================================================================
--- branches/bleeding_edge/src/runtime.cc (original)
+++ branches/bleeding_edge/src/runtime.cc Fri Oct 3 02:57:18 2008
@@ -3096,8 +3096,8 @@
static Object* Runtime_DebugBreak(Arguments args) {
- // Just continue if breaks are disabled or if we fail to load the
debugger.
- if (Debug::disable_break() || !Debug::Load()) {
+ // Just continue if breaks are disabled.
+ if (Debug::disable_break()) {
return args[0];
}
@@ -3118,8 +3118,11 @@
StackGuard::Continue(DEBUGBREAK);
HandleScope scope;
- SaveBreakFrame save;
- EnterDebuggerContext enter;
+ // Enter the debugger. Just continue if we fail to enter the debugger.
+ EnterDebugger debugger;
+ if (debugger.FailedToEnter()) {
+ return args[0];
+ }
// Notify the debug event listeners.
Debugger::OnDebugBreak(Factory::undefined_value());
Modified: branches/bleeding_edge/src/top.cc
==============================================================================
--- branches/bleeding_edge/src/top.cc (original)
+++ branches/bleeding_edge/src/top.cc Fri Oct 3 02:57:18 2008
@@ -37,7 +37,7 @@
namespace v8 { namespace internal {
ThreadLocalTop Top::thread_local_;
-Mutex* Top::break_access_ = OS::CreateMutex();
+Mutex* Top::break_access_;
StackFrame::Id Top::break_frame_id_;
int Top::break_count_;
int Top::break_id_;
@@ -222,6 +222,7 @@
InitializeThreadLocal();
+ break_access_ = OS::CreateMutex();
break_frame_id_ = StackFrame::NO_ID;
break_count_ = 0;
break_id_ = 0;
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---