Some more support for stack frames.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 17 Sep 2014 09:01:56 +0100
changeset 40 0ce76b671515
parent 39 2b9d2f75906f
child 41 fb48207b6104
Some more support for stack frames.
GDBDebugger.st
GDBFrame.st
GDBMI_stack_info_depth.st
GDBMI_stack_list_frames.st
GDBMI_thread_info.st
GDBParser.st
GDBSimulatorResource.st
GDBStack.st
GDBThread.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/GDBDebuggerTests.st
tests/GDBParserTests.st
tests/tests.rc
--- a/GDBDebugger.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBDebugger.st	Wed Sep 17 09:01:56 2014 +0100
@@ -115,26 +115,29 @@
     "Sends given command to GDB. If `aBoolean` is true, wait for
      command to finish. Otherwise, return immediately."
 
-    | token blocker releaser |
+    | token blocker releaser result |
 
     token := self nextCommandSequnceNumber.
     aGDBCommand token: token.
-    aBoolean ifTrue:[ 
+    ^ aBoolean ifTrue:[ 
         releaser := [ :ev |
                     ev token == token ifTrue:[ 
-                        self announcer unsubscribe: releaser.  
+                        self announcer unsubscribe: releaser.
+                        result := ev result.
                         blocker signal.
                     ]].
         blocker := Semaphore new.
         self announcer when: GDBCommandResultEvent do: releaser.
         connection pushEvent: (GDBCommandEvent new command: aGDBCommand).
         blocker wait.
+        result.
     ] ifFalse:[
         connection pushEvent: (GDBCommandEvent new command: aGDBCommand).
+        nil.
     ]
 
     "Created: / 02-06-2014 / 23:45:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-06-2014 / 09:32:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 16-09-2014 / 23:44:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebugger methodsFor:'event handling'!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBFrame.st	Wed Sep 17 09:01:56 2014 +0100
@@ -0,0 +1,55 @@
+"{ Package: 'jv:libgdbs' }"
+
+GDBDebuggerObject subclass:#GDBFrame
+	instanceVariableNames:'level addr func file fullname line from'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core'
+!
+
+!GDBFrame class methodsFor:'accessing - GDB value descriptors'!
+
+gdbValueDescriptor
+    ^ (super gdbValueDescriptor)
+        define: #level as: Integer;
+        define: #func as: String;
+        define: #file as: String;
+        define: #fullname as: String;
+        define: #line as: Integer;
+        define: #from as: String;
+        define: #addr as: Integer;
+        yourself
+
+    "Created: / 16-09-2014 / 23:59:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBFrame methodsFor:'accessing'!
+
+addr
+    ^ addr
+!
+
+file
+    ^ file
+!
+
+from
+    ^ from
+!
+
+fullname
+    ^ fullname
+!
+
+func
+    ^ func
+!
+
+level
+    ^ level
+!
+
+line
+    ^ line
+! !
+
--- a/GDBMI_stack_info_depth.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBMI_stack_info_depth.st	Wed Sep 17 09:01:56 2014 +0100
@@ -59,6 +59,16 @@
 	^ 'stack-info-depth'
 ! !
 
+!GDBMI_stack_info_depth methodsFor:'accessing-descriptors'!
+
+resultValueDescriptor
+    ^ (super resultValueDescriptor)
+        define: #depth as: Integer;
+        yourself
+
+    "Created: / 16-09-2014 / 23:37:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBMI_stack_info_depth class methodsFor:'documentation'!
 
 version_HG
--- a/GDBMI_stack_list_frames.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBMI_stack_list_frames.st	Wed Sep 17 09:01:56 2014 +0100
@@ -127,3 +127,13 @@
 	^ 'stack-list-frames'
 ! !
 
+!GDBMI_stack_list_frames methodsFor:'accessing-descriptors'!
+
+resultValueDescriptor
+    ^ (super resultValueDescriptor)
+        define: #stack as: Array of: GDBFrame;
+        yourself
+
+    "Created: / 17-09-2014 / 00:00:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBMI_thread_info.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBMI_thread_info.st	Wed Sep 17 09:01:56 2014 +0100
@@ -104,3 +104,10 @@
 	^ 'thread-info'
 ! !
 
+!GDBMI_thread_info class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/GDBParser.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBParser.st	Wed Sep 17 09:01:56 2014 +0100
@@ -759,6 +759,10 @@
     self peek ~~ $] ifTrue:[
         list := OrderedCollection new.
         [ 
+            self peek isAlphaNumeric ifTrue:[ 
+                self parseVariable.
+                self expect: $=. 
+            ].
             list add: (descriptor parseUsingParser: self)
         ] doWhile: [ 
             (self peek == $,) ifTrue:[ self next. true ] ifFalse:[ false ]
@@ -768,6 +772,7 @@
     ^ list
 
     "Created: / 18-06-2014 / 21:00:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-09-2014 / 08:03:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBParser methodsFor:'streaming'!
--- a/GDBSimulatorResource.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBSimulatorResource.st	Wed Sep 17 09:01:56 2014 +0100
@@ -70,22 +70,38 @@
 ';
 
 >>>
-'5del 1';
+'5-stack-info-depth --thread 1 100';
+
+<<<
+'5^done,depth="2"
+(gdb) 
+';
+
+>>>
+'6-stack-list-frames --thread 1 0 1';
+
+<<<
+'6^done,stack=[frame={level="0",addr="0x000107a4",func="factorial",file="factorial.c",fullname="/home/foo/bar/factorial.c",line="4"},frame={level="0",addr="0x000107a0",func="main",file="factorial.c",fullname="/home/foo/bar/factorial.c",line="13"}]
+(gdb)
+';
+
+>>>
+'7del 1';
 
 <<<
 '&"del 1\n"
 =breakpoint-deleted,id="1"
-5^done
+7^done
 (gdb) 
 ';
 
 >>>
-'6c';
+'8c';
 
 <<<
 '&"c\n"
 ~"Continuing.\n"
-6^running
+8^running
 *running,thread-id="all"
 (gdb) 
 ';
@@ -99,5 +115,7 @@
 ';
 
 yourself
+
+    "Modified: / 17-09-2014 / 07:36:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- a/GDBStack.st	Tue Sep 09 12:44:37 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-"{ Package: 'jv:libgdbs' }"
-
-SequenceableCollection subclass:#GDBStack
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Core'
-!
-
-!GDBStack class methodsFor:'instance creation'!
-
-newWithThread:arg
-    "raise an error: this method should be implemented (TODO)"
-
-    ^ self shouldImplement
-
-    "Created: / 09-09-2014 / 00:05:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!GDBStack class methodsFor:'misc ui support'!
-
-iconInBrowserSymbol
-    <resource: #programImage>
-
-    ^ #containerClassBrowserIcon
-! !
-
--- a/GDBThread.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/GDBThread.st	Wed Sep 17 09:01:56 2014 +0100
@@ -39,12 +39,17 @@
 
 stack
     self ensureIsStopped.
-    stack isNil ifTrue:[ 
-        stack := GDBStack newWithThread: self.
+    stack isNil ifTrue:[
+        | result depth |
+        result := debugger send: (GDBMI_stack_info_depth new arguments: { '--thread' . id . 100 }).
+        depth := result propertyAt: #depth.
+        result := debugger send: (GDBMI_stack_list_frames new arguments: { '--thread' . id . 0 . depth - 1 }).
+        stack := result propertyAt: #stack.
     ].
     ^ stack
 
     "Created: / 09-09-2014 / 00:02:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-09-2014 / 00:02:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 status
@@ -89,7 +94,7 @@
 !GDBThread methodsFor:'private'!
 
 ensureIsStopped
-    self isStopped ifTrue:[
+    self isStopped ifFalse:[
         (GDBInvalidObject newException)
             parameter:self;
             messageText:'Invalid state (thread is running or already dead)';
@@ -97,6 +102,7 @@
     ].
 
     "Created: / 09-09-2014 / 00:04:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 16-09-2014 / 23:51:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBThread methodsFor:'testing'!
--- a/Make.proto	Tue Sep 09 12:44:37 2014 +0100
+++ b/Make.proto	Wed Sep 17 09:01:56 2014 +0100
@@ -138,7 +138,6 @@
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBProcess.$(O) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSessionRecord.$(O) GDBSessionRecord.$(H): GDBSessionRecord.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
-$(OUTDIR)GDBStack.$(O) GDBStack.$(H): GDBStack.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStatus.$(O) GDBThreadStatus.$(H): GDBThreadStatus.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptor.$(O) GDBValueDescriptor.$(H): GDBValueDescriptor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -171,6 +170,7 @@
 $(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)GDBExecutionEvent.$(O) GDBExecutionEvent.$(H): GDBExecutionEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExitEvent.$(O) GDBExitEvent.$(H): GDBExitEvent.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)
+$(OUTDIR)GDBFrame.$(O) GDBFrame.$(H): GDBFrame.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBIntegerValueDescriptor.$(O) GDBIntegerValueDescriptor.$(H): GDBIntegerValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBListValueDescriptor.$(O) GDBListValueDescriptor.$(H): GDBListValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBCompoundValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLogOutputEvent.$(O) GDBLogOutputEvent.$(H): GDBLogOutputEvent.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)
--- a/Make.spec	Tue Sep 09 12:44:37 2014 +0100
+++ b/Make.spec	Wed Sep 17 09:01:56 2014 +0100
@@ -61,7 +61,6 @@
 	GDBPTY \
 	GDBProcess \
 	GDBSessionRecord \
-	GDBStack \
 	GDBThreadStatus \
 	GDBValueDescriptor \
 	GDBValueDescriptorError \
@@ -94,6 +93,7 @@
 	GDBConsoleOutputEvent \
 	GDBExecutionEvent \
 	GDBExitEvent \
+	GDBFrame \
 	GDBIntegerValueDescriptor \
 	GDBListValueDescriptor \
 	GDBLogOutputEvent \
@@ -247,7 +247,6 @@
     $(OUTDIR_SLASH)GDBPTY.$(O) \
     $(OUTDIR_SLASH)GDBProcess.$(O) \
     $(OUTDIR_SLASH)GDBSessionRecord.$(O) \
-    $(OUTDIR_SLASH)GDBStack.$(O) \
     $(OUTDIR_SLASH)GDBThreadStatus.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptorError.$(O) \
@@ -280,6 +279,7 @@
     $(OUTDIR_SLASH)GDBConsoleOutputEvent.$(O) \
     $(OUTDIR_SLASH)GDBExecutionEvent.$(O) \
     $(OUTDIR_SLASH)GDBExitEvent.$(O) \
+    $(OUTDIR_SLASH)GDBFrame.$(O) \
     $(OUTDIR_SLASH)GDBIntegerValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBListValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBLogOutputEvent.$(O) \
--- a/abbrev.stc	Tue Sep 09 12:44:37 2014 +0100
+++ b/abbrev.stc	Wed Sep 17 09:01:56 2014 +0100
@@ -13,7 +13,6 @@
 GDBProcess GDBProcess jv:libgdbs 'GDB-Private' 0
 GDBSessionRecord GDBSessionRecord jv:libgdbs 'GDB-Private-Simulator' 0
 GDBSimulatorResource GDBSimulatorResource jv:libgdbs 'GDB-Resources' 1
-GDBStack GDBStack jv:libgdbs 'GDB-Core' 0
 GDBThreadStatus GDBThreadStatus jv:libgdbs 'GDB-Core' 0
 GDBValueDescriptor GDBValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBValueDescriptorError GDBValueDescriptorError jv:libgdbs 'GDB-Private-Descriptors' 1
@@ -46,6 +45,7 @@
 GDBConsoleOutputEvent GDBConsoleOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBExecutionEvent GDBExecutionEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBExitEvent GDBExitEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBFrame GDBFrame jv:libgdbs 'GDB-Core' 0
 GDBIntegerValueDescriptor GDBIntegerValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBListValueDescriptor GDBListValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBLogOutputEvent GDBLogOutputEvent jv:libgdbs 'GDB-Core-Events' 0
--- a/bc.mak	Tue Sep 09 12:44:37 2014 +0100
+++ b/bc.mak	Wed Sep 17 09:01:56 2014 +0100
@@ -84,7 +84,6 @@
 $(OUTDIR)GDBPTY.$(O) GDBPTY.$(H): GDBPTY.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBProcess.$(O) GDBProcess.$(H): GDBProcess.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSessionRecord.$(O) GDBSessionRecord.$(H): GDBSessionRecord.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
-$(OUTDIR)GDBStack.$(O) GDBStack.$(H): GDBStack.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
 $(OUTDIR)GDBThreadStatus.$(O) GDBThreadStatus.$(H): GDBThreadStatus.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptor.$(O) GDBValueDescriptor.$(H): GDBValueDescriptor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -117,6 +116,7 @@
 $(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)GDBExecutionEvent.$(O) GDBExecutionEvent.$(H): GDBExecutionEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExitEvent.$(O) GDBExitEvent.$(H): GDBExitEvent.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)
+$(OUTDIR)GDBFrame.$(O) GDBFrame.$(H): GDBFrame.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBIntegerValueDescriptor.$(O) GDBIntegerValueDescriptor.$(H): GDBIntegerValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBListValueDescriptor.$(O) GDBListValueDescriptor.$(H): GDBListValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBCompoundValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLogOutputEvent.$(O) GDBLogOutputEvent.$(H): GDBLogOutputEvent.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)
--- a/jv_libgdbs.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/jv_libgdbs.st	Wed Sep 17 09:01:56 2014 +0100
@@ -78,7 +78,6 @@
         GDBProcess
         GDBSessionRecord
         (GDBSimulatorResource autoload)
-        GDBStack
         GDBThreadStatus
         GDBValueDescriptor
         GDBValueDescriptorError
@@ -111,6 +110,7 @@
         GDBConsoleOutputEvent
         GDBExecutionEvent
         GDBExitEvent
+        GDBFrame
         GDBIntegerValueDescriptor
         GDBListValueDescriptor
         GDBLogOutputEvent
--- a/libInit.cc	Tue Sep 09 12:44:37 2014 +0100
+++ b/libInit.cc	Wed Sep 17 09:01:56 2014 +0100
@@ -38,7 +38,6 @@
 _GDBPTY_Init(pass,__pRT__,snd);
 _GDBProcess_Init(pass,__pRT__,snd);
 _GDBSessionRecord_Init(pass,__pRT__,snd);
-_GDBStack_Init(pass,__pRT__,snd);
 _GDBThreadStatus_Init(pass,__pRT__,snd);
 _GDBValueDescriptor_Init(pass,__pRT__,snd);
 _GDBValueDescriptorError_Init(pass,__pRT__,snd);
@@ -71,6 +70,7 @@
 _GDBConsoleOutputEvent_Init(pass,__pRT__,snd);
 _GDBExecutionEvent_Init(pass,__pRT__,snd);
 _GDBExitEvent_Init(pass,__pRT__,snd);
+_GDBFrame_Init(pass,__pRT__,snd);
 _GDBIntegerValueDescriptor_Init(pass,__pRT__,snd);
 _GDBListValueDescriptor_Init(pass,__pRT__,snd);
 _GDBLogOutputEvent_Init(pass,__pRT__,snd);
--- a/libgdbs.rc	Tue Sep 09 12:44:37 2014 +0100
+++ b/libgdbs.rc	Wed Sep 17 09:01:56 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Tue, 09 Sep 2014 11:44:03 GMT\0"
+      VALUE "ProductDate", "Wed, 17 Sep 2014 07:57:32 GMT\0"
     END
 
   END
--- a/tests/GDBDebuggerTests.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/tests/GDBDebuggerTests.st	Wed Sep 17 09:01:56 2014 +0100
@@ -99,6 +99,7 @@
     self assert: debugger inferiors anElement threads anElement isTerminated not.
     self assert: debugger inferiors anElement threads anElement isRunning not.
     self assert: debugger inferiors anElement threads anElement isStopped.
+    self assert: debugger inferiors anElement threads anElement stack size == 2. 
 
     tgevent := tevent := nil.
 
@@ -117,7 +118,7 @@
     self assert: debugger inferiors anElement threads anElement isStopped not.
 
     "Created: / 07-09-2014 / 13:37:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 07-09-2014 / 23:25:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 16-09-2014 / 23:47:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebuggerTests class methodsFor:'documentation'!
--- a/tests/GDBParserTests.st	Tue Sep 09 12:44:37 2014 +0100
+++ b/tests/GDBParserTests.st	Wed Sep 17 09:01:56 2014 +0100
@@ -467,6 +467,50 @@
     self assert:object properties isEmptyOrNil
 
     "Created: / 19-06-2014 / 09:42:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_typed_object_02a
+    | descriptor  object |
+
+    descriptor := GDBObjectValueDescriptor forClass:self class.
+    descriptor define:#prop1 as:Integer.
+    descriptor define:#prop2 as:Boolean.
+    object := (GDBParser on:'[{prop1="123",prop2="y"},{prop1="789",prop2="n"}]') 
+            parseValueAsListOf:self class
+            describedBy:descriptor.
+    self assert: object size == 2.
+    self assert: object first class == self class.
+    self assert: object first prop1 == 123.
+    self assert: object first prop2.
+    self assert: object first properties isEmptyOrNil.
+    self assert: object second class == self class.
+    self assert: object second prop1 == 789.
+    self assert: object second prop2 not.
+    self assert: object second properties isEmptyOrNil
+
+    "Created: / 17-09-2014 / 07:42:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_typed_object_02b
+    | descriptor  object |
+
+    descriptor := GDBObjectValueDescriptor forClass:self class.
+    descriptor define:#prop1 as:Integer.
+    descriptor define:#prop2 as:Boolean.
+    object := (GDBParser on:'[object={prop1="123",prop2="y"},object={prop1="789",prop2="n"}]') 
+            parseValueAsListOf:self class
+            describedBy:descriptor.
+    self assert: object size == 2.
+    self assert: object first class == self class.
+    self assert: object first prop1 == 123.
+    self assert: object first prop2.
+    self assert: object first properties isEmptyOrNil.
+    self assert: object second class == self class.
+    self assert: object second prop1 == 789.
+    self assert: object second prop2 not.
+    self assert: object second properties isEmptyOrNil
+
+    "Created: / 17-09-2014 / 07:43:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBParserTests class methodsFor:'documentation'!
--- a/tests/tests.rc	Tue Sep 09 12:44:37 2014 +0100
+++ b/tests/tests.rc	Wed Sep 17 09:01:56 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Tue, 09 Sep 2014 11:44:04 GMT\0"
+      VALUE "ProductDate", "Wed, 17 Sep 2014 07:57:34 GMT\0"
     END
 
   END