MiniDebugger.st
author claus
Fri, 05 Aug 1994 02:59:40 +0200
changeset 93 e31220cb391f
parent 89 7be0b86ef80f
child 159 514c749165c3
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#MiniDebugger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'tracing stepping traceBlock'
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
    15
       classVariableNames:   'TheOneAndOnlyDebugger'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'System-Support'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
MiniDebugger comment:'
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    21
COPYRIGHT (c) 1988 by Claus Gittinger
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    22
              All Rights Reserved
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
    23
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
    24
$Header: /cvs/stx/stx/libbasic/MiniDebugger.st,v 1.8 1994-08-05 00:59:02 claus Exp $
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    25
'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    27
!MiniDebugger class methodsFor: 'documentation'!
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    28
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    29
copyright
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    30
"
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    31
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    34
 This software is furnished under a license and may be used
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    35
 only in accordance with the terms of that license and with the
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    37
 be provided or otherwise made available to, or used by, any
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    38
 other person.  No title to or ownership of the software is
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    39
 hereby transferred.
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    40
"
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    41
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    43
version
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    44
"
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
    45
$Header: /cvs/stx/stx/libbasic/MiniDebugger.st,v 1.8 1994-08-05 00:59:02 claus Exp $
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    46
"
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    47
!
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    48
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    49
documentation
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    50
"
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    51
    a primitive (non graphical) debugger for use on systems without
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    52
    graphics or when the real debugger dies (i.e. an error occurs in
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    53
    the graphical debugger).
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
    54
    Also, if an interrupt occurs within the debuger, this one is called
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
    55
    for.
89
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    56
"
7be0b86ef80f *** empty log message ***
claus
parents: 74
diff changeset
    57
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
!MiniDebugger class methodsFor: 'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
new
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
    62
    TheOneAndOnlyDebugger printNL.
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
    63
    TheOneAndOnlyDebugger isNil ifTrue:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
    64
        TheOneAndOnlyDebugger := self basicNew initialize
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
    ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
    66
    ^ TheOneAndOnlyDebugger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
singleStep:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    |aDebugger|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
    aDebugger := self new stepping.
2
claus
parents: 1
diff changeset
    73
    ObjectMemory flushInlineCaches.
claus
parents: 1
diff changeset
    74
    ObjectMemory stepInterruptHandler:aDebugger.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
    StepInterruptPending := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
    InterruptPending := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
    aBlock value.
2
claus
parents: 1
diff changeset
    78
    StepInterruptPending := nil.
claus
parents: 1
diff changeset
    79
    ObjectMemory stepInterruptHandler:nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
trace:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    self trace:aBlock with:[:where | where printNewline]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
trace:aBlock on:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
    self trace:aBlock with:[:where | where printString printOn:aStream.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
                                     aStream cr]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
trace:aBlock with:aTraceBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
    |aDebugger|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
    aDebugger := self new tracingWith:aTraceBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
    ObjectMemory flushInlineCaches.
2
claus
parents: 1
diff changeset
    96
    ObjectMemory stepInterruptHandler:aDebugger.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    StepInterruptPending := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
    InterruptPending := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
    aBlock value.
2
claus
parents: 1
diff changeset
   100
    ObjectMemory stepInterruptHandler:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
    StepInterruptPending := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
enterWithMessage:aString
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   106
    |active|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
    StepInterruptPending := nil.
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   109
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   110
    aString printNL.
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   111
    active := Processor activeProcess.
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   112
    'process: id=' print. active id print. ' name=' print. active name printNL.
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   113
    self new enter.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
!MiniDebugger methodsFor: 'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    traceBlock := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
    tracing := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
    stepping := false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
!MiniDebugger methodsFor: 'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
stepping
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    traceBlock := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
    tracing := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    stepping := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
tracingWith:aBlockOrNil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    traceBlock := aBlockOrNil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    stepping := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    tracing := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    |backtrace|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    backtrace := thisContext.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    (backtrace notNil) ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
        "remove Context getContext frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
        backtrace := backtrace sender.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
        "remove Debugger showContext frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
        backtrace := backtrace sender.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
        "remove Debugger commandLoop frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
        backtrace := backtrace sender.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
        "remove Debugger enter frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
        backtrace := backtrace sender
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    ^ backtrace
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   153
!
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   154
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   155
findContext:aSelector
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   156
    |con|
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   157
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   158
    con := thisContext sender.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   159
    [con notNil] whileTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   160
        (con isBlockContext not and:[con selector == aSelector]) ifTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   161
            "got it"
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   162
            ^ con
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   163
        ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   164
        con := con sender
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   165
    ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   166
    ^ nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
!MiniDebugger methodsFor: 'interrupt handling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
stepInterrupt
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    |where|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    where := thisContext.        "where is stepInterrupt context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    where notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
        where := where sender    "where is now interrupted methods context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    stepping ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
        where notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
            where fullPrint
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
        ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   182
            'stepInterrupt: no context' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
        self enter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
        where notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
            traceBlock notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
                traceBlock value:where
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
        ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   191
            'traceInterrupt: no context' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
        ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
   193
        ObjectMemory flushInlineCaches.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
        StepInterruptPending := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
        InterruptPending := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
enter
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   200
    |cmd stillHere|
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   201
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   202
    stillHere := true.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   203
    [stillHere] whileTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   204
        cmd := self commandLoop.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   206
        (cmd == $s) ifTrue: [
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   207
            self stepping.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   208
            ObjectMemory flushInlineCaches.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   209
            ObjectMemory stepInterruptHandler:self.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   210
            stillHere := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   211
            StepInterruptPending := true.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   212
            InterruptPending := true
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   213
        ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   214
        (cmd == $t) ifTrue: [
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   215
            traceBlock := [:where | where fullPrint].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   216
            ObjectMemory flushInlineCaches.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   217
            ObjectMemory stepInterruptHandler:self.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   218
            stillHere := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   219
            StepInterruptPending := true.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   220
            InterruptPending := true
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   221
        ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   222
        (cmd == $c) ifTrue: [
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   223
            stillHere := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   224
            stepping := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   225
            tracing := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   226
            StepInterruptPending := nil.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   227
            InterruptPending := nil
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   228
        ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   229
        (cmd == $a) ifTrue: [
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   230
            "abort"
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   231
            stepping := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   232
            tracing := false.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   233
            StepInterruptPending := nil.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   234
            InterruptPending := nil.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   235
            self doAbort.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   236
            stillHere := true.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   237
            "failed abort"
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   238
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
!MiniDebugger methodsFor: 'user commands'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   245
doAbort
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   246
    |con sig|
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   247
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   248
    (sig := Object abortSignal) isHandled ifTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   249
        sig raise.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   250
        'abort raise failed' errorPrintNewline.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   251
    ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   252
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   253
    "TEMPORARY kludge - find event handler context
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   254
     this will be removed, once real debugging is possible
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   255
    "
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   256
    con := self findContext:#processEvent.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   257
    con isNil ifTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   258
        con := self findContext:#dispatch.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   259
    ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   260
    con notNil ifTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   261
        "got it"
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   262
        con return.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   263
        'return failed' errorPrintNewline.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   264
    ].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   265
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   266
    'found no context to resume' errorPrintNewline.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   267
!
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   268
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   269
showProcesses
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   270
    |active|
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   271
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   272
    active := Processor activeProcess.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   273
    'current id=' print. active id print. ' name=' print. active name printNewline.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   274
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   275
    Process allInstancesDo:[:p |
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   276
        'proc id=' print. p id print. ' name=' print. p name print. ' state=' print.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   277
                          p state printNewline.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   278
    ]
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   279
!
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   280
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
commandLoop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
    |cmd done valid context|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    done := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    [done] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
        valid := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
        cmd := self getCommand.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
        (cmd == $p) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
            valid := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
            context isNil ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
                context := self getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
            context notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
                context fullPrintAll
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
            ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   296
                'no context' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
        ].
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   299
        (cmd == $P) ifTrue:[
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   300
            valid := true.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   301
            self showProcesses.
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   302
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
        (cmd == $r) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
            valid := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
            context isNil ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
                context := self getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
            context notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
                "remove Debugger stepinterrupt/halt frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
                context sender receiver printNewline
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
            ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   312
                'no context - dont know receiver' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
        (cmd == $R) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
            valid := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
            context isNil ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
                context := self getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
            context notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
                "remove Debugger stepinterrupt/halt frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
                context sender receiver storeOn:Stdout
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
            ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   324
                'no context - dont know receiver' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
        (cmd == $i) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
            valid := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
            context isNil ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
                context := self getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
            context notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
                "remove Debugger stepinterrupt/halt frame"
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   334
                MiniInspector openOn:(context sender receiver)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
            ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   336
                'no context - dont know receiver' errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
        (cmd == $I) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
            valid := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
            context isNil ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
                context := self getContext
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
            context notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
                "remove Debugger stepinterrupt/halt frame"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
                self interpreterLoopWith:(context sender receiver)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
            ] ifFalse:[
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   348
                'no context - dont know receiver' errorPrintNewline.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
                self interpreterLoopWith:nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
        ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 5
diff changeset
   352
        context := nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
        (cmd == $c) ifTrue:[valid := true. done := true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
        (cmd == $s) ifTrue:[valid := true. done := true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
        (cmd == $t) ifTrue:[valid := true. done := true].
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   356
        (cmd == $a) ifTrue:[valid := true. done := true].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   357
        (cmd == $T) ifTrue:[valid := true. Processor activeProcess terminate].
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   358
        (cmd == $X) ifTrue:[Smalltalk fatalAbort].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
        (cmd == $x) ifTrue:[Smalltalk exit].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
        valid ifFalse: [
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   361
            'valid commands:
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   362
   (c)ontinue
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   363
   (s)tep
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   364
   (t)race
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   365
   (p)rintContext
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   366
   (r)eceiver printString
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   367
   (R)eceiver storeString
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   368
   (i)nspect
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   369
   (I)nterpreter
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   370
   (a)bort
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   371
   (P)rocesses
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   372
   (T)terminate current process
74
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   373
   (X)exit (+core)
5fb970c7cb96 *** empty log message ***
claus
parents: 33
diff changeset
   374
   (x)exit Smalltalk'  errorPrintNewline
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
    ^ cmd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
getCommand
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
    |cmd c|
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   382
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
    'MiniDebugger> ' print.
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   384
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
    cmd := Character fromUser.
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   386
    cmd isNil ifTrue:[
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   387
        "
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   388
         mhmh end-of-file;
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   389
         return a 'c' (for continue); hope thats ok.
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   390
        "
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   391
        cmd := $c
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   392
    ].
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   393
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   394
    "
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   395
     ignore to end-of-line
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   396
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    c := cmd.
93
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   398
    [c isNil or:[c isEndOfLineCharacter]] whileFalse: [
e31220cb391f *** empty log message ***
claus
parents: 89
diff changeset
   399
        c := Character fromUser.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
    ^ cmd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
interpreterLoopWith:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
    |line done|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
    'read-eval-print loop; exit with empty line' printNewline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
    done := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    [done] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
        line := Stdin nextLine.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
        (line size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
            done := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
            (Compiler evaluate:line 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
                      receiver:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
                     notifying:nil) printNewline
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
! !