More work on GDB session recorder.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 24 Jun 2014 00:55:57 +0100
changeset 25 58e042a191a9
parent 24 98ff50f8a25d
child 26 dbcc28b503c0
More work on GDB session recorder.
GDBConnection.st
GDBDebugger.st
GDBMI_target_attach.st
GDBParser.st
GDBSessionRecord.st
GDBSessionRecorder.st
GDBSimulatorResource.st
GDBUnixProcess.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/Make.proto
tests/bc.mak
tests/tests.rc
--- a/GDBConnection.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBConnection.st	Tue Jun 24 00:55:57 2014 +0100
@@ -45,18 +45,18 @@
 send: command
     | commandString |
 
-    command token notNil ifTrue:[ 
-        process debuggerInput nextPutAll: command token printString.
-    ].
+    commandString := command token notNil 
+                        ifTrue:[ command token printString , command asString ]
+                        ifFalse:[ commandString := command asString ].
+
     outstandingCommands add: command.
-    commandString := command asString.
     recorder notNil ifTrue:[ 
-            recorder recordCommand: commandString
+        recorder recordCommand: commandString
     ].  
     process debuggerInput nextPutLine: commandString.
 
     "Created: / 20-06-2014 / 22:09:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 23-06-2014 / 09:36:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-06-2014 / 23:31:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection methodsFor:'event dispatching'!
--- a/GDBDebugger.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBDebugger.st	Tue Jun 24 00:55:57 2014 +0100
@@ -165,11 +165,13 @@
 
     connection eventPumpStart.
     connection eventDispatchStart.
+    Delay waitForMilliseconds:100.  
 
 "/    self send: (GDBMICommand inferiorTtySet: driver inferiorPTY name).
     self send: (GDBMI_inferior_tty_set arguments: { connection inferiorPTY name })
 
     "Created: / 20-06-2014 / 21:45:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-06-2014 / 23:44:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 release
--- a/GDBMI_target_attach.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBMI_target_attach.st	Tue Jun 24 00:55:57 2014 +0100
@@ -48,3 +48,10 @@
 	^ 'target-attach'
 ! !
 
+!GDBMI_target_attach class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/GDBParser.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBParser.st	Tue Jun 24 00:55:57 2014 +0100
@@ -223,6 +223,7 @@
         events last token: token.
     ].
     self expect: '(gdb)'.
+    [ self peek == Character space ] whileTrue:[ self next ].
     self parseNl.
     recorder notNil ifTrue:[ 
         recorder recordResponseEnd.
@@ -230,7 +231,7 @@
     ^ events
 
     "Created: / 30-05-2014 / 09:52:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 23-06-2014 / 09:20:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:25:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 parseResultClass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBSessionRecord.st	Tue Jun 24 00:55:57 2014 +0100
@@ -0,0 +1,242 @@
+"{ Package: 'jv:libgdbs' }"
+
+OrderedCollection subclass:#GDBSessionRecord
+	instanceVariableNames:'lock'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Private-Simulator'
+!
+
+Object subclass:#Command
+	instanceVariableNames:'string'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:GDBSessionRecord
+!
+
+Object subclass:#Response
+	instanceVariableNames:'string'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:GDBSessionRecord
+!
+
+!GDBSessionRecord class methodsFor:'instance creation'!
+
+new
+    ^ super new initialize.
+
+    "Created: / 24-06-2014 / 00:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+new: size
+    "return an initialized instance"
+
+    ^ (super new: size) initialize.
+
+    "Created: / 24-06-2014 / 00:06:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord methodsFor:'adding & removing'!
+
+add:anObject
+    "add the argument, anObject to the end of the collection
+     Return the argument, anObject."
+
+    ^ lock critical:[ 
+        super add:anObject
+    ].
+
+    "Modified: / 29-01-1998 / 10:52:32 / cg"
+    "Modified: / 23-06-2014 / 23:55:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+add:anObject beforeIndex:index
+    "add the argument, anObject to the end of the collection.
+     Return the receiver (sigh - ST-80 compatibility)."
+
+    ^ lock critical:[ 
+        super add:anObject beforeIndex:index
+    ].
+
+    "Modified: / 23-06-2014 / 23:55:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addAll:aCollection beforeIndex:index
+    "insert all elements of the argument
+     Return the receiver."
+
+    ^ lock critical:[ 
+        super addAll:aCollection beforeIndex:index      
+    ].
+
+    "Modified: / 23-06-2014 / 23:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addAllLast:aCollection
+    "add all elements of the argument, aCollection to the end of the collection.
+     Return the argument, aCollection."
+
+    ^ lock critical:[ 
+        super addAllLast:aCollection       
+    ].
+
+    "Modified: / 23-06-2014 / 23:56:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addFirst:anObject
+    "add the argument, anObject to the beginning of the collection.
+     Return the argument, anObject."
+
+     ^ lock critical:[ 
+        super addFirst:anObject
+    ].
+
+    "Modified: / 29-01-1998 / 10:53:09 / cg"
+    "Modified: / 23-06-2014 / 23:56:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    "/ please change as required (and remove this comment)
+    super initialize.
+    lock := RecursionLock new.
+
+    "/ super initialize.   -- commented since inherited method does nothing
+
+    "Modified: / 24-06-2014 / 00:05:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord methodsFor:'printing & storing'!
+
+printOn:aStream
+    self do:[:each | each printOn: aStream ]
+
+    "Modified: / 23-06-2014 / 23:51:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord methodsFor:'recording'!
+
+<<< aString
+    self add: (Response new string: aString)
+
+    "Created: / 24-06-2014 / 00:35:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+>>> aString
+    self add: (Command new string: aString)
+
+    "Created: / 24-06-2014 / 00:35:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord methodsFor:'saving & restoring'!
+
+saveInClass: class selector: selector
+    "Save recorded session in given class under given selector"
+
+    | source |
+
+    source := String new writeStream.
+    source nextPutAll: selector; cr; cr.
+    source nextPutAll:' ^ (GDBSessionRecord new: '.
+    self size printOn: source.
+    source nextPutAll: ')'; cr; cr.
+
+    self do:[:each | 
+        each isCommand ifTrue:[ 
+            source nextPutLine: '>>>'.
+        ] ifFalse:[
+            source nextPutLine: '<<<'.
+        ].
+        each string storeOn: source.
+        source nextPut: $;; cr; cr.  
+    ].
+    source nextPutAll: 'yourself'.
+
+    class compile: source contents classified: 'recorded sessions'
+
+    "Created: / 23-06-2014 / 23:14:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:44:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+saveInSimulatorResourceAs: selector
+    ^ self saveInClass: GDBSimulatorResource selector: selector
+
+    "Created: / 23-06-2014 / 23:17:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord::Command methodsFor:'accessing'!
+
+string
+    ^ string
+!
+
+string:something
+    string := something.
+! !
+
+!GDBSessionRecord::Command methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation if the receiver to the argument, aStream"
+
+    aStream nextPutLine: '>>>'.
+    string printOn: aStream.
+    aStream cr.
+
+    "Modified: / 24-06-2014 / 00:09:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord::Command methodsFor:'testing'!
+
+isCommand
+    ^ true
+
+    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isResponse
+    ^ false
+
+    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord::Response methodsFor:'accessing'!
+
+string
+    ^ string
+!
+
+string:something
+    string := something.
+! !
+
+!GDBSessionRecord::Response methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation if the receiver to the argument, aStream"
+
+    aStream nextPutLine: '<<<'.
+    string printOn: aStream.
+    aStream cr.
+
+    "Modified: / 24-06-2014 / 00:08:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBSessionRecord::Response methodsFor:'testing'!
+
+isCommand
+    ^ false
+
+    "Created: / 24-06-2014 / 00:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isResponse
+    ^ true
+
+    "Created: / 24-06-2014 / 00:41:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBSessionRecorder.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBSessionRecorder.st	Tue Jun 24 00:55:57 2014 +0100
@@ -1,56 +1,63 @@
 "{ Package: 'jv:libgdbs' }"
 
 Object subclass:#GDBSessionRecorder
-	instanceVariableNames:'record commandBuffer responseBuffer'
+	instanceVariableNames:'record buffer'
 	classVariableNames:''
 	poolDictionaries:'GDBDebugFlags'
 	category:'GDB-Private-Simulator'
 !
 
+!GDBSessionRecorder class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
+!GDBSessionRecorder methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    "/ please change as required (and remove this comment)
+    record := GDBSessionRecord new.
+    buffer := (String new: 100) writeStream.
+    "/ responseBuffer := nil.
+
+    "/ super initialize.   -- commented since inherited method does nothing
+
+    "Modified: / 24-06-2014 / 00:10:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBSessionRecorder methodsFor:'recording'!
 
 recordCommand: command
-    commandBuffer := WriteStream new.
-    commandBuffer nextPutAll: command.
+    record >>> command
 
     "Created: / 22-06-2014 / 21:39:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:36:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 recordResponse: aString
-    responseBuffer isNil ifTrue:[ 
-        responseBuffer := CharacterWriteStream new.
-    ].
-    responseBuffer nextPutAll: aString
+    buffer nextPutAll: aString
 
     "Created: / 22-06-2014 / 21:56:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:10:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 recordResponseChar: aCharacter
-    responseBuffer isNil ifTrue:[ 
-        responseBuffer := String new writeStream.
-    ].
-    responseBuffer nextPut: aCharacter
+    buffer nextPut: aCharacter
 
     "Created: / 22-06-2014 / 21:42:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 23-06-2014 / 09:23:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:10:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 recordResponseEnd
-    | cmd resp |    
-
-    record isNil ifTrue:[ 
-        record := OrderedCollection new writeStream.
-    ].
-
-    commandBuffer notNil ifTrue:[
-        cmd := commandBuffer contents.
-        commandBuffer := nil.
-    ].
-    resp := responseBuffer contents.
-    responseBuffer := nil.
-    record nextPut: cmd -> resp.
+    record <<< buffer contents.
+    buffer reset.
 
     "Created: / 22-06-2014 / 21:54:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 23-06-2014 / 09:24:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-06-2014 / 00:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBSimulatorResource.st	Tue Jun 24 00:55:57 2014 +0100
@@ -0,0 +1,103 @@
+"{ Package: 'jv:libgdbs' }"
+
+TestCase subclass:#GDBSimulatorResource
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Resources'
+!
+
+!GDBSimulatorResource methodsFor:'recorded sessions'!
+
+session_factorial_01
+
+ ^ (GDBSessionRecord new: 15)
+
+<<<
+'=thread-group-added,id="i1"
+(gdb) 
+';
+
+>>>
+'1-inferior-tty-set /dev/pts/11';
+
+<<<
+'1^done
+(gdb) 
+';
+
+>>>
+'2-file-exec-and-symbols /home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial';
+
+<<<
+'2^done
+(gdb) 
+';
+
+>>>
+'3b factorial';
+
+<<<
+'&"b factorial\n"
+~"Breakpoint 1 at 0x400527: file factorial.c, line 4.\n"
+=breakpoint-created,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000000000400527",func="factorial",file="factorial.c",fullname="/home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial.c",line="4",times="0",original-location="factorial"}
+3^done
+(gdb) 
+';
+
+>>>
+'4r';
+
+<<<
+'&"r\n"
+~"Starting program: /home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial \n"
+=thread-group-started,id="i1",pid="7719"
+=thread-created,id="1",group-id="i1"
+4^running
+*running,thread-id="all"
+(gdb) 
+';
+
+<<<
+'=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
+=library-loaded,id="/lib/x86_64-linux-gnu/libc.so.6",target-name="/lib/x86_64-linux-gnu/libc.so.6",host-name="/lib/x86_64-linux-gnu/libc.so.6",symbols-loaded="0",thread-group="i1"
+=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000000000400527",func="factorial",file="factorial.c",fullname="/home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial.c",line="4",times="1",original-location="factorial"}
+~"\nBreakpoint "
+~"1, factorial (i=5) at factorial.c:4\n"
+~"4\t\tif (i == 1) {\n"
+*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x0000000000400527",func="factorial",args=[{name="i",value="5"}],file="factorial.c",fullname="/home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial.c",line="4"},thread-id="1",stopped-threads="all",core="0"
+(gdb) 
+';
+
+>>>
+'5del 1';
+
+<<<
+'&"del 1\n"
+=breakpoint-deleted,id="1"
+5^done
+(gdb) 
+';
+
+>>>
+'6c';
+
+<<<
+'&"c\n"
+~"Continuing.\n"
+6^running
+*running,thread-id="all"
+(gdb) 
+';
+
+<<<
+'~"[Inferior 1 (process 7719) exited with code 023]\n"
+=thread-exited,id="1",group-id="i1"
+=thread-group-exited,id="i1",exit-code="023"
+*stopped
+(gdb) 
+';
+
+yourself
+! !
+
--- a/GDBUnixProcess.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/GDBUnixProcess.st	Tue Jun 24 00:55:57 2014 +0100
@@ -16,7 +16,7 @@
     input := inputPipe second.
     outputPipe := NonPositionableExternalStream makePipe.
     output := outputPipe first.
-    args := #( '/usr/bin/gdb' '--interpreter' 'mi2' ).
+    args := #( '/usr/bin/gdb' '-q' '-nx' '--interpreter' 'mi2' ).
     Processor 
         monitor:[
             pid := OperatingSystem 
@@ -44,6 +44,6 @@
         self error:'Failed to launch gdb'.
     ].
 
-    "Modified: / 20-06-2014 / 21:35:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-06-2014 / 23:37:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- a/Make.proto	Mon Jun 23 09:45:16 2014 +0100
+++ b/Make.proto	Tue Jun 24 00:55:57 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/announcements -I$(INCLUDE_TOP)/stx/libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/announcements -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic
 
 
 # if you need any additional defines for embedded C code,
@@ -103,6 +103,10 @@
 prereq:
 	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 
 
 
@@ -131,6 +135,7 @@
 $(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(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)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)
 $(OUTDIR)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
--- a/Make.spec	Mon Jun 23 09:45:16 2014 +0100
+++ b/Make.spec	Tue Jun 24 00:55:57 2014 +0100
@@ -59,6 +59,7 @@
 	GDBObject \
 	GDBPTY \
 	GDBProcess \
+	GDBSessionRecord \
 	GDBValueDescriptor \
 	GDBValueDescriptorError \
 	jv_libgdbs \
@@ -227,6 +228,7 @@
     $(OUTDIR_SLASH)GDBObject.$(O) \
     $(OUTDIR_SLASH)GDBPTY.$(O) \
     $(OUTDIR_SLASH)GDBProcess.$(O) \
+    $(OUTDIR_SLASH)GDBSessionRecord.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBValueDescriptorError.$(O) \
     $(OUTDIR_SLASH)jv_libgdbs.$(O) \
--- a/abbrev.stc	Mon Jun 23 09:45:16 2014 +0100
+++ b/abbrev.stc	Tue Jun 24 00:55:57 2014 +0100
@@ -10,6 +10,8 @@
 GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 GDBPTY GDBPTY jv:libgdbs 'GDB-Private' 0
 GDBProcess GDBProcess jv:libgdbs 'GDB-Private' 0
+GDBSessionRecord GDBSessionRecord jv:libgdbs 'GDB-Private-Simulator' 0
+GDBSimulatorResource GDBSimulatorResource jv:libgdbs 'GDB-Resources' 1
 GDBValueDescriptor GDBValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBValueDescriptorError GDBValueDescriptorError jv:libgdbs 'GDB-Private-Descriptors' 1
 jv_libgdbs jv_libgdbs jv:libgdbs '* Projects & Packages *' 3
--- a/bc.mak	Mon Jun 23 09:45:16 2014 +0100
+++ b/bc.mak	Tue Jun 24 00:55:57 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\announcements -I$(INCLUDE_TOP)\stx\libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\announcements -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -52,6 +52,10 @@
 prereq:
 	pushd ..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
@@ -77,6 +81,7 @@
 $(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(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)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)
 $(OUTDIR)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Mon Jun 23 09:45:16 2014 +0100
+++ b/jv_libgdbs.st	Tue Jun 24 00:55:57 2014 +0100
@@ -29,6 +29,7 @@
 
     ^ #(
         #'stx:goodies/announcements'    "Announcement - superclass of GDBAsyncEvent "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of GDBSimulatorResource "
         #'stx:libbasic'    "ArithmeticValue - extended "
     )
 !
@@ -73,6 +74,8 @@
         GDBObject
         GDBPTY
         GDBProcess
+        GDBSessionRecord
+        (GDBSimulatorResource autoload)
         GDBValueDescriptor
         GDBValueDescriptorError
         #'jv_libgdbs'
--- a/libInit.cc	Mon Jun 23 09:45:16 2014 +0100
+++ b/libInit.cc	Tue Jun 24 00:55:57 2014 +0100
@@ -36,6 +36,7 @@
 _GDBObject_Init(pass,__pRT__,snd);
 _GDBPTY_Init(pass,__pRT__,snd);
 _GDBProcess_Init(pass,__pRT__,snd);
+_GDBSessionRecord_Init(pass,__pRT__,snd);
 _GDBValueDescriptor_Init(pass,__pRT__,snd);
 _GDBValueDescriptorError_Init(pass,__pRT__,snd);
 _jv_137libgdbs_Init(pass,__pRT__,snd);
--- a/libgdbs.rc	Mon Jun 23 09:45:16 2014 +0100
+++ b/libgdbs.rc	Tue Jun 24 00:55:57 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", "Mon, 23 Jun 2014 08:39:53 GMT\0"
+      VALUE "ProductDate", "Mon, 23 Jun 2014 23:52:53 GMT\0"
     END
 
   END
--- a/tests/Make.proto	Mon Jun 23 09:45:16 2014 +0100
+++ b/tests/Make.proto	Tue Jun 24 00:55:57 2014 +0100
@@ -105,9 +105,9 @@
 	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
-	cd ../ && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../ && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 
 
 
--- a/tests/bc.mak	Mon Jun 23 09:45:16 2014 +0100
+++ b/tests/bc.mak	Tue Jun 24 00:55:57 2014 +0100
@@ -54,9 +54,9 @@
 	pushd ..\..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
-	pushd .. & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd .. & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
--- a/tests/tests.rc	Mon Jun 23 09:45:16 2014 +0100
+++ b/tests/tests.rc	Tue Jun 24 00:55:57 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", "Mon, 23 Jun 2014 08:39:56 GMT\0"
+      VALUE "ProductDate", "Mon, 23 Jun 2014 23:52:55 GMT\0"
     END
 
   END