Make GDBEvent and GDBCommandResult also described by value descriptor...
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 19 Jun 2014 22:16:26 +0100
changeset 18 6bf3d5c400d1
parent 17 10d696c79188
child 19 c48d33e27d34
Make GDBEvent and GDBCommandResult also described by value descriptor... ...so their return values are typed and this parsed as objects.
GDBAsyncEvent.st
GDBCommandResult.st
GDBDriver.st
GDBMICommand.st
GDBMI_exec_continue.st
GDBObjectValueDescriptor.st
GDBParser.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/GDBParserTests.st
tests/tests.rc
--- a/GDBAsyncEvent.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBAsyncEvent.st	Thu Jun 19 22:16:26 2014 +0100
@@ -1,7 +1,7 @@
 "{ Package: 'jv:libgdbs' }"
 
 GDBEvent subclass:#GDBAsyncEvent
-	instanceVariableNames:'type data'
+	instanceVariableNames:'type'
 	classVariableNames:'EventTypeToEventClassMap'
 	poolDictionaries:''
 	category:'GDB-Core-Events'
@@ -85,14 +85,6 @@
 
 !GDBAsyncEvent methodsFor:'accessing'!
 
-data
-    ^ data
-!
-
-data:anArray
-    data := anArray.
-!
-
 type
     ^ type
 !
--- a/GDBCommandResult.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBCommandResult.st	Thu Jun 19 22:16:26 2014 +0100
@@ -1,7 +1,7 @@
 "{ Package: 'jv:libgdbs' }"
 
-Object subclass:#GDBCommandResult
-	instanceVariableNames:'status value'
+GDBObject subclass:#GDBCommandResult
+	instanceVariableNames:'command status'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'GDB-Core-Commands'
@@ -10,20 +10,20 @@
 
 !GDBCommandResult methodsFor:'accessing'!
 
+command
+    ^ command
+!
+
+command:something
+    command := something.
+!
+
 status
     ^ status
 !
 
 status:something
     status := something.
-!
-
-value
-    ^ value
-!
-
-value:something
-    value := something.
 ! !
 
 !GDBCommandResult class methodsFor:'documentation'!
--- a/GDBDriver.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBDriver.st	Thu Jun 19 22:16:26 2014 +0100
@@ -3,7 +3,7 @@
 Object subclass:#GDBDriver
 	instanceVariableNames:'pid debuggerInput debuggerOutput inferiorPTY eventAnnouncer
 		eventQueue eventQueueLock eventQueueNotifier eventDispatchProcess
-		eventPumpProcess'
+		eventPumpProcess outstandingCommands'
 	classVariableNames:''
 	poolDictionaries:'GDBDebugFlags'
 	category:'GDB-Private'
@@ -122,9 +122,11 @@
     command token notNil ifTrue:[ 
         debuggerInput nextPutAll: command token printString.
     ].
+    outstandingCommands add: command.
     debuggerInput nextPutLine: command asString.
 
     "Created: / 02-06-2014 / 23:38:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 22:08:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDriver methodsFor:'event pump'!
@@ -133,6 +135,13 @@
     | parser |
 
     parser := GDBParser on: debuggerOutput.
+    parser token2CommandMappingBlock:[ :token | 
+        | command |
+
+        command :=  outstandingCommands detect:[:cmd | cmd token == token ] ifNone:[nil].
+        command notNil ifTrue:[ outstandingCommands remove: command ].
+        command
+    ].
     [ debuggerOutput atEnd ] whileFalse:[ 
         | eventset |
 
@@ -165,7 +174,7 @@
     ]
 
     "Created: / 02-06-2014 / 22:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 03-06-2014 / 00:54:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 22:10:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventPumpStart
@@ -236,12 +245,14 @@
     eventQueueLock := RecursionLock new.
     eventQueueNotifier := Semaphore new.
     eventAnnouncer := Announcer new.
+    outstandingCommands := Set new.
     eventAnnouncer 
         when:GDBCommandEvent
         send:#onCommand:
         to:self.
 
     "Created: / 09-06-2014 / 18:21:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 22:08:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 release
--- a/GDBMICommand.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBMICommand.st	Thu Jun 19 22:16:26 2014 +0100
@@ -225,6 +225,14 @@
     "Modified: / 12-06-2014 / 00:43:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBMICommand methodsFor:'accessing-descriptors'!
+
+resultValueDescriptor
+    ^ GDBObjectValueDescriptor new
+
+    "Created: / 19-06-2014 / 21:39:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBMICommand methodsFor:'converting'!
 
 asString
--- a/GDBMI_exec_continue.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBMI_exec_continue.st	Thu Jun 19 22:16:26 2014 +0100
@@ -64,3 +64,10 @@
 	^ 'exec-continue'
 ! !
 
+!GDBMI_exec_continue class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/GDBObjectValueDescriptor.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBObjectValueDescriptor.st	Thu Jun 19 22:16:26 2014 +0100
@@ -10,9 +10,11 @@
 !GDBObjectValueDescriptor methodsFor:'accessing'!
 
 propertyDescriptorAt: name
+    properties isNil ifTrue:[ ^ nil ].
     ^ properties at: name ifAbsent:[nil].
 
     "Created: / 18-06-2014 / 20:34:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 21:19:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBObjectValueDescriptor methodsFor:'defining'!
--- a/GDBParser.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/GDBParser.st	Thu Jun 19 22:16:26 2014 +0100
@@ -3,7 +3,7 @@
 "{ Package: 'jv:libgdbs' }"
 
 Object subclass:#GDBParser
-	instanceVariableNames:'source lookahead token'
+	instanceVariableNames:'source lookahead token token2CommandMappingBlock'
 	classVariableNames:''
 	poolDictionaries:'GDBCommandStatus'
 	category:'GDB-Private'
@@ -17,6 +17,14 @@
     "Created: / 27-05-2014 / 23:50:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBParser methodsFor:'accessing'!
+
+token2CommandMappingBlock: aBlock
+    token2CommandMappingBlock := aBlock.
+
+    "Created: / 19-06-2014 / 21:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBParser methodsFor:'initialization'!
 
 on: aStringOrStream
@@ -256,20 +264,36 @@
     result-record → '^' result-class ( ',' result )* nl
     "
 
-    | result |
+    | command result descriptor propertyName propertyDescriptor propertyValue |
 
     self expect: $^.
     result := GDBCommandResult new.
     result status: self parseResultClass.
-    self peek == $, ifTrue:[
-        self next.
-        result value: self parseResult.
+    descriptor := GDBObjectValueDescriptor new.
+    (token notNil and:[ token2CommandMappingBlock notNil ]) ifTrue:[ 
+        command := token2CommandMappingBlock value: token. 
+        command notNil ifTrue:[
+            result command: command.
+            descriptor := command resultValueDescriptor.        
+        ].
     ].
+    [ self peek == $, ] whileTrue:[
+        self next. "/ eat $,
+        propertyName := self parseVariable.
+        propertyDescriptor := descriptor propertyDescriptorAt: propertyName.
+        self expect: $=.
+        propertyDescriptor isNil ifTrue:[ 
+            propertyValue := self parseValue.
+        ] ifFalse:[ 
+            propertyValue := propertyDescriptor parseUsingParser: self. 
+        ]. 
+        result propertyAt: propertyName put: propertyValue.
+     ].             
     self parseNl.
     ^ GDBCommandResultEvent new result: result.
 
     "Created: / 30-05-2014 / 09:52:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 02-06-2014 / 22:22:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 22:03:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 parseToken
@@ -312,26 +336,31 @@
     async-output → async-class ( ',' result )* nl
     "
 
-    | type eventClass data |
+    | type eventClass event propertyName propertyDescriptor descriptor propertyValue |
 
     type := self parseString.
     eventClass := eventClassBase eventClassForType: type.
-
-    data := Array streamContents:[ :s |
-        [ self peek == $, ] whileTrue:[
-            self next.
-            s nextPut: self parseResult.
-        ]
+    event := eventClass new.
+    event type: type.
+    descriptor := eventClass gdbValueDescriptor.
+    [ self peek == $, ] whileTrue:[
+        self next. "/ eat $,
+        propertyName := self parseVariable.
+        propertyDescriptor := descriptor propertyDescriptorAt: propertyName.
+        self expect: $=.
+        propertyDescriptor isNil ifTrue:[ 
+            propertyValue := self parseValue.
+        ] ifFalse:[ 
+            propertyValue := propertyDescriptor parseUsingParser: self. 
+        ]. 
+        event propertyAt: propertyName put: propertyValue.
     ].
     self parseNl.
 
-    ^ eventClass new
-        type: type;
-        data: data;
-        yourself
+    ^ event
 
     "Created: / 01-06-2014 / 23:43:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-06-2014 / 17:07:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 21:43:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBParser methodsFor:'parsing-misc'!
--- a/Make.proto	Thu Jun 19 10:10:52 2014 +0100
+++ b/Make.proto	Thu Jun 19 22:16:26 2014 +0100
@@ -123,7 +123,6 @@
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)GDBCommand.$(O) GDBCommand.$(H): GDBCommand.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandStatus.$(O) GDBCommandStatus.$(H): GDBCommandStatus.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugFlags.$(O) GDBDebugFlags.$(H): GDBDebugFlags.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBEvent.$(O) GDBEvent.$(H): GDBEvent.st $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -139,6 +138,7 @@
 $(OUTDIR)GDBAsyncEvent.$(O) GDBAsyncEvent.$(H): GDBAsyncEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCLICommand.$(O) GDBCLICommand.$(H): GDBCLICommand.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommand.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandEvent.$(O) GDBCommandEvent.$(H): GDBCommandEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResultEvent.$(O) GDBCommandResultEvent.$(H): GDBCommandResultEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCompoundValueDescriptor.$(O) GDBCompoundValueDescriptor.$(H): GDBCompoundValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDriver.$(O) GDBDriver.$(H): GDBDriver.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Thu Jun 19 10:10:52 2014 +0100
+++ b/Make.spec	Thu Jun 19 22:16:26 2014 +0100
@@ -51,7 +51,6 @@
 
 COMMON_CLASSES= \
 	GDBCommand \
-	GDBCommandResult \
 	GDBCommandStatus \
 	GDBDebugFlags \
 	GDBEvent \
@@ -67,6 +66,7 @@
 	GDBAsyncEvent \
 	GDBCLICommand \
 	GDBCommandEvent \
+	GDBCommandResult \
 	GDBCommandResultEvent \
 	GDBCompoundValueDescriptor \
 	GDBDriver \
@@ -216,7 +216,6 @@
 
 COMMON_OBJS= \
     $(OUTDIR_SLASH)GDBCommand.$(O) \
-    $(OUTDIR_SLASH)GDBCommandResult.$(O) \
     $(OUTDIR_SLASH)GDBCommandStatus.$(O) \
     $(OUTDIR_SLASH)GDBDebugFlags.$(O) \
     $(OUTDIR_SLASH)GDBEvent.$(O) \
@@ -232,6 +231,7 @@
     $(OUTDIR_SLASH)GDBAsyncEvent.$(O) \
     $(OUTDIR_SLASH)GDBCLICommand.$(O) \
     $(OUTDIR_SLASH)GDBCommandEvent.$(O) \
+    $(OUTDIR_SLASH)GDBCommandResult.$(O) \
     $(OUTDIR_SLASH)GDBCommandResultEvent.$(O) \
     $(OUTDIR_SLASH)GDBCompoundValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBDriver.$(O) \
--- a/abbrev.stc	Thu Jun 19 10:10:52 2014 +0100
+++ b/abbrev.stc	Thu Jun 19 22:16:26 2014 +0100
@@ -1,6 +1,7 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
+GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 GDBCommand GDBCommand jv:libgdbs 'GDB-Core-Commands' 0
 GDBCommandResult GDBCommandResult jv:libgdbs 'GDB-Core-Commands' 0
 GDBCommandStatus GDBCommandStatus jv:libgdbs 'GDB-Core-Commands' 0
@@ -9,7 +10,6 @@
 GDBEventSet GDBEventSet jv:libgdbs 'GDB-Core-Events' 0
 GDBInternalPipeStream GDBInternalPipeStream jv:libgdbs 'GDB-Support' 0
 GDBLauncher GDBLauncher jv:libgdbs 'GDB-Private' 0
-GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 GDBPTY GDBPTY jv:libgdbs 'GDB-Private' 0
 GDBValueDescriptor GDBValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBValueDescriptorError GDBValueDescriptorError jv:libgdbs 'GDB-Private-Descriptors' 1
--- a/bc.mak	Thu Jun 19 10:10:52 2014 +0100
+++ b/bc.mak	Thu Jun 19 22:16:26 2014 +0100
@@ -69,7 +69,6 @@
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)GDBCommand.$(O) GDBCommand.$(H): GDBCommand.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandStatus.$(O) GDBCommandStatus.$(H): GDBCommandStatus.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugFlags.$(O) GDBDebugFlags.$(H): GDBDebugFlags.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBEvent.$(O) GDBEvent.$(H): GDBEvent.st $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -85,6 +84,7 @@
 $(OUTDIR)GDBAsyncEvent.$(O) GDBAsyncEvent.$(H): GDBAsyncEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCLICommand.$(O) GDBCLICommand.$(H): GDBCLICommand.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommand.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandEvent.$(O) GDBCommandEvent.$(H): GDBCommandEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResultEvent.$(O) GDBCommandResultEvent.$(H): GDBCommandResultEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCompoundValueDescriptor.$(O) GDBCompoundValueDescriptor.$(H): GDBCompoundValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDriver.$(O) GDBDriver.$(H): GDBDriver.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/jv_libgdbs.st	Thu Jun 19 22:16:26 2014 +0100
@@ -64,6 +64,7 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
+        GDBObject       
         GDBCommand
         GDBCommandResult
         GDBCommandStatus
@@ -72,7 +73,6 @@
         GDBEventSet
         GDBInternalPipeStream
         GDBLauncher
-        GDBObject
         GDBPTY
         GDBValueDescriptor
         GDBValueDescriptorError
@@ -225,6 +225,8 @@
         GDBThreadGroupExitedEvent
         GDBThreadGroupStartedEvent
     )
+
+    "Modified: / 19-06-2014 / 22:13:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 extensionMethodNames
--- a/libInit.cc	Thu Jun 19 10:10:52 2014 +0100
+++ b/libInit.cc	Thu Jun 19 22:16:26 2014 +0100
@@ -28,7 +28,6 @@
 OBJ snd; struct __vmData__ *__pRT__; {
 __BEGIN_PACKAGE2__("libjv_libgdbs", _libjv_libgdbs_Init, "jv:libgdbs");
 _GDBCommand_Init(pass,__pRT__,snd);
-_GDBCommandResult_Init(pass,__pRT__,snd);
 _GDBCommandStatus_Init(pass,__pRT__,snd);
 _GDBDebugFlags_Init(pass,__pRT__,snd);
 _GDBEvent_Init(pass,__pRT__,snd);
@@ -44,6 +43,7 @@
 _GDBAsyncEvent_Init(pass,__pRT__,snd);
 _GDBCLICommand_Init(pass,__pRT__,snd);
 _GDBCommandEvent_Init(pass,__pRT__,snd);
+_GDBCommandResult_Init(pass,__pRT__,snd);
 _GDBCommandResultEvent_Init(pass,__pRT__,snd);
 _GDBCompoundValueDescriptor_Init(pass,__pRT__,snd);
 _GDBDriver_Init(pass,__pRT__,snd);
--- a/libgdbs.rc	Thu Jun 19 10:10:52 2014 +0100
+++ b/libgdbs.rc	Thu Jun 19 22:16:26 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", "Thu, 19 Jun 2014 09:09:40 GMT\0"
+      VALUE "ProductDate", "Thu, 19 Jun 2014 21:13:37 GMT\0"
     END
 
   END
--- a/tests/GDBParserTests.st	Thu Jun 19 10:10:52 2014 +0100
+++ b/tests/GDBParserTests.st	Thu Jun 19 22:16:26 2014 +0100
@@ -86,6 +86,20 @@
     "Modified: / 03-06-2014 / 00:23:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBParserTests methodsFor:'tests - commands'!
+
+test_command_stack_list_frames_01
+
+    | parser events |
+
+    parser := GDBParser on:'1^done,stack=[frame={level="0",addr="0x00010734",func="callee4",file="../../../devo/gdb/testsuite/gdb.mi/basics.c",fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"},frame={level="1",addr="0x0001076c",func="callee3",file="../../../devo/gdb/testsuite/gdb.mi/basics.c",fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"},frame={level="2",addr="0x0001078c",func="callee2",file="../../../devo/gdb/testsuite/gdb.mi/basics.c",fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="22"},frame={level="3",addr="0x000107b4",func="callee1",file="../../../devo/gdb/testsuite/gdb.mi/basics.c",fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="27"},frame={level="4",addr="0x000107e0",func="main",file="../../../devo/gdb/testsuite/gdb.mi/basics.c",fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="32"}]
+'.
+    parser token2CommandMappingBlock: [ :token | GDBMI_stack_list_frames new ].  
+    events := parser parseOutput.
+
+    "Created: / 19-06-2014 / 22:00:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBParserTests methodsFor:'tests - examples'!
 
 test_simple_example_01
@@ -101,11 +115,10 @@
     self assert: events size == 1.
     self assert: events first isCommandResultEvent.
     self assert: events first result status == CommandStatusDone.
-    self assert: events first result value key = 'bkpt'.
-    self assert: (events first result value value at: 'addr') = '0x08048564'
+    self assert: ((events first result propertyAt: 'bkpt') at: 'addr') = '0x08048564'
 
     "Created: / 30-05-2014 / 23:53:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 18-06-2014 / 07:02:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 21:55:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_simple_example_02
@@ -159,8 +172,7 @@
 
     self assert: events size == 1.
     self assert: events first result status == CommandStatusDone.
-    self assert: events first result value key = 'bkpt'.
-    self assert: (events first result value value at: 'addr') = '0x0000000000400556'.
+    self assert: ((events first result value propertyAt: 'bkpt') at: 'addr') = '0x0000000000400556'.
 
 
     parser := GDBParser on:'~"Breakpoint 2 at 0x400527: file factorial.c, line 4.\n"
@@ -234,7 +246,7 @@
     self assert: (events at:7) type = 'stopped'.
 
     "Created: / 01-06-2014 / 22:57:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 18-06-2014 / 07:02:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-06-2014 / 21:55:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBParserTests methodsFor:'tests - values'!
--- a/tests/tests.rc	Thu Jun 19 10:10:52 2014 +0100
+++ b/tests/tests.rc	Thu Jun 19 22:16:26 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", "Thu, 19 Jun 2014 09:09:42 GMT\0"
+      VALUE "ProductDate", "Thu, 19 Jun 2014 21:13:39 GMT\0"
     END
 
   END