Initial work on varobjs. Tests locks up an image, should be polished and folded.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 19 Mar 2015 08:43:28 +0000
changeset 74 d53d325c2930
parent 73 f5fe22f56f10
child 75 0b8ce7d74318
Initial work on varobjs. Tests locks up an image, should be polished and folded.
GDBMI_stack_info_frame.st
GDBMI_thread_info.st
GDBMI_thread_list_ids.st
GDBVariable.st
GDBVariableObject.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
tests/GDBDebuggerTestsR.st
tests/GDBMIParserTests.st
--- a/GDBMI_stack_info_frame.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/GDBMI_stack_info_frame.st	Thu Mar 19 08:43:28 2015 +0000
@@ -1,5 +1,9 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs' }"
 
+"{ NameSpace: Smalltalk }"
+
 GDBMICommand subclass:#GDBMI_stack_info_frame
 	instanceVariableNames:''
 	classVariableNames:''
@@ -47,3 +51,13 @@
 	^ 'stack-info-frame'
 ! !
 
+!GDBMI_stack_info_frame methodsFor:'accessing-descriptors'!
+
+resultDescription
+    ^ (super resultDescription)
+        define:#frame as:GDBFrame;
+        yourself
+
+    "Created: / 19-03-2015 / 08:29:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBMI_thread_info.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/GDBMI_thread_info.st	Thu Mar 19 08:43:28 2015 +0000
@@ -117,8 +117,13 @@
             of:GDBThreadInfo;
         yourself
 
+    "
+    GDBMI_thread_info new resultDescription
+    "
+
     "Created: / 17-09-2014 / 00:00:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 08-03-2015 / 08:20:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 18-03-2015 / 17:05:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBMI_thread_info class methodsFor:'documentation'!
--- a/GDBMI_thread_list_ids.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/GDBMI_thread_list_ids.st	Thu Mar 19 08:43:28 2015 +0000
@@ -1,5 +1,9 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs' }"
 
+"{ NameSpace: Smalltalk }"
+
 GDBMICommand subclass:#GDBMI_thread_list_ids
 	instanceVariableNames:''
 	classVariableNames:''
@@ -50,3 +54,19 @@
 	^ 'thread-list-ids'
 ! !
 
+!GDBMI_thread_list_ids methodsFor:'accessing-descriptors'!
+
+resultDescription     
+    ^ (super resultDescription)
+        define:#'thread-ids' as:Array of:Integer;
+        define:#'current-thread-id' as: Integer;
+        define:#'number-of-threads' as: Integer;
+        yourself
+
+    "
+    GDBMI_thread_list_ids new resultDescription
+    "
+
+    "Created: / 19-03-2015 / 08:35:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBVariable.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/GDBVariable.st	Thu Mar 19 08:43:28 2015 +0000
@@ -1,9 +1,11 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs' }"
 
 "{ NameSpace: Smalltalk }"
 
 GDBTransientObject subclass:#GDBVariable
-	instanceVariableNames:'frame name value'
+	instanceVariableNames:'frame name value varobj'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'GDB-Core'
@@ -27,9 +29,47 @@
 !
 
 value
-    ^ value
+    ^ self varobj value
 
     "Created: / 27-02-2015 / 23:37:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-03-2015 / 16:47:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBVariable methodsFor:'accessing-private'!
+
+varobj
+    varobj isNil ifTrue:[ 
+        | result currentThreadId currentFrameId |
+
+        result := debugger send: (GDBMI_thread_list_ids new).
+        currentThreadId := result propertyAt: 'current-thread-id'.
+        result := debugger send: (GDBMI_stack_info_frame new).
+        currentFrameId := (result propertyAt: 'frame') level.
+        
+        frame thread id ~= currentThreadId ifTrue:[ 
+            debugger send: (GDBMI_thread_select new arguments:(Array with:frame thread id)).       
+            debugger send: (GDBMI_stack_select_frame new arguments:(Array with:frame level)).       
+        ] ifFalse:[ 
+            frame level ~= currentFrameId ifTrue:[ 
+                debugger send: (GDBMI_stack_select_frame new arguments:(Array with:frame level)).       
+            ].
+        ].
+
+        result := debugger send: (GDBMI_var_create new arguments: { '-' . '*' . name }).
+
+        frame thread id ~= currentThreadId ifTrue:[ 
+            debugger send: (GDBMI_thread_select new arguments:currentThreadId).       
+            debugger send: (GDBMI_stack_select_frame new arguments:currentFrameId).       
+        ] ifFalse:[ 
+            frame level ~= currentFrameId ifTrue:[ 
+                debugger send: (GDBMI_stack_select_frame new arguments:currentFrameId).       
+            ].
+        ].
+    ].
+    ^ varobj value
+
+    "Created: / 27-02-2015 / 17:18:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-03-2015 / 16:52:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBVariable methodsFor:'initialization'!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBVariableObject.st	Thu Mar 19 08:43:28 2015 +0000
@@ -0,0 +1,39 @@
+"{ Package: 'jv:libgdbs' }"
+
+"{ NameSpace: Smalltalk }"
+
+GDBObject subclass:#GDBVariableObject
+	instanceVariableNames:'name value'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private-Model'
+!
+
+!GDBVariableObject methodsFor:'accessing'!
+
+name
+    ^ name
+!
+
+value
+    ^ value
+! !
+
+!GDBVariableObject methodsFor:'accessing - GDB value descriptors'!
+
+description
+    ^ (super description)
+        define:#name as:String;
+        define:#numchild as:Integer;
+        define:#value as:String;
+        define:#type as:String;
+        define:#'thread-id' as:Integer;
+        define:#has_more as:Boolean;
+        define:#dynamic as:Boolean;
+        define:#displayhint as:String;
+        yourself
+
+    "Created: / 16-09-2014 / 23:59:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-02-2015 / 17:10:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/Make.proto	Thu Mar 19 08:25:30 2015 +0000
+++ b/Make.proto	Thu Mar 19 08:43:28 2015 +0000
@@ -168,6 +168,7 @@
 $(OUTDIR)GDBThreadStateStopped.$(O) GDBThreadStateStopped.$(H): GDBThreadStateStopped.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadState.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateTerminated.$(O) GDBThreadStateTerminated.$(H): GDBThreadStateTerminated.st $(INCLUDE_TOP)/jv/libgdbs/GDBThreadState.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSetEvent.$(O) GDBEventSetEvent.$(H): GDBEventSetEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBInternalEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Thu Mar 19 08:25:30 2015 +0000
+++ b/Make.spec	Thu Mar 19 08:43:28 2015 +0000
@@ -90,6 +90,7 @@
 	GDBThreadStateStopped \
 	GDBThreadStateTerminated \
 	GDBUnixProcess \
+	GDBVariableObject \
 	GDBBreakpoint \
 	GDBConsoleOutputEvent \
 	GDBEventSetEvent \
@@ -276,6 +277,7 @@
     $(OUTDIR_SLASH)GDBThreadStateStopped.$(O) \
     $(OUTDIR_SLASH)GDBThreadStateTerminated.$(O) \
     $(OUTDIR_SLASH)GDBUnixProcess.$(O) \
+    $(OUTDIR_SLASH)GDBVariableObject.$(O) \
     $(OUTDIR_SLASH)GDBBreakpoint.$(O) \
     $(OUTDIR_SLASH)GDBConsoleOutputEvent.$(O) \
     $(OUTDIR_SLASH)GDBEventSetEvent.$(O) \
--- a/abbrev.stc	Thu Mar 19 08:25:30 2015 +0000
+++ b/abbrev.stc	Thu Mar 19 08:43:28 2015 +0000
@@ -41,6 +41,7 @@
 GDBThreadStateStopped GDBThreadStateStopped jv:libgdbs 'GDB-Core' 1
 GDBThreadStateTerminated GDBThreadStateTerminated jv:libgdbs 'GDB-Core' 1
 GDBUnixProcess GDBUnixProcess jv:libgdbs 'GDB-Private' 0
+GDBVariableObject GDBVariableObject jv:libgdbs 'GDB-Private-Model' 0
 GDBBreakpoint GDBBreakpoint jv:libgdbs 'GDB-Core' 0
 GDBConsoleOutputEvent GDBConsoleOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBEventSetEvent GDBEventSetEvent jv:libgdbs 'GDB-Core-Events' 0
--- a/bc.mak	Thu Mar 19 08:25:30 2015 +0000
+++ b/bc.mak	Thu Mar 19 08:43:28 2015 +0000
@@ -115,6 +115,7 @@
 $(OUTDIR)GDBThreadStateStopped.$(O) GDBThreadStateStopped.$(H): GDBThreadStateStopped.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadState.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStateTerminated.$(O) GDBThreadStateTerminated.$(H): GDBThreadStateTerminated.st $(INCLUDE_TOP)\jv\libgdbs\GDBThreadState.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBVariableObject.$(O) GDBVariableObject.$(H): GDBVariableObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEventSetEvent.$(O) GDBEventSetEvent.$(H): GDBEventSetEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBInternalEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/jv_libgdbs.st	Thu Mar 19 08:43:28 2015 +0000
@@ -113,6 +113,7 @@
         GDBThreadStateStopped
         GDBThreadStateTerminated
         GDBUnixProcess
+        GDBVariableObject
         GDBBreakpoint
         GDBConsoleOutputEvent
         GDBEventSetEvent
--- a/libInit.cc	Thu Mar 19 08:25:30 2015 +0000
+++ b/libInit.cc	Thu Mar 19 08:43:28 2015 +0000
@@ -66,6 +66,7 @@
 _GDBThreadStateStopped_Init(pass,__pRT__,snd);
 _GDBThreadStateTerminated_Init(pass,__pRT__,snd);
 _GDBUnixProcess_Init(pass,__pRT__,snd);
+_GDBVariableObject_Init(pass,__pRT__,snd);
 _GDBBreakpoint_Init(pass,__pRT__,snd);
 _GDBConsoleOutputEvent_Init(pass,__pRT__,snd);
 _GDBEventSetEvent_Init(pass,__pRT__,snd);
--- a/tests/GDBDebuggerTestsR.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/tests/GDBDebuggerTestsR.st	Thu Mar 19 08:43:28 2015 +0000
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs/tests' }"
 
 "{ NameSpace: Smalltalk }"
@@ -57,6 +59,8 @@
     frame2 := thread1 stack second.
     self assert: frame1 variables size == 1.
     self assert: frame1 variables first name = 'i'.
+    self assert: frame1 variables first value = 'i'.
+
 
     self assert: frame2 variables size == 4.
     self assert: frame2 variables first name = 'argc'.
@@ -70,7 +74,7 @@
     self assert: thread1 isDead
 
     "Created: / 28-02-2015 / 00:55:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 08-03-2015 / 09:11:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-03-2015 / 16:49:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_03
--- a/tests/GDBMIParserTests.st	Thu Mar 19 08:25:30 2015 +0000
+++ b/tests/GDBMIParserTests.st	Thu Mar 19 08:43:28 2015 +0000
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs/tests' }"
 
 "{ NameSpace: Smalltalk }"
@@ -62,7 +64,7 @@
     self assert:(GDBMIParser on:'"\H\e\l\l\o" xxx') parseCString = 'Hello'.
     self assert:(GDBMIParser on:'"Hel\nlo" xxx') parseCString = 'Hel
 lo'.
-    self assert:(GDBMIParser on:'"X\xE1X" xxx') parseCString = 'XáX'.
+    self assert:(GDBMIParser on:'"X\xE1X" xxx') parseCString = 'XáX'.
     self 
         assert:(GDBMIParser 
                 on:'"warning: File \"/home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/stx/.gdbinit\" auto-loading has been declined by your `auto-load safe-path'' set to \"$debugdir:$datadir/auto-load\".\n"') 
@@ -151,6 +153,24 @@
     self assert: (result propertyAt:'threads') first state == GDBThreadStateRunning theOneAndOnlyInstance.
 
     "Created: / 08-03-2015 / 08:13:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_command_var_create_01
+    | parser events result |
+
+    parser := GDBMIParser 
+            on:'14^done,name="var1",numchild="0",value="5",type="int",thread-id="1",has_more="0"'.
+    parser token2CommandMappingBlock:[:token | GDBMI_var_create new ].
+    events := parser parseOutput.
+
+    self assert:events size == 1.
+    result := events first result.
+
+    self assert:((result value) isKindOf: GDBVariableObject).
+    self assert: (result value) name = 'var1'.
+    self assert: (result value) value = '5'.
+
+    "Created: / 19-03-2015 / 07:46:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBMIParserTests methodsFor:'tests - examples'!