MsgTracer.st
author claus
Wed, 23 Nov 1994 00:07:44 +0100
changeset 13 e416e7aa11e1
parent 12 2bfc13a2b95a
child 16 fcbfbba03d49
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
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
     3
	      All Rights Reserved
8
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
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    14
       instanceVariableNames:'traceHow'
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
    15
       classVariableNames:'BreakpointSignal CallingLevel'
8
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
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    22
	      All Rights Reserved
10
676ce0471de4 *** empty log message ***
claus
parents: 9
diff changeset
    23
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
    24
$Header: /cvs/stx/stx/libbasic3/Attic/MsgTracer.st,v 1.6 1994-11-22 23:07:44 claus Exp $
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    25
'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    26
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    27
!MessageTracer class methodsFor:'documentation'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    28
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    29
copyright
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    30
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    31
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    32
	      All Rights Reserved
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    33
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    34
 This software is furnished under a license and may be used
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    35
 only in accordance with the terms of that license and with the
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    37
 be provided or otherwise made available to, or used by, any
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    38
 other person.  No title to or ownership of the software is
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    39
 hereby transferred.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    40
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    41
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    42
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    43
version
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    44
"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
    45
$Header: /cvs/stx/stx/libbasic3/Attic/MsgTracer.st,v 1.6 1994-11-22 23:07:44 claus Exp $
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    46
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    47
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    48
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    49
documentation
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    50
"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    51
    This class provides a common home for the tracing
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    52
    facilities (originally, they where in Object, but have been moved to
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    53
    allow easier separation of development vs. runtime configurations.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    54
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    55
    tracing execution of a block:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    56
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    57
	MessageTracer trace:[ ... ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    58
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    59
	MessageTracer traceFull:[ ... ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    60
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    61
	(for system developper only:)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    62
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    63
	MessageTracer debugTrace:[ ... ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    64
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    65
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    66
    trapping sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    67
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    68
	MessageTracer trap:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    69
	...
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    70
	MessageTracer untrap:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    71
	or:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    72
	MessageTracer untrap:anObject
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    73
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    74
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    75
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    76
    trapping evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    77
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    78
	MessageTracer trapMethod:aMethod
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    79
	...
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    80
	MessageTracer unwrapMethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    81
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    82
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    83
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    84
    trapping evaluation of a specific method with
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    85
    receiver being an instance of some class:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    86
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    87
	MessageTracer trapMethod:aMethod forInstancesOf:aClass
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    88
	...
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    89
	MessageTracer unwrapMethod:aMethod
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    90
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    91
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
    92
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    93
    tracing sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    94
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    95
	MessageTracer trace:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    96
	...
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    97
	MessageTracer untrace:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    98
	or:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    99
	MessageTracer untrace:anObject
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   100
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   101
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   102
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   103
    tracing sender only:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   104
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   105
	MessageTracer traceSender:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   106
	...
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   107
	MessageTracer untrace:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   108
	or:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   109
	MessageTracer untrace:anObject
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   110
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   111
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   112
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   113
    tracing evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   114
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   115
	MessageTracer traceMethod:aMethod
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   116
	...
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   117
	MessageTracer unwrapmethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   118
"
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   119
!
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   120
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   121
examples
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   122
"
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   123
  For the common cases, you will find a menu entry in the SystemBrowser.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   124
  Howeever, more special cases (especially with condition checks) can be
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   125
  set up by evaluating the lower level entries.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   126
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   127
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   128
  trapping specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   129
  (by class/selector):
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   130
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   131
     MessageTracer trapClass:Collection selector:#select:.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   132
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   133
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   134
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   135
     MessageTracer untrapClass:Collection 
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   136
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   137
  (by method):
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   138
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   139
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   140
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   141
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   142
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   143
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   144
  tracing specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   145
  (by class/selector):
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   146
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   147
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   148
     #(6 1 9 66 2 17) copy sort.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   149
     MessageTracer untraceClass:SequenceableCollection 
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   150
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   151
  (by method):
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   152
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   153
     #(6 1 9 66 2 17) copy sort.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   154
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:). 
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   155
"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   156
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   157
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   158
!MessageTracer class methodsFor:'initialization'!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   159
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   160
initialize
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   161
    BreakpointSignal isNil ifTrue:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   162
	Object initialize.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   163
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   164
	BreakpointSignal := Object haltSignal newSignalMayProceed:true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   165
	BreakpointSignal nameClass:self message:#breakpointSignal.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   166
	BreakpointSignal notifierString:'breakpoint encountered'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   167
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   168
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   169
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   170
!MessageTracer class methodsFor:'signal access'!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   171
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   172
breakpointSignal
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   173
    ^ BreakpointSignal
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   174
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   175
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   176
!MessageTracer class methodsFor:'execution trace '!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   177
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   178
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   179
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   180
     Return the value of the block."
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   181
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   182
    ^ self new trace:aBlock.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   183
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   184
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   185
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   186
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   187
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   188
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   189
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   190
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   191
     Return the value of the block.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   192
     The trace information is more detailed."
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   193
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   194
     ^ self new traceFull:aBlock.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   195
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   196
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   197
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   198
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   199
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   200
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   201
debugTrace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   202
    "trace execution of aBlock. This is for system debugging only"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   203
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   204
    Smalltalk debugOn.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   205
    ^ aBlock valueNowOrOnUnwindDo:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   206
	Smalltalk debugOff.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   207
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   208
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   209
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   210
     MessageTracer debugTrace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   211
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   212
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   213
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   214
!MessageTracer methodsFor:'trace helpers '!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   215
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   216
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   217
    "trace execution of aBlock"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   218
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   219
    ObjectMemory stepInterruptHandler:self.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   220
    StepInterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   221
    InterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   222
    ^ aBlock valueNowOrOnUnwindDo:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   223
	StepInterruptPending := nil.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   224
	ObjectMemory stepInterruptHandler:nil.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   225
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   226
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   227
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   228
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   229
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   230
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   231
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   232
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   233
    "trace execution of aBlock"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   234
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   235
    traceHow := #detail.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   236
    ObjectMemory stepInterruptHandler:self.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   237
    StepInterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   238
    InterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   239
    ^ aBlock valueNowOrOnUnwindDo:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   240
	StepInterruptPending := nil.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   241
	ObjectMemory stepInterruptHandler:nil.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   242
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   243
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   244
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   245
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   246
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   247
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   248
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   249
stepInterrupt
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   250
    "called for every send while tracing"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   251
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   252
    StepInterruptPending := nil.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   253
    traceHow == #detail ifTrue:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   254
	self class printEntryFull:thisContext sender.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   255
"/        thisContext sender printNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   256
    ] ifFalse:[    
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   257
	thisContext sender printNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   258
    ].
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   259
    StepInterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   260
    InterruptPending := true.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   261
    ^ self
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   262
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   263
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   264
!MessageTracer class methodsFor:'helpers '!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   265
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   266
printEntryFull:aContext level:lvl
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   267
    (String new:lvl) errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   268
    'enter ' errorPrint. 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   269
    aContext methodClass name errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   270
    ' ' errorPrint.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   271
    aContext selector errorPrint. 
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   272
    ' rcvr=' errorPrint. 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   273
    aContext receiver "printString" errorPrint.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   274
    ' args=' errorPrint. 
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   275
    (aContext args) "printString" errorPrint.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   276
    ' from:' errorPrint. aContext sender errorPrintNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   277
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   278
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   279
printEntryFull:aContext
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   280
    self printEntryFull:aContext level:0
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   281
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   282
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   283
printEntrySender:aContext
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   284
    aContext methodClass name errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   285
    ' ' errorPrint. aContext selector errorPrint. 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   286
    ' from ' errorPrint.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   287
    aContext sender errorPrintNL.  
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   288
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   289
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   290
printExit:aContext with:retVal level:lvl
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   291
    (String new:lvl) errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   292
    'leave ' errorPrint. 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   293
    aContext methodClass name errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   294
    ' ' errorPrint.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   295
    aContext selector errorPrint. 
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   296
    ' rcvr=' errorPrint. 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   297
    aContext receiver "printString" errorPrint.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   298
    ' return:' errorPrint. retVal "printString" errorPrintNL.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   299
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   300
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   301
printExit:aContext with:retVal
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   302
    self printExit:aContext with:retVal level:0
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   303
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   304
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   305
!MessageTracer class methodsFor:'object wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   306
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   307
wrap:anObject selectors:aCollection onEntry:entryBlock onExit:exitBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   308
    aCollection do:[:aSelector |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   309
	self wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   310
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   311
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   312
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   313
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   314
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   315
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   316
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   317
     when the method is left, and get the context and the methods return value as arguments.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   318
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   319
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   320
    "I have not yet enough experience, if the wrapped original method should
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   321
     run as an instance of the original, or of the catching class; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   322
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   323
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   324
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   325
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   326
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   327
    ^ self wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock withOriginalClass:true
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   328
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   329
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   330
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock withOriginalClass:withOriginalClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   331
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   332
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   333
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   334
     when the method is left, and get the methods return value as argument.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   335
     The argument withOriginalClass controls if the original method should be called for with
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   336
     the receiver being trapped upon or not.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   337
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   338
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   339
    |newClass orgClass myMetaclass trapMethod s spec lits|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   340
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   341
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   342
     create a new (anonymous) subclass of the receivers class
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   343
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   344
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   345
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   346
    orgClass category == #trapping ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   347
	newClass := orgClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   348
    ] ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   349
	myMetaclass := orgClass class.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   350
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   351
	newClass := myMetaclass new.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   352
	newClass setSuperclass:orgClass.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   353
	newClass instSize:orgClass instSize.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   354
	newClass flags:orgClass flags.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   355
	newClass setClassVariableString:''.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   356
	newClass setInstanceVariableString:''.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   357
	newClass setName:orgClass name.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   358
	newClass category:#trapping.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   359
	newClass setSelectors:(Array new) methods:(Array new).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   360
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   361
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   362
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   363
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   364
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   365
    spec := Parser methodSpecificationForSelector:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   366
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   367
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   368
    s cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   369
    s nextPutAll:'|retVal stubClass|'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   370
    withOriginalClass ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   371
	s nextPutAll:'stubClass := self class.'; cr.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   372
	s nextPutAll:'self changeClassTo:(stubClass superclass).'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   373
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   374
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   375
	s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   376
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   377
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   378
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   379
	s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   380
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   381
    withOriginalClass ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   382
	s nextPutAll:'self changeClassTo:stubClass.'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   383
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   384
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   385
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   386
    trapMethod := Compiler compile:s contents 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   387
			  forClass:newClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   388
			inCategory:'breakpointed'
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   389
			 notifying:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   390
			   install:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   391
			skipIfSame:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   392
			    silent:true.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   393
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   394
    lits := trapMethod literals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   395
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   396
	lits at:(lits indexOf:#literal1) put:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   397
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   398
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   399
	lits at:(lits indexOf:#literal2) put:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   400
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   401
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   402
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   403
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   404
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   405
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   406
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   407
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   408
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   409
    "
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   410
    newClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   411
	setSelectors:(newClass selectorArray copyWith:aSelector)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   412
	methods:(newClass methodArray copyWith:trapMethod).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   413
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   414
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   415
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   416
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   417
    anObject changeClassTo:newClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   418
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   419
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   420
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   421
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   422
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   423
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   424
		wrap:p
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   425
	    Selector:#y: 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   426
	     onEntry:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   427
	      onExit:[:retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   428
			 Transcript show:'leave Point>>x:, returning:'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   429
			 Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   430
			 Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   431
		     ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   432
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   433
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   434
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   435
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   436
     p untrap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   437
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   438
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   439
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   440
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   441
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   442
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   443
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   444
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   445
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   446
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   447
     MessageTracer wrap:p
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   448
	       Selector:#y: 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   449
		onEntry:[:context | self halt:'you are trapped']
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   450
		 onExit:nil.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   451
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   452
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   453
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   454
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   455
     p untrap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   456
     Transcript showCr:'sending x: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   457
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   458
     Transcript showCr:'sending y: ...'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   459
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   460
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   461
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   462
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   463
!MessageTracer class methodsFor:'method wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   464
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   465
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   466
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   467
     aMethod is evaluated. 
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   468
     EntryBlock will be called on entry, and gets the current context passed as argument. 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   469
     ExitBlock will be called, when the method is left, and gets the context and 
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   470
     the methods return value as arguments."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   471
10
676ce0471de4 *** empty log message ***
claus
parents: 9
diff changeset
   472
    |selector class trapMethod s spec lits src idx|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   473
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   474
    CallingLevel := 0.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   475
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   476
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   477
     create a new method, which calls the original one,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   478
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   479
    "
10
676ce0471de4 *** empty log message ***
claus
parents: 9
diff changeset
   480
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   481
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   482
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   483
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   484
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   485
     get class/selector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   486
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   487
    class := aMethod containingClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   488
    class isNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   489
	self error:'cannot place trap (no containing class found)'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   490
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   491
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   492
    selector := class selectorForMethod:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   493
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   494
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   495
     get a new method-spec
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   496
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   497
    spec := Parser methodSpecificationForSelector:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   498
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   499
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   500
     create a method, executing the trap-blocks and the original method via a direct call
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   501
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   502
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   503
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   504
    s nextPutAll:' |retVal| '.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   505
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   506
	s nextPutAll:'#entryBlock yourself value:thisContext. '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   507
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   508
    s nextPutAll:'retVal := #originalMethod yourself';
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   509
      nextPutAll:             ' valueWithReceiver:(thisContext receiver)'; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   510
      nextPutAll:             ' arguments:(thisContext args)';
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   511
      nextPutAll:             ' selector:(thisContext selector)'; 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   512
      nextPutAll:             ' search:(thisContext searchClass) yourself. '.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   513
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   514
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   515
	s nextPutAll:'#exitBlock yourself value:thisContext value:retVal.'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   516
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   517
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   518
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   519
    src := s contents.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   520
    trapMethod := Compiler compile:src 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   521
			  forClass:UndefinedObject 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   522
			inCategory:aMethod category
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   523
			 notifying:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   524
			   install:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   525
			skipIfSame:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   526
			    silent:true.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   527
    trapMethod changeClassTo:WrappedMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   528
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   529
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   530
     raising our eyebrows here ...
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   531
    "
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   532
    lits := trapMethod basicLiterals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   533
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   534
	lits at:(lits indexOf:#entryBlock) put:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   535
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   536
    lits at:(lits indexOf:#originalMethod) put:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   537
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   538
	lits at:(lits indexOf:#exitBlock) put:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   539
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   540
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   541
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   542
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   543
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   544
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   545
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   546
    idx := class selectorArray indexOf:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   547
    idx ~~ 0 ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   548
	class methodArray at:idx put:trapMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   549
    ] ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   550
	self halt:'oops, unexpected error'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   551
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   552
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   553
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   554
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   555
    ^ trapMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   556
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   557
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   558
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   559
		wrapMethod:(Point compiledMethodAt:#scaleBy:) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   560
		   onEntry:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   561
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   562
			       Transcript show:'leave Point>>scaleBy:; returning:'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   563
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   564
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   565
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   566
     (1@2) scaleBy:5.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   567
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   568
     (1@2) scaleBy:5.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   569
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   570
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   571
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   572
		wrapMethod:(Integer compiledMethodAt:#factorial) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   573
		   onEntry:[:con |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   574
			       Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   575
			   ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   576
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   577
			       Transcript show:'leave Integer>>factorial; returning:'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   578
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   579
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   580
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   581
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   582
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   583
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   584
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   585
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   586
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   587
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   588
     |lvl|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   589
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   590
     lvl := 0.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   591
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   592
		wrapMethod:(Integer compiledMethodAt:#factorial) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   593
		   onEntry:[:con |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   594
			       Transcript spaces:lvl. lvl := lvl + 2.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   595
			       Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   596
			   ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   597
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   598
			       lvl := lvl - 2. Transcript spaces:lvl.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   599
			       Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   600
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   601
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   602
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   603
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   604
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   605
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   606
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   607
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   608
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   609
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   610
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   611
unwrapMethod:aMethod 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   612
    "remove any wrapper on aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   613
10
676ce0471de4 *** empty log message ***
claus
parents: 9
diff changeset
   614
    |selector class originalMethod idx|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   615
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   616
    CallingLevel := 0.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   617
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
   618
    (aMethod isNil or:[aMethod isWrapped not]) ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   619
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   620
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   621
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   622
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   623
     get class/selector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   624
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   625
    class := aMethod containingClass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   626
    class isNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   627
	'no containing class for method found' printNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   628
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   629
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   630
    selector := class selectorForMethod:aMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   631
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   632
    originalMethod := aMethod originalMethod.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   633
    originalMethod isNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   634
	self error:'oops, could not find original method'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   635
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   636
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   637
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   638
    idx := class selectorArray indexOf:selector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   639
    idx ~~ 0 ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   640
	class methodArray at:idx put:originalMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   641
    ] ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   642
	self halt:'oops, unexpected error'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   643
	^ aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   644
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   645
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   646
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   647
    ^ originalMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   648
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   649
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   650
unwrapAllMethods
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   651
    "just in case you dont know what methods have break/trace-points
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   652
     on them; this removes them all"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   653
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   654
    WrappedMethod allInstancesDo:[:aMethod |
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   655
	self unwrapMethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   656
    ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   657
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   658
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   659
!MessageTracer class methodsFor:'class wrapping'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   660
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   661
wrapClass:aClass selector:aSelector onEntry:entryBlock onExit:exitBlock 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   662
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   663
     aSelector is sent to instances of aClass or subclasses. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   664
     EntryBlock will be called on entry, and get the current context passed as argument. 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   665
     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
   666
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   667
10
676ce0471de4 *** empty log message ***
claus
parents: 9
diff changeset
   668
    |myMetaclass trapMethod s spec lits idx newClass|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   669
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   670
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   671
     create a new method, which calls the original one,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   672
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   673
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   674
    spec := Parser methodSpecificationForSelector:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   675
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   676
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   677
    s nextPutAll:spec.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   678
    s cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   679
    s nextPutAll:'|retVal stubClass|'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   680
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   681
	s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   682
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   683
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   684
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   685
	s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   686
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   687
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   688
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   689
    trapMethod := Compiler compile:s contents 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   690
			  forClass:aClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   691
			inCategory:'trapping'
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   692
			 notifying:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   693
			   install:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   694
			skipIfSame:false
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   695
			    silent:true.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   696
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   697
    lits := trapMethod literals.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   698
    entryBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   699
	lits at:(lits indexOf:#literal1) put:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   700
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   701
    exitBlock notNil ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   702
	lits at:(lits indexOf:#literal2) put:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   703
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   704
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   705
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   706
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   707
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   708
    trapMethod source:'this is a wrapper method - not the real one'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   709
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   710
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   711
     if not already trapping, create a new class
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   712
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   713
    aClass category == #trapping ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   714
	idx := aClass selectorArray indexOf:aSelector.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   715
	idx ~~ 0 ifTrue:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   716
	    aClass methodArray at:idx put:trapMethod
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   717
	] ifFalse:[
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   718
	    aClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   719
		setSelectors:(aClass selectorArray copyWith:aSelector)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   720
		methods:(aClass methodArray copyWith:trapMethod)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   721
	].
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   722
	lits at:(lits indexOf:#literal3) put:aClass superclass.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   723
    ] ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   724
	myMetaclass := aClass class.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   725
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   726
	newClass := myMetaclass new.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   727
	newClass setSuperclass:aClass superclass.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   728
	newClass instSize:aClass instSize.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   729
	newClass flags:aClass flags.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   730
	newClass setClassVariableString:aClass classVariableString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   731
	newClass setInstanceVariableString:aClass instanceVariableString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   732
	newClass setName:aClass name.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   733
	newClass category:aClass category.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   734
	newClass       
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   735
	    setSelectors:aClass selectorArray
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   736
	    methods:aClass methodArray.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   737
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   738
	aClass setSuperclass:newClass.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   739
	aClass setClassVariableString:''.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   740
	aClass setInstanceVariableString:''.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   741
	aClass category:#trapping.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   742
	aClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   743
	    setSelectors:(Array with:aSelector)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   744
	    methods:(Array with:trapMethod).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   745
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   746
	lits at:(lits indexOf:#literal3) put:newClass.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   747
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   748
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   749
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   750
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   751
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   752
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   753
		wrapMethod:(Point compiledMethodAt:#scaleBy:) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   754
		   onEntry:nil
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   755
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   756
			       Transcript show:'leave Point>>scaleBy:; returning:'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   757
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   758
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   759
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   760
     (1@2) scaleBy:5.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   761
     MessageTracer untrapClass:Point.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   762
     (1@2) scaleBy:5.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   763
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   764
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   765
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   766
		wrapMethod:(Integer compiledMethodAt:#factorial) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   767
		   onEntry:[:con |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   768
			       Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   769
			   ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   770
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   771
			       Transcript show:'leave Integer>>factorial; returning:'.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   772
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   773
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   774
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   775
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   776
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   777
     MessageTracer untrapClass:Integer.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   778
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   779
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   780
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   781
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   782
     |lvl|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   783
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   784
     lvl := 0.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   785
     MessageTracer 
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   786
		wrapMethod:(Integer compiledMethodAt:#factorial) 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   787
		   onEntry:[:con |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   788
			       Transcript spaces:lvl. lvl := lvl + 2.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   789
			       Transcript showCr:('entering ' , con receiver printString , '>>factorial').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   790
			   ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   791
		    onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   792
			       lvl := lvl - 2. Transcript spaces:lvl.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   793
			       Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   794
			       Transcript showCr:retVal printString.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   795
			       Transcript endEntry
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   796
			   ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   797
     Transcript showCr:'5 factorial traced'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   798
     5 factorial.   
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   799
     MessageTracer untrapClass:Integer.  
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   800
     Transcript showCr:'5 factorial normal'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   801
     5 factorial.         
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   802
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   803
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   804
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   805
!MessageTracer class methodsFor:'object breakpointing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   806
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   807
trap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   808
    "arrange for the debugger to be entered when a message with aSelector is 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   809
     sent to anObject. Use untrap to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   810
     The current implementation does not allow integers or nil to be trapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   811
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   812
    self wrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   813
	 selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   814
	 onEntry:[:context |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   815
		     BreakpointSignal raise
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   816
		     "/ Debugger enter:context withMessage:'breakPoint hit'
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   817
		 ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   818
	 onExit:[:context :retVal | ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   819
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   820
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   821
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   822
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   823
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   824
     MessageTracer trap:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   825
     p x:5
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   826
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   827
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   828
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   829
untrap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   830
    "remove trap on aSelector from anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   831
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   832
    |orgClass idx sels|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   833
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   834
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   835
    orgClass category == #trapping ifFalse:[^ self].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   836
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   837
    sels := orgClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   838
    idx := sels indexOf:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   839
    idx == 0 ifTrue:[^ self].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   840
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   841
    sels size == 1 ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   842
	"the last trap got removed"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   843
	anObject changeClassTo:orgClass superclass.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   844
	^ self
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   845
    ].
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   846
    orgClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   847
	setSelectors:(sels copyWithoutIndex:idx)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   848
	methods:(orgClass methodArray copyWithoutIndex:idx).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   849
    ObjectMemory flushCaches. "avoid calling the old trap method"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   850
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   851
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   852
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   853
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   854
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   855
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   856
     MessageTracer trace:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   857
     'trace both ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   858
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   859
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   860
     'trace only y ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   861
     MessageTracer untrap:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   862
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   863
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   864
     'trace none ...' errorPrintNL.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   865
     MessageTracer untrap:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   866
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   867
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   868
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   869
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   870
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   871
untrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   872
    "remove any traps on anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   873
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   874
    "this is done by just patching the objects class back to the original"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   875
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   876
    |orgClass|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   877
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   878
    orgClass := anObject class.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   879
    orgClass category == #trapping ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   880
	^ self
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   881
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   882
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   883
    anObject changeClassTo:orgClass superclass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   884
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   885
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   886
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   887
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   888
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   889
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   890
     MessageTracer trace:p selector:#y:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   891
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   892
     p x:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   893
     MessageTracer untrap:p
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   894
     p y:2.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   895
     p x:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   896
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   897
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   898
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   899
!MessageTracer class methodsFor:'method breakpointing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   900
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   901
trapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   902
    "arrange for the debugger to be entered when aMethod is about to be executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   903
     Use unwrapMethod or untrapClass to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   904
     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
   905
     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
   906
     entry/leave blocks."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   907
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   908
    ^ self wrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   909
	      onEntry:[:context |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   910
			 BreakpointSignal raise
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   911
		      ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   912
	       onExit:[:context :retVal | ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   913
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   914
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   915
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   916
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   917
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   918
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   919
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   920
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   921
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   922
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   923
untrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   924
    "remove break on aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   925
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   926
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   927
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   928
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   929
    ^ self unwrapMethod:aMethod
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   930
!
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   931
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   932
trapMethod:aMethod forInstancesOf:aClass
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   933
    "arrange for the debugger to be entered when aMethod is about to be executed
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   934
     for an instance of aClass.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   935
     Use unwrapMethod or untrapClass to remove this trap.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   936
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   937
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   938
     entry/leave blocks."
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   939
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   940
    ^ self wrapMethod:aMethod
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   941
	      onEntry:[:context |
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   942
			 (context receiver isMemberOf:aClass) ifTrue:[
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   943
			     BreakpointSignal raise
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   944
			 ]
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   945
		      ]
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   946
	       onExit:[:context :retVal | ].
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   947
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   948
    "
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   949
     MessageTracer trapMethod:(View compiledMethodAt:#redraw) forInstancesOf:myView.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   950
    "
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   951
!
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   952
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   953
trapClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   954
    "arrange for the debugger to be entered when a message with aSelector is 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   955
     sent to instances of aClass (or subclass instances). Use untrapClass to remove this trap.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   956
     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
   957
     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
   958
     entry/leave blocks."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   959
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   960
    self trapMethod:(aClass compiledMethodAt:aSelector)
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   961
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   962
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   963
     MessageTracer trapClass:Collection selector:#select:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   964
     Dictionary new select:[:e | ].       'not cought - Dictionary has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   965
     (Array new:10) select:[:e | ].       'not cought - SeqColl has its own select'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   966
     Set new select:[:e | ].              'cought - Set inherits this from Collection'.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   967
     MessageTracer untrapClass:Collection 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   968
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   969
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   970
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   971
untrapClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   972
    "remove trap of aSelector sent to aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   973
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   974
    |idx sels newSels newMethods|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   975
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   976
    aClass category == #trapping ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   977
	^ self
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   978
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   979
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   980
    sels := aClass selectorArray.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   981
    idx := sels indexOf:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   982
    idx == 0 ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   983
	^ self
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   984
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   985
    sels size == 1 ifTrue:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   986
	"the last trapped method"
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   987
	^ self untrapClass:aClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   988
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   989
    newSels := sels copyWithoutIndex:idx.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   990
    newMethods := aClass methodArray copyWithoutIndex:idx.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   991
    aClass selectors:newSels methods:newMethods.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   992
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   993
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   994
     MessageTracer trapClass:Point selector:#copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   995
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   996
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   997
     MessageTracer trapClass:Point selector:#deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   998
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   999
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1000
     MessageTracer untrapClass:Point selector:#copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1001
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1002
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1003
     MessageTracer untrapClass:Point selector:#deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1004
     (1@2) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1005
     (1@2) deepCopy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1006
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1007
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1008
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1009
untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1010
    "remove any traps on aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1011
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1012
    "this is done by just patching the class back to the original"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1013
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1014
    |orgClass|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1015
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1016
    aClass category == #trapping ifFalse:[
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1017
	^ self
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1018
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1019
    orgClass := aClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1020
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1021
    aClass setSuperclass:orgClass superclass.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1022
    aClass setClassVariableString:orgClass classVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1023
    aClass setInstanceVariableString:orgClass instanceVariableString.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1024
    aClass category:orgClass category.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1025
    aClass 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1026
	setSelectors:orgClass selectorArray
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1027
	methods:orgClass methodArray.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1028
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1029
    ObjectMemory flushCaches.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1030
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1031
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1032
     MessageTracer untrapClass:Point
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1033
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1034
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1035
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1036
untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1037
    "remove any traps on any class"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1038
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1039
    Smalltalk allBehaviorsDo:[:aClass |
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1040
	self untrapClass:aClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1041
    ]
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1042
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1043
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1044
     MessageTracer untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1045
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1046
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1047
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1048
!MessageTracer class methodsFor:'object tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1049
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1050
traceAll:anObject from:aClass
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1051
    "trace all messages defined in aClass sent to anObject"
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1052
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1053
    self trace:anObject selectors:aClass selectorArray
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1054
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1055
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1056
     trace all methods in Display, which are implemented
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1057
     in the DisplayWorkstation class.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1058
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1059
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1060
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1061
     MessageTracer traceAll:Display from:XWorkstation
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1062
     MessageTracer untrace:Display
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1063
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1064
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1065
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1066
trace:anObject selectors:aCollection
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1067
    aCollection do:[:aSelector |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1068
	self trace:anObject selector:aSelector
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1069
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1070
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1071
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1072
     trace all methods in Display, which are implemented
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1073
     in the DisplayWorkstation class.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1074
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1075
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1076
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1077
     MessageTracer trace:Display selectors:(XWorkstation selectorArray)
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1078
     MessageTracer untrace:Display
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1079
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1080
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1081
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1082
trace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1083
    "arrange for a trace message to be output on Stderr, when a message with 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1084
     aSelector is sent to anObject. Both entry and exit are traced.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1085
     Use untrap to remove this trace.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1086
     The current implementation does not allow integers or nil to be traced."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1087
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1088
    |methodName|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1089
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1090
    methodName := anObject class name , '>>' , aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1091
    self wrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1092
	 selector:aSelector 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1093
	 onEntry:[:con | 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1094
		     'enter ' errorPrint. methodName errorPrint. 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1095
		     ' receiver=' errorPrint. con receiver printString errorPrint.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1096
		     ' args=' errorPrint. (con args) printString errorPrint.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1097
		     ' from:' errorPrint. con sender errorPrintNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1098
		 ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1099
	 onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1100
		     'leave ' errorPrint. methodName errorPrint. 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1101
		     ' receiver=' errorPrint. con receiver printString errorPrint.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1102
		     ' returning:' errorPrint. retVal printString errorPrintNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1103
		].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1104
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1105
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1106
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1107
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1108
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1109
     MessageTracer trace:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1110
     p x:5.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1111
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1112
     p x:10.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1113
     MessageTracer untrap:p.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1114
     p x:7
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1115
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1116
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1117
     |a|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1118
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1119
     a := #(6 1 9 66 2 17) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1120
     MessageTracer trace:a selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1121
     MessageTracer trace:a selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1122
     a sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1123
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1124
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1125
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1126
traceSender:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1127
    "arrange for a trace message to be output on Stderr, when a message with 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1128
     aSelector is sent to anObject. Only the sender is traced on entry.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1129
     Use untrap to remove this trace.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1130
     The current implementation does not allow integers or nil to be traced."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1131
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1132
    |methodName|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1133
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1134
    methodName := anObject class name , '>>' , aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1135
    self wrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1136
	 selector:aSelector 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1137
	 onEntry:[:con | 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1138
		     methodName errorPrint. 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1139
		     ' from ' errorPrint. 
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1140
		     con sender errorPrintNL.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1141
		 ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1142
	 onExit:[:con :retVal |
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1143
		].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1144
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1145
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1146
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1147
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1148
     p := Point new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1149
     MessageTracer traceSender:p selector:#x:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1150
     p x:5.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1151
     p y:1.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1152
     p x:10.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1153
     MessageTracer untrap:p.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1154
     p x:7
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1155
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1156
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1157
     |a|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1158
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1159
     a := #(6 1 9 66 2 17) copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1160
     MessageTracer traceSender:a selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1161
     MessageTracer traceSender:a selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1162
     a sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1163
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1164
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1165
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1166
untrace:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1167
    "remove traces of aSelector sent to anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1168
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1169
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1170
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1171
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1172
    ^ self untrap:anObject selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1173
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1174
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1175
untrace:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1176
    "remove any traces on anObject"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1177
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1178
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1179
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1180
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1181
    ^ self untrap:anObject
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1182
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1183
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1184
!MessageTracer class methodsFor:'method tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1185
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1186
traceMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1187
    "arrange for a trace message to be output on Stderr, when aMethod is executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1188
     Use unwrapMethod to remove this."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1189
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1190
    |lvl inside|
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1191
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1192
    ^ self wrapMethod:aMethod
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1193
	 onEntry:[:con |
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1194
			inside isNil ifTrue:[
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1195
			    inside := true.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1196
			    CallingLevel isNil ifTrue:[
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1197
				CallingLevel := 0.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1198
			    ].
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1199
			    lvl notNil ifTrue:[
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1200
				lvl := lvl + 1
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1201
			    ] ifFalse:[
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1202
				CallingLevel := lvl := CallingLevel + 1.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1203
			    ].
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1204
			    MessageTracer printEntryFull:con level:lvl.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1205
			    inside := nil
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1206
			]
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1207
		 ]
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1208
	 onExit:[:con :retVal |
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1209
			inside isNil ifTrue:[
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1210
			    inside := true.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1211
			    MessageTracer printExit:con with:retVal level:lvl.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1212
			    CallingLevel := lvl := lvl - 1.
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1213
			    inside := nil
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1214
			]
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1215
		]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1216
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1217
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1218
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1219
     5 factorial.
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1220
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial) 
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1221
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1222
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1223
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1224
     #(6 1 9 66 2 17) copy sort.
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1225
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:). 
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1226
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1227
    "
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1228
     dont do this:
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1229
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1230
    "
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1231
     MessageTracer traceMethod:(Object compiledMethodAt:#at:).
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1232
     MessageTracer traceMethod:(Object compiledMethodAt:#at:put:).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1233
     #(6 1 9 66 2 17) copy sort.
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1234
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:).
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1235
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:put:).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1236
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1237
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1238
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1239
traceMethodSender:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1240
    "arrange for a trace message to be output on Stderr, when amethod is executed.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1241
     Only the sender is traced on entry.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1242
     Use untraceMethod to remove this trace."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1243
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1244
    ^ self wrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1245
	      onEntry:[:con | MessageTracer printEntrySender:con]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1246
	      onExit:[:con :retVal | ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1247
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1248
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1249
untraceMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1250
    "remove tracing of aMethod"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1251
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1252
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1253
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1254
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1255
    ^ self unwrapMethod:aMethod
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1256
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1257
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1258
!MessageTracer class methodsFor:'class tracing'!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1259
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1260
traceClass:aClass selector:aSelector
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1261
    "arrange for a trace message to be output on Stderr, when a message with aSelector is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1262
     sent to instances of aClass (or subclass instances). Use untraceClass to remove this."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1263
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  1264
    self traceMethod:(aClass compiledMethodAt:aSelector)
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1265
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1266
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1267
     MessageTracer traceClass:Integer selector:#factorial.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1268
     5 factorial.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1269
     MessageTracer untraceClass:Integer 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1270
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1271
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1272
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1273
     #(6 1 9 66 2 17) copy sort.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1274
     MessageTracer untraceClass:SequenceableCollection 
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1275
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1276
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1277
     MessageTracer traceClass:Array selector:#at:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1278
     MessageTracer traceClass:Array selector:#at:put:.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1279
     #(6 1 9 66 2 17) copy sort.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1280
     MessageTracer untraceClass:Array 
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1281
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1282
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1283
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1284
untraceClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1285
    "remove all traces of messages sent to instances of aClass"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1286
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1287
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1288
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1289
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1290
    ^ self untrapClass:aClass
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1291
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1292
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1293
untraceAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1294
    "remove all traces of messages sent to any class"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1295
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1296
    "just a rename for your convenience - the same basic mechanism is used for all of these
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1297
     trace facilities ..."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1298
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1299
    ^ self untrapAllClasses
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  1300
! !