From 55301d641b14b05eb47abeb6745e44c7f71e5feb Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 17 Dec 2015 16:58:29 +0300 Subject: [PATCH] pass current state(threads, stack trace, vars) to UI --- src/ddebug/common/debugger.d | 23 +++++++++++++++++++---- src/ddebug/gdb/gdbinterface.d | 1 + src/dlangide/ui/debuggerui.d | 5 +++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/ddebug/common/debugger.d b/src/ddebug/common/debugger.d index 1797e0f..d6f3192 100644 --- a/src/ddebug/common/debugger.d +++ b/src/ddebug/common/debugger.d @@ -33,6 +33,7 @@ class LocationBase { projectFilePath = v.projectFilePath; line = v.line; } + LocationBase clone() { return new LocationBase(this); } } class DebugFrame : LocationBase { @@ -47,8 +48,10 @@ class DebugFrame : LocationBase { address = v.address; func = v.func; level = v.level; - locals = new DebugVariableList(locals); + if (v.locals) + locals = new DebugVariableList(v.locals); } + override DebugFrame clone() { return new DebugFrame(this); } void fillMissingFields(LocationBase v) { if (file.empty) @@ -75,7 +78,7 @@ class Breakpoint : LocationBase { enabled = v.enabled; projectName = v.projectName; } - Breakpoint clone() { + override Breakpoint clone() { return new Breakpoint(this); } } @@ -92,10 +95,13 @@ class DebugThread { this(DebugThread v) { id = v.id; name = v.name; - frame = new DebugFrame(v.frame); + if (v.frame) + frame = new DebugFrame(v.frame); state = v.state; - stack = new DebugStack(v.stack); + if (v.stack) + stack = new DebugStack(v.stack); } + DebugThread clone() { return new DebugThread(this); } @property int length() { return stack ? stack.length : 0; } DebugFrame opIndex(int index) { return stack ? stack[index] : null; } @@ -110,6 +116,7 @@ class DebugThreadList { foreach(t; v.threads) threads ~= new DebugThread(t); } + DebugThreadList clone() { return new DebugThreadList(this); } @property DebugThread currentThread() { return findThread(currentThreadId); @@ -196,6 +203,9 @@ interface DebuggerCallback : ProgramExecutionStatusListener { void onDebugState(DebuggingState state, StateChangeReason reason, DebugFrame location, Breakpoint bp); void onResponse(ResponseCode code, string msg); + + /// send debug context (threads, stack frames, local vars...) + void onDebugContextInfo(DebugThreadList info); } enum ResponseCode : int { @@ -277,6 +287,11 @@ class DebuggerProxy : Debugger, DebuggerCallback { _callbackDelegate( delegate() { _callback.onDebugState(state, reason, location, bp); } ); } + /// send debug context (threads, stack frames, local vars...) + void onDebugContextInfo(DebugThreadList info) { + _callbackDelegate( delegate() { _callback.onDebugContextInfo(info); } ); + } + void onResponse(ResponseCode code, string msg) { _callbackDelegate( delegate() { _callback.onResponse(code, msg); } ); } diff --git a/src/ddebug/gdb/gdbinterface.d b/src/ddebug/gdb/gdbinterface.d index 4b6d080..617224b 100644 --- a/src/ddebug/gdb/gdbinterface.d +++ b/src/ddebug/gdb/gdbinterface.d @@ -569,6 +569,7 @@ class GDBInterface : ConsoleDebuggerInterface, TextCommandTarget { if (currentThread.length > 0) { currentThread[0].locals = variables; Log.d("Setting variables for current thread top frame"); + _callback.onDebugContextInfo(_currentState.clone()); } } } diff --git a/src/dlangide/ui/debuggerui.d b/src/dlangide/ui/debuggerui.d index fce7bf7..5d53b4b 100644 --- a/src/dlangide/ui/debuggerui.d +++ b/src/dlangide/ui/debuggerui.d @@ -34,6 +34,11 @@ class DebuggerUIHandler : DebuggerCallback { //_callbackDelegate( delegate() { _callback.onProgramExecutionStatus(this, status, exitCode); } ); } + /// send debug context (threads, stack frames, local vars...) + void onDebugContextInfo(DebugThreadList info) { + Log.d("Debugger context received"); + } + void onResponse(ResponseCode code, string msg) { Log.d("Debugger response: ", code, " ", msg); //_callbackDelegate( delegate() { _callback.onResponse(code, msg); } );