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