Variable objects: added support for composite types
...such as arrays, structs and unions. Implemented `#hasChildren`
and `#choldren` to determine whether variable object value is a
composite types and to access its members.
"
jv:libgdbs - GNU Debugger Interface Library
Copyright (C) 2015-now Jan Vrany
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"
"{ Package: 'jv:libgdbs' }"
"{ NameSpace: Smalltalk }"
GDBDebuggerObject subclass:#GDBVariableObject
instanceVariableNames:'parent name exp thread_id value type numchild has_more children'
classVariableNames:''
poolDictionaries:''
category:'GDB-Private-Model'
!
!GDBVariableObject class methodsFor:'documentation'!
copyright
"
jv:libgdbs - GNU Debugger Interface Library
Copyright (C) 2015-now Jan Vrany
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"
! !
!GDBVariableObject class 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>"
! !
!GDBVariableObject methodsFor:'accessing'!
children
children isNil ifTrue:[
self hasChildren ifTrue:[
| result |
result := debugger send: (GDBMI_var_list_children arguments: (Array with: '--all-values' with: name)).
children := result propertyAt: #children.
children do:[:each | each setDebugger: debugger; setParent: self ].
] ifFalse:[
children := #().
].
].
^ children
"Created: / 27-01-2018 / 22:53:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 28-01-2018 / 21:53:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
expression
"Return the expression in target language to access the value (asDtring)
The expression is relative to it's direct parent (if any),"
^ exp
"Created: / 28-01-2018 / 21:36:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
id
"Returns the GDB ID (name) of the variable object. This is
used in commands to identify a variable object instance."
^ name
"Created: / 28-01-2018 / 21:35:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
type
^ type
!
value
^ value
! !
!GDBVariableObject methodsFor:'displaying'!
displayOn: aStream
self displayOn: aStream indent: 0
"Created: / 28-01-2018 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
displayOn: aStream indent: anInteger
aStream next: anInteger * 4 put: Character space.
aStream nextPutAll: exp; space; nextPut: $=; space.
self hasChildren ifTrue:[
aStream nextPut:${; cr.
self children do:[:each |
each displayOn: aStream indent: anInteger + 1.
aStream cr.
].
aStream next: anInteger * 4 put: Character space; nextPut:$}.
] ifFalse: [
aStream nextPutAll: value
].
"Created: / 28-01-2018 / 21:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GDBVariableObject methodsFor:'initialization'!
setExpression: aString
exp := aString
"Created: / 28-01-2018 / 21:39:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
setParent: variableObjectOrNil
self assert: (variableObjectOrNil isNil or:[ variableObjectOrNil isKindOf: self class ]).
parent := variableObjectOrNil
"Created: / 27-01-2018 / 22:54:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GDBVariableObject methodsFor:'printing & storing'!
printOn:aStream
"append a printed representation if the receiver to the argument, aStream"
super printOn:aStream.
aStream nextPutAll:'('.
value printOn: aStream.
aStream nextPutAll:')'.
"Created: / 13-06-2017 / 17:03:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GDBVariableObject methodsFor:'queries'!
hasChildren
^ numchild > 0
"Created: / 27-01-2018 / 22:47:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GDBVariableObject class methodsFor:'documentation'!
version_HG
^ '$Changeset: <not expanded> $'
! !