>From b54f6a531841b6eae43d956d6cb3cec6337312e7 Mon Sep 17 00:00:00 2001
From: Gwenael Casaccio
Date: Mon, 21 Oct 2013 11:23:16 +0200
Subject: [PATCH] Add >>#restart to the debugger and add support for
GtkDebugger too
---
packages/debug/ChangeLog | 5 +++
packages/debug/DebugTools.st | 35 ++++++++++++++++++
packages/debug/debugtests.st | 57 ++++++++++++++++++++++++++++++
packages/visualgst/ChangeLog | 4 +++
packages/visualgst/Debugger/GtkDebugger.st | 13 +++++++
5 files changed, 114 insertions(+)
diff --git a/packages/debug/ChangeLog b/packages/debug/ChangeLog
index 55bd1a1..c118c0c 100644
--- a/packages/debug/ChangeLog
+++ b/packages/debug/ChangeLog
@@ -1,4 +1,9 @@
2013-10-21 Gwenael Casaccio
+
+ * debugtests.st: Add test for >>#restart.
+ * DebugTools.st: Restart a execution of a context (useful it the method is updated).
+
+2013-10-21 Gwenael Casaccio
* DebugTools.st: Add >>#eval: allowing evaluation of code with the current context temps and args names.
* maybe/Maybe.st: Maybe monad pattern.
diff --git a/packages/debug/DebugTools.st b/packages/debug/DebugTools.st
index 1801c5c..c79c744 100644
--- a/packages/debug/DebugTools.st
+++ b/packages/debug/DebugTools.st
@@ -132,6 +132,41 @@ pointer bytecodes to line numbers.'>
exception isNil ifFalse: [exception signal]
]
+ restart [
+
+
+ self restart: self suspendedContext.
+ ]
+
+ restart: aContext [
+
+
+ | context method newContext |
+
+ context := self suspendedContext.
+
+ [ context = aContext ] whileFalse: [ context := context parentContext ].
+
+ context isBlock ifTrue: [ context outerContext isNil ifTrue: [ ^ self ].
+ context := context outerContext ].
+
+ method := context receiver class >> context method selector.
+
+ newContext := MethodContext new: method stackDepth.
+
+ newContext parentContext: context parentContext.
+ newContext ip: 0.
+ newContext instVarAt: 4 put: -1 + method numArgs + method numTemps. " stack pointer "
+ newContext instVarAt: 5 put: context receiver. " receiver "
+ newContext instVarAt: 6 put: method. " method "
+ newContext instVarAt: 7 put: (context instVarAt: 7). " flags "
+
+ 1 to: method numArgs do: [ :i |
+ newContext at: i put: (context at: i) ].
+
+ process suspendedContext: newContext
+ ]
+
stepBytecode [
"Run a single bytecode in the inferior process."
diff --git a/packages/debug/debugtests.st b/packages/debug/debugtests.st
index 4ba1ada..c32f602 100644
--- a/packages/debug/debugtests.st
+++ b/packages/debug/debugtests.st
@@ -336,6 +336,51 @@ TestCase subclass: DebuggerTest [
self assert: (debugger eval: '^ z') = 4.
]
+ testRestart [
+ " Test that #restart "
+
+
+
+ | debugger i j |
+
+ debugger := self debuggerOn: [
+ i := self restart ].
+ debugger step.
+ self assert: debugger suspendedContext method == (self class >> #restart).
+
+ self class compile: 'restart [ | i | i := 234. ^ i * 2 ]'.
+
+ debugger restart.
+ self assert: debugger suspendedContext method == (self class >> #restart).
+ self assert: debugger suspendedContext receiver == self.
+ self assert: debugger suspendedContext ip == 0.
+ self assert: debugger suspendedContext sp == 0.
+
+ debugger next; next.
+
+ self assert: i = 468.
+
+ j := OrderedCollection new.
+ j add: 123.
+ debugger := self debuggerOn: [
+ i := self restart_1: j ].
+ debugger step; step.
+ self assert: debugger suspendedContext method == (self class >> #restart_1:).
+
+ self class compile: 'restart_1: anObject [ ^ anObject first ]'.
+
+ j addFirst: 234.
+ debugger restart.
+ self assert: debugger suspendedContext method == (self class >> #restart_1:).
+ self assert: debugger suspendedContext receiver == self.
+ self assert: debugger suspendedContext ip == 0.
+ self assert: debugger suspendedContext sp == 0.
+
+ debugger next; next.
+
+ self assert: i = 234.
+ ]
+
w [
self x: [:foo | ^foo]
@@ -355,5 +400,17 @@ TestCase subclass: DebuggerTest [
^anObject
]
+
+ restart [
+
+
+ ^ 123 * 2
+ ]
+
+ restart_1: anObject [
+
+
+ ^ anObject first * 2
+ ]
]
diff --git a/packages/visualgst/ChangeLog b/packages/visualgst/ChangeLog
index 3b43a5f..addf608 100644
--- a/packages/visualgst/ChangeLog
+++ b/packages/visualgst/ChangeLog
@@ -1,5 +1,9 @@
2013-10-21 Gwenael Casaccio
+ * Debugger/GtkDebugger.st: Code can be changed in the debugger.
+
+2013-10-21 Gwenael Casaccio
+
* Debugger/GtkDebugger.st: Eval code in the debugger.
2013-10-18 Gwenael Casaccio
diff --git a/packages/visualgst/Debugger/GtkDebugger.st b/packages/visualgst/Debugger/GtkDebugger.st
index f0fb969..e629a29 100644
--- a/packages/visualgst/Debugger/GtkDebugger.st
+++ b/packages/visualgst/Debugger/GtkDebugger.st
@@ -498,5 +498,18 @@ GtkBrowsingTool subclass: GtkDebugger [
self onFocusPerform: #showReplace
]
+ selectAnInstanceMethod: aMethod [
+
+
+ debugger restart: contextWidget selectedContext.
+ self updateContextWidget
+ ]
+
+ selectAClassMethod: aMethod [
+
+
+ debugger restart: contextWidget selectedContext.
+ self updateContextWidget
+ ]
]
--
1.8.3.2