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