MessageTracer.st
author claus
Thu, 02 Jun 1994 19:20:20 +0200
changeset 9 f5b6ab00bdf6
parent 8 3fba2acf0eeb
child 10 676ce0471de4
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     1
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1994 by Claus Gittinger
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     4
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    11
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    12
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    13
Object subclass:#MessageTracer
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    17
       category:'System-Support'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    18
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    19
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    20
MessageTracer comment:'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    21
COPYRIGHT (c) 1994 by Claus Gittinger
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    22
              All Rights Reserved
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    23
'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    24
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    25
!MessageTracer class methodsFor:'documentation'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    26
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    27
copyright
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    28
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    29
 COPYRIGHT (c) 1994 by Claus Gittinger
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    30
              All Rights Reserved
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    31
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    32
 This software is furnished under a license and may be used
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    33
 only in accordance with the terms of that license and with the
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    35
 be provided or otherwise made available to, or used by, any
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    36
 other person.  No title to or ownership of the software is
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    37
 hereby transferred.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    38
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    39
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    40
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    41
version
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    42
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    43
$Header: /cvs/stx/stx/libbasic3/MessageTracer.st,v 1.2 1994-06-02 17:19:55 claus Exp $
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    44
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    45
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    46
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    47
documentation
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    48
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    49
    This is not a real class, in that there are no instances of
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    50
    MessageTracer.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    51
    It has been created, to provide a common home for the tracing
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    52
    facilities (originally, they where in Object, but have moved to
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    53
    allow easier separation of development vs. runtime configurations.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    54
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    55
    trapping sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    56
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    57
        MessageTracer trap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    58
        ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    59
        MessageTracer untrap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    60
        or:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    61
        MessageTracer untrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    62
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    63
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    64
    trapping evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    65
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    66
        MessageTracer trapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    67
        ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    68
        MessageTracer unwrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    69
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    70
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    71
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    72
    tracing sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    73
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    74
        MessageTracer trace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    75
        ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    76
        MessageTracer untrace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    77
        or:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    78
        MessageTracer untrace:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    79
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    80
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    81
    tracing sender only:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    82
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    83
        MessageTracer traceSender:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    84
        ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    85
        MessageTracer untrace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    86
        or:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    87
        MessageTracer untrace:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    88
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    89
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    90
    tracing evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    91
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    92
        MessageTracer traceMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    93
        ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    94
        MessageTracer unwrapmethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    95
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    96
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    97
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    98
!MessageTracer class methodsFor:'object wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    99
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   100
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   101
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   102
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   103
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   104
     when the method is left, and get the context and the methods return value as arguments.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   105
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   106
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   107
    "I have not yet enough experience, if the wrapped original method should
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   108
     run as an instance of the original, or of the catching class; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   109
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   110
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   111
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   112
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   113
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   114
    ^ self wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock withOriginalClass:true
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   115
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   116
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   117
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock withOriginalClass:withOriginalClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   118
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   119
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   120
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   121
     when the method is left, and get the methods return value as argument.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   122
     The argument withOriginalClass controls if the original method should be called for with
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   123
     the receiver being trapped upon or not.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   124
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   125
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   126
    |newClass orgClass myMetaclass trapMethod s spec lits|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   127
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   128
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   129
     create a new (anonymous) subclass of the receivers class
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   130
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   131
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   132
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   133
    orgClass category == #trapping ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   134
        newClass := orgClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   135
    ] ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   136
        myMetaclass := orgClass class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   137
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   138
        newClass := myMetaclass new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   139
        newClass setSuperclass:orgClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   140
        newClass instSize:orgClass instSize.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   141
        newClass flags:orgClass flags.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   142
        newClass setClassVariableString:''.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   143
        newClass setInstanceVariableString:''.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   144
        newClass setName:orgClass name.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   145
        newClass category:#trapping.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   146
        newClass setSelectorArray:(Array new).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   147
        newClass setMethodArray:(Array new).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   148
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   149
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   150
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   151
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   152
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   153
    spec := Parser methodSpecificationForSelector:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   154
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   155
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   156
    s cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   157
    s nextPutAll:'|retVal stubClass|'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   158
    withOriginalClass ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   159
        s nextPutAll:'stubClass := self class.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   160
        s nextPutAll:'self changeClassTo:(stubClass superclass).'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   161
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   162
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   163
        s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   164
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   165
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   166
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   167
        s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   168
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   169
    withOriginalClass ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   170
        s nextPutAll:'self changeClassTo:stubClass.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   171
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   172
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   173
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   174
    trapMethod := Compiler compile:s contents 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   175
                          forClass:newClass 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   176
                        inCategory:'breakpointed'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   177
                         notifying:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   178
                           install:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   179
                        skipIfSame:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   180
                            silent:true.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   181
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   182
    lits := trapMethod literals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   183
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   184
        lits at:(lits indexOf:#literal1) put:entryBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   185
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   186
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   187
        lits at:(lits indexOf:#literal2) put:exitBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   188
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   189
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   190
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   191
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   192
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   193
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   194
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   195
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   196
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   197
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   198
    newClass setSelectorArray:(newClass selectorArray copyWith:aSelector).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   199
    newClass setMethodArray:(newClass methodArray copyWith:trapMethod).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   200
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   201
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   202
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   203
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   204
    anObject changeClassTo:newClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   205
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   206
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   207
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   208
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   209
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   210
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   211
                wrap:p
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   212
            Selector:#y: 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   213
             onEntry:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   214
              onExit:[:retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   215
                         Transcript show:'leave Point>>x:, returning:'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   216
                         Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   217
                         Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   218
                     ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   219
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   220
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   221
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   222
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   223
     p untrap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   224
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   225
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   226
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   227
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   228
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   229
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   230
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   231
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   232
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   233
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   234
     MessageTracer wrap:p
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   235
               Selector:#y: 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   236
                onEntry:[:context | self halt:'you are trapped']
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   237
                 onExit:nil.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   238
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   239
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   240
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   241
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   242
     p untrap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   243
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   244
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   245
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   246
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   247
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   248
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   249
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   250
!MessageTracer class methodsFor:'method wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   251
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   252
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   253
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   254
     aMethod is evaluated. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   255
     EntryBlock will be called on entry, and get the current context passed as argument. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   256
     ExitBlock will be called, when the method is left, and get context and 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   257
     the methods return value as arguments."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   258
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   259
    |parser selector args nArgs class trapMethod s spec lits src idx|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   260
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   261
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   262
     create a new method, which calls the original one,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   263
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   264
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   265
    aMethod isWrapped ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   266
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   267
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   268
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   269
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   270
     get class/selector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   271
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   272
    class := aMethod containingClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   273
    class isNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   274
        self error:'cannot place trap (no containing class found)'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   275
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   276
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   277
    selector := class selectorForMethod:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   278
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   279
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   280
     get a new method-spec
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   281
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   282
    spec := Parser methodSpecificationForSelector:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   283
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   284
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   285
     create a method, executing the trap-blocks and the original method via a direct call
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   286
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   287
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   288
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   289
    s nextPutAll:' |retVal| '.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   290
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   291
        s nextPutAll:'#entryBlock yourself value:thisContext. '.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   292
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   293
    s nextPutAll:'retVal := #originalMethod yourself';
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   294
      nextPutAll:             ' valueWithReceiver:(thisContext receiver)'; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   295
      nextPutAll:             ' arguments:(thisContext args)';
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   296
      nextPutAll:             ' selector:(thisContext selector)'; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   297
      nextPutAll:             ' search:(thisContext searchClass) yourself. '.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   298
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   299
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   300
        s nextPutAll:'#exitBlock yourself value:thisContext value:retVal.'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   301
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   302
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   303
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   304
    src := s contents.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   305
    trapMethod := Compiler compile:src 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   306
                          forClass:UndefinedObject 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   307
                        inCategory:aMethod category
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   308
                         notifying:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   309
                           install:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   310
                        skipIfSame:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   311
                            silent:true.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   312
    trapMethod changeClassTo:WrappedMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   313
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   314
    lits := trapMethod basicLiterals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   315
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   316
        lits at:(lits indexOf:#entryBlock) put:entryBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   317
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   318
    lits at:(lits indexOf:#originalMethod) put:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   319
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   320
        lits at:(lits indexOf:#exitBlock) put:exitBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   321
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   322
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   323
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   324
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   325
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   326
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   327
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   328
    idx := class selectorArray indexOf:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   329
    idx ~~ 0 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   330
        class methodArray at:idx put:trapMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   331
    ] ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   332
        self halt:'oops, unexpected error'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   333
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   334
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   335
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   336
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   337
    ^ trapMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   338
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   339
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   340
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   341
                wrapMethod:(Point compiledMethodAt:#scaleBy:) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   342
                   onEntry:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   343
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   344
                               Transcript show:'leave Point>>scaleBy:; returning:'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   345
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   346
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   347
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   348
     (1@2) scaleBy:5.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   349
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   350
     (1@2) scaleBy:5.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   351
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   352
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   353
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   354
                wrapMethod:(Integer compiledMethodAt:#factorial) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   355
                   onEntry:[:con |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   356
                               Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   357
                           ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   358
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   359
                               Transcript show:'leave Integer>>factorial; returning:'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   360
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   361
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   362
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   363
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   364
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   365
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   366
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   367
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   368
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   369
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   370
     |lvl|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   371
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   372
     lvl := 0.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   373
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   374
                wrapMethod:(Integer compiledMethodAt:#factorial) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   375
                   onEntry:[:con |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   376
                               Transcript spaces:lvl. lvl := lvl + 2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   377
                               Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   378
                           ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   379
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   380
                               lvl := lvl - 2. Transcript spaces:lvl.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   381
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   382
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   383
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   384
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   385
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   386
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   387
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   388
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   389
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   390
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   391
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   392
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   393
unwrapMethod:aMethod 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   394
    "remove any wrapper on aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   395
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   396
    |parser selector args nArgs class originalMethod s spec lits src idx|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   397
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   398
    aMethod isWrapped ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   399
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   400
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   401
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   402
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   403
     get class/selector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   404
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   405
    class := aMethod containingClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   406
    class isNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   407
        self error:'cannot place trap (no containing class found)'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   408
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   409
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   410
    selector := class selectorForMethod:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   411
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   412
    originalMethod := aMethod originalMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   413
    originalMethod isNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   414
        self error:'oops, could not find original method'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   415
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   416
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   417
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   418
    idx := class selectorArray indexOf:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   419
    idx ~~ 0 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   420
        class methodArray at:idx put:originalMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   421
    ] ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   422
        self halt:'oops, unexpected error'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   423
        ^ aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   424
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   425
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   426
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   427
    ^ originalMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   428
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   429
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   430
unwrapAllMethods
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   431
    "just in case you dont know what methods have break/trace-points
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   432
     on them; this removes them all"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   433
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   434
    WrappedMethod allInstancesDo:[:aMethod |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   435
        self unwrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   436
    ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   437
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   438
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   439
!MessageTracer class methodsFor:'class wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   440
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   441
wrapClass:aClass selector:aSelector onEntry:entryBlock onExit:exitBlock 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   442
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   443
     aSelector is sent to instances of aClass or subclasses. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   444
     EntryBlock will be called on entry, and get the current context passed as argument. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   445
     ExitBlock will be called, when the method is left, and get context and the methods return value as arguments.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   446
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   447
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   448
    |parser sourceString selector args nArgs newClass orgClass myMetaclass trapMethod s spec lits src idx|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   449
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   450
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   451
     create a new method, which calls the original one,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   452
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   453
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   454
    spec := Parser methodSpecificationForSelector:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   455
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   456
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   457
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   458
    s cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   459
    s nextPutAll:'|retVal stubClass|'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   460
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   461
        s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   462
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   463
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   464
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   465
        s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   466
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   467
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   468
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   469
    trapMethod := Compiler compile:s contents 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   470
                          forClass:newClass 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   471
                        inCategory:'trapping'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   472
                         notifying:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   473
                           install:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   474
                        skipIfSame:false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   475
                            silent:true.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   476
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   477
    lits := trapMethod literals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   478
    entryBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   479
        lits at:(lits indexOf:#literal1) put:entryBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   480
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   481
    exitBlock notNil ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   482
        lits at:(lits indexOf:#literal2) put:exitBlock.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   483
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   484
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   485
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   486
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   487
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   488
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   489
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   490
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   491
     if not already trapping, create a new class
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   492
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   493
    aClass category == #trapping ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   494
        idx := aClass selectorArray indexOf:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   495
        idx ~~ 0 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   496
            aClass methodArray at:idx put:trapMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   497
        ] ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   498
            aClass setSelectorArray:(aClass selectorArray copyWith:aSelector).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   499
            aClass setMethodArray:(aClass methodArray copyWith:trapMethod)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   500
        ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   501
        lits at:(lits indexOf:#literal3) put:aClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   502
    ] ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   503
        myMetaclass := aClass class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   504
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   505
        newClass := myMetaclass new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   506
        newClass setSuperclass:aClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   507
        newClass instSize:aClass instSize.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   508
        newClass flags:aClass flags.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   509
        newClass setClassVariableString:aClass classVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   510
        newClass setInstanceVariableString:aClass instanceVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   511
        newClass setName:aClass name.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   512
        newClass category:aClass category.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   513
        newClass setSelectorArray:aClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   514
        newClass setMethodArray:aClass methodArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   515
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   516
        aClass setSuperclass:newClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   517
        aClass setClassVariableString:''.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   518
        aClass setInstanceVariableString:''.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   519
        aClass category:#trapping.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   520
        aClass setSelectorArray:(Array with:aSelector).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   521
        aClass setMethodArray:(Array with:trapMethod).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   522
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   523
        lits at:(lits indexOf:#literal3) put:newClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   524
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   525
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   526
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   527
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   528
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   529
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   530
                wrapMethod:(Point compiledMethodAt:#scaleBy:) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   531
                   onEntry:nil
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   532
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   533
                               Transcript show:'leave Point>>scaleBy:; returning:'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   534
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   535
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   536
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   537
     (1@2) scaleBy:5.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   538
     MessageTracer untrapClass:Point.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   539
     (1@2) scaleBy:5.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   540
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   541
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   542
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   543
                wrapMethod:(Integer compiledMethodAt:#factorial) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   544
                   onEntry:[:con |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   545
                               Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   546
                           ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   547
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   548
                               Transcript show:'leave Integer>>factorial; returning:'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   549
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   550
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   551
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   552
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   553
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   554
     MessageTracer untrapClass:Integer.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   555
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   556
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   557
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   558
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   559
     |lvl|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   560
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   561
     lvl := 0.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   562
     MessageTracer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   563
                wrapMethod:(Integer compiledMethodAt:#factorial) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   564
                   onEntry:[:con |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   565
                               Transcript spaces:lvl. lvl := lvl + 2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   566
                               Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   567
                           ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   568
                    onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   569
                               lvl := lvl - 2. Transcript spaces:lvl.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   570
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   571
                               Transcript showCr:retVal printString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   572
                               Transcript endEntry
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   573
                           ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   574
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   575
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   576
     MessageTracer untrapClass:Integer.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   577
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   578
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   579
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   580
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   581
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   582
!MessageTracer class methodsFor:'object breakpointing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   583
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   584
trap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   585
    "arrange for the debugger to be entered when a message with aSelector is 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   586
     sent to anObject. Use untrap to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   587
     The current implementation does not allow integers or nil to be trapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   588
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   589
    self wrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   590
         selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   591
         onEntry:[:context |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   592
                     Debugger enter:context withMessage:'breakPoint hit'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   593
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   594
         onExit:[:context :retVal | ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   595
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   596
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   597
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   598
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   599
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   600
     MessageTracer trap:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   601
     p x:5
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   602
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   603
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   604
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   605
untrap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   606
    "remove trap on aSelector from anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   607
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   608
    |orgClass idx sels|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   609
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   610
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   611
    orgClass category == #trapping ifFalse:[^ self].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   612
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   613
    sels := orgClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   614
    idx := sels indexOf:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   615
    idx == 0 ifTrue:[^ self].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   616
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   617
    sels size == 1 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   618
        "the last trap got removed"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   619
        anObject changeClassTo:orgClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   620
        ^ self
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   621
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   622
    orgClass setSelectorArray:(sels copyWithoutIndex:idx).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   623
    orgClass setMethodArray:(orgClass methodArray copyWithoutIndex:idx).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   624
    ObjectMemory flushCaches. "avoid calling the old trap method"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   625
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   626
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   627
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   628
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   629
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   630
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   631
     MessageTracer trace:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   632
     'trace both ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   633
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   634
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   635
     'trace only y ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   636
     MessageTracer untrap:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   637
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   638
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   639
     'trace none ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   640
     MessageTracer untrap:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   641
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   642
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   643
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   644
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   645
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   646
untrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   647
    "remove any traps on anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   648
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   649
    "this is done by just patching the objects class back to the original"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   650
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   651
    |orgClass|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   652
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   653
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   654
    orgClass category == #trapping ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   655
        ^ self
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   656
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   657
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   658
    anObject changeClassTo:orgClass superclass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   659
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   660
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   661
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   662
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   663
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   664
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   665
     MessageTracer trace:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   666
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   667
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   668
     MessageTracer untrap:p
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   669
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   670
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   671
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   672
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   673
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   674
!MessageTracer class methodsFor:'method breakpointing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   675
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   676
trapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   677
    "arrange for the debugger to be entered when aMethod is about to be executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   678
     Use unwrapMethod or untrapClass to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   679
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   680
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   681
     entry/leave blocks."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   682
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   683
    ^ self wrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   684
              onEntry:[:context |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   685
                         Debugger enter:context withMessage:'breakPoint hit'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   686
                      ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   687
               onExit:[:context :retVal | ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   688
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   689
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   690
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   691
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   692
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   693
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   694
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   695
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   696
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   697
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   698
untrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   699
    "remove break on aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   700
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   701
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   702
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   703
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   704
    ^ self unwrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   705
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   706
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   707
!MessageTracer class methodsFor:'class breakpointing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   708
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   709
trapClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   710
    "arrange for the debugger to be entered when a message with aSelector is 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   711
     sent to instances of aClass (or subclass instances). Use untrapClass to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   712
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   713
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   714
     entry/leave blocks."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   715
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   716
    self wrapMethod:(aClass compiledMethodAt:aSelector)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   717
         onEntry:[:context |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   718
                     Debugger enter:context withMessage:'breakPoint hit'
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   719
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   720
         onExit:[:context :retVal | ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   721
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   722
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   723
     MessageTracer trapClass:Collection selector:#select:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   724
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   725
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   726
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   727
     MessageTracer untrapClass:Collection 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   728
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   729
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   730
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   731
untrapClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   732
    "remove trap of aSelector sent to aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   733
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   734
    |idx sels newSels newMethods|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   735
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   736
    aClass category == #trapping ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   737
        ^ self
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   738
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   739
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   740
    sels := aClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   741
    idx := sels indexOf:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   742
    idx == 0 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   743
        ^ self
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   744
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   745
    sels size == 1 ifTrue:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   746
        "the last trapped method"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   747
        ^ self untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   748
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   749
    newSels := sels copyWithoutIndex:idx.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   750
    newMethods := aClass methodArray copyWithoutIndex:idx.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   751
    aClass selectors:newSels methods:newMethods.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   752
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   753
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   754
     MessageTracer trapClass:Point selector:#copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   755
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   756
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   757
     MessageTracer trapClass:Point selector:#deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   758
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   759
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   760
     MessageTracer untrapClass:Point selector:#copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   761
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   762
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   763
     MessageTracer untrapClass:Point selector:#deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   764
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   765
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   766
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   767
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   768
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   769
untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   770
    "remove any traps on aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   771
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   772
    "this is done by just patching the class back to the original"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   773
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   774
    |orgClass|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   775
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   776
    aClass category == #trapping ifFalse:[
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   777
        ^ self
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   778
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   779
    orgClass := aClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   780
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   781
    aClass setSuperclass:orgClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   782
    aClass setClassVariableString:orgClass classVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   783
    aClass setInstanceVariableString:orgClass instanceVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   784
    aClass category:orgClass category.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   785
    aClass setSelectorArray:orgClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   786
    aClass setMethodArray:orgClass methodArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   787
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   788
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   789
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   790
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   791
     MessageTracer untrapClass:Point
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   792
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   793
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   794
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   795
untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   796
    "remove any traps on any class"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   797
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   798
    Smalltalk allBehaviorsDo:[:aClass |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   799
        self untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   800
    ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   801
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   802
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   803
     MessageTracer untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   804
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   805
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   806
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   807
!MessageTracer class methodsFor:'object tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   808
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   809
trace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   810
    "arrange for a trace message to be output on Stderr, when a message with 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   811
     aSelector is sent to anObject. Both entry and exit are traced.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   812
     Use untrap to remove this trace.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   813
     The current implementation does not allow integers or nil to be traced."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   814
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   815
    |methodName|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   816
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   817
    methodName := anObject class name , '>>' , aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   818
    self wrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   819
         selector:aSelector 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   820
         onEntry:[:con | 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   821
                     'enter ' errorPrint. methodName errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   822
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   823
                     ' args=' errorPrint. (con args) printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   824
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   825
         onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   826
                     'leave ' errorPrint. methodName errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   827
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   828
                     ' returning:' errorPrint. retVal printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   829
                ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   830
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   831
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   832
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   833
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   834
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   835
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   836
     p x:5.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   837
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   838
     p x:10.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   839
     MessageTracer untrap:p.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   840
     p x:7
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   841
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   842
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   843
     |a|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   844
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   845
     a := #(6 1 9 66 2 17) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   846
     MessageTracer trace:a selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   847
     MessageTracer trace:a selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   848
     a sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   849
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   850
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   851
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   852
traceSender:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   853
    "arrange for a trace message to be output on Stderr, when a message with 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   854
     aSelector is sent to anObject. Only the sender is traced on entry.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   855
     Use untrap to remove this trace.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   856
     The current implementation does not allow integers or nil to be traced."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   857
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   858
    |methodName|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   859
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   860
    methodName := anObject class name , '>>' , aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   861
    self wrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   862
         selector:aSelector 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   863
         onEntry:[:con | 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   864
                     methodName errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   865
                     ' from ' errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   866
                     con sender errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   867
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   868
         onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   869
                ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   870
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   871
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   872
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   873
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   874
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   875
     MessageTracer traceSender:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   876
     p x:5.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   877
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   878
     p x:10.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   879
     MessageTracer untrap:p.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   880
     p x:7
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   881
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   882
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   883
     |a|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   884
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   885
     a := #(6 1 9 66 2 17) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   886
     MessageTracer traceSender:a selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   887
     MessageTracer traceSender:a selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   888
     a sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   889
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   890
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   891
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   892
untrace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   893
    "remove traces of aSelector sent to anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   894
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   895
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   896
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   897
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   898
    ^ self untrap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   899
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   900
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   901
untrace:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   902
    "remove any traces on anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   903
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   904
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   905
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   906
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   907
    ^ self untrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   908
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   909
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   910
!MessageTracer class methodsFor:'method tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   911
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   912
traceMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   913
    "arrange for a trace message to be output on Stderr, when aMethod is executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   914
     Use unwrapMethod to remove this."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   915
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   916
    ^ self wrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   917
         onEntry:[:con | 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   918
                     'enter ' errorPrint. con receiver class name errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   919
                                          '>>' errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   920
                                          con selector errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   921
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   922
                     ' args=' errorPrint. (con args) printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   923
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   924
         onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   925
                     'leave ' errorPrint. con receiver class name errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   926
                                          '>>' errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   927
                                          con selector errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   928
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   929
                     ' returning:' errorPrint. retVal printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   930
                ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   931
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   932
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   933
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   934
     5 factorial.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   935
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial) 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   936
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   937
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   938
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   939
     #(6 1 9 66 2 17) copy sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   940
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:). 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   941
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   942
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   943
     MessageTracer traceMethod:(Array compiledMethodAt:#at:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   944
     MessageTracer traceMethod:(Array compiledMethodAt:#at:put:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   945
     #(6 1 9 66 2 17) copy sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   946
     MessageTracer unwrapMethod:(Array compiledMethodAt:#at:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   947
     MessageTracer unwrapMethod:(Array compiledMethodAt:#at:put:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   948
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   949
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   950
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   951
traceMethodSender:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   952
    "arrange for a trace message to be output on Stderr, when amethod is executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   953
     Only the sender is traced on entry.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   954
     Use untraceMethod to remove this trace."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   955
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   956
    ^ self wrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   957
              onEntry:[:con |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   958
                          con receiver class name errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   959
                          '>>' errorPrint. con selector errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   960
                          ' from ' errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   961
                          con sender errorPrintNL.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   962
                      ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   963
              onExit:[:con :retVal | ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   964
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   965
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   966
untraceMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   967
    "remove tracing of aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   968
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   969
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   970
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   971
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   972
    ^ self unwrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   973
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   974
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   975
!MessageTracer class methodsFor:'class tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   976
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   977
traceClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   978
    "arrange for a trace message to be output on Stderr, when a message with aSelector is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   979
     sent to instances of aClass (or subclass instances). Use untraceClass to remove this."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   980
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   981
    self wrapMethod:(aClass compiledMethodAt:aSelector)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   982
         onEntry:[:con | 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   983
                     'enter ' errorPrint. con receiver class name errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   984
                                          '>>' errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   985
                                          con selector errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   986
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   987
                     ' args=' errorPrint. (con args) printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   988
                 ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   989
         onExit:[:con :retVal |
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   990
                     'leave ' errorPrint. con receiver class name errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   991
                                          '>>' errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   992
                                          con selector errorPrint. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   993
                     ' receiver=' errorPrint. con receiver printString errorPrint.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   994
                     ' returning:' errorPrint. retVal printString errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   995
                ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   996
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   997
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   998
     MessageTracer traceClass:Integer selector:#factorial.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   999
     5 factorial.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1000
     MessageTracer untraceClass:Integer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1001
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1002
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1003
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1004
     #(6 1 9 66 2 17) copy sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1005
     MessageTracer untraceClass:SequenceableCollection 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1006
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1007
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1008
     MessageTracer traceClass:Array selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1009
     MessageTracer traceClass:Array selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1010
     #(6 1 9 66 2 17) copy sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1011
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1012
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1013
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1014
untraceClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1015
    "remove all traces of messages sent to instances of aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1016
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1017
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1018
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1019
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1020
    ^ self untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1021
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1022
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1023
untraceAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1024
    "remove all traces of messages sent to any class"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1025
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1026
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1027
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1028
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1029
    ^ self untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1030
! !