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