MessageTracer.st
author Stefan Vogel <sv@exept.de>
Fri, 30 Sep 2016 16:45:41 +0200
changeset 4098 048912860538
parent 3956 8c01ea3b86fc
child 4101 89c4e9964f3a
child 4128 cb91f1919e6f
permissions -rw-r--r--
#OTHER by stefan Use (*WriteStream on:'') instead of (*WriteStream on:String new)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
     1
"{ Encoding: utf8 }"
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
     2
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     3
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
     5
	      All Rights Reserved
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     6
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    13
"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    14
"{ Package: 'stx:libbasic3' }"
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    15
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    16
"{ NameSpace: Smalltalk }"
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    17
120
950e4628d657 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    18
Object subclass:#MessageTracer
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    19
	instanceVariableNames:'traceDetail tracedBlock'
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    20
	classVariableNames:'BreakpointSignal CallingLevel BreakBlock TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
    21
		TraceSenderBlock2 LeaveBreakBlock LeaveTraceBlock MethodCounts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    22
		MethodCountsPerReceiverClass MethodMemoryUsage MethodTiming
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    23
		TraceFullBlock TraceFullBlock2 ObjectWrittenBreakpointSignal
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
    24
		ObjectCopyHolders TimeForWrappers MockedMethodMarker'
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    25
	poolDictionaries:''
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    26
	category:'System-Debugging-Support'
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    27
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    28
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    29
MessageTracer subclass:#InteractionCollector
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    30
	instanceVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    31
	classVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    32
	poolDictionaries:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    33
	privateIn:MessageTracer
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    34
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    35
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    36
Object subclass:#MethodSpyInfo
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    37
	instanceVariableNames:'profiler'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    38
	classVariableNames:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    39
	poolDictionaries:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    40
	privateIn:MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    41
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    42
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    43
Object subclass:#MethodTimingInfo
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    44
	instanceVariableNames:'count minTime maxTime sumTimes avgTime'
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    45
	classVariableNames:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    46
	poolDictionaries:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    47
	privateIn:MessageTracer
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    48
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    49
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    50
MessageTracer subclass:#PrintingMessageTracer
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    51
	instanceVariableNames:'output'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    52
	classVariableNames:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    53
	poolDictionaries:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    54
	privateIn:MessageTracer
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    55
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    56
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
    57
!MessageTracer class methodsFor:'documentation'!
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    58
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    59
copyright
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    60
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    61
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    62
	      All Rights Reserved
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    63
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    64
 This software is furnished under a license and may be used
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    65
 only in accordance with the terms of that license and with the
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    66
 inclusion of the above copyright notice.   This software may not
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    67
 be provided or otherwise made available to, or used by, any
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    68
 other person.  No title to or ownership of the software is
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    69
 hereby transferred.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    70
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    71
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    72
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    73
documentation
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    74
"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    75
    This class provides a common home for the tracing
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    76
    facilities (originally, they where in Object, but have been moved to
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    77
    allow easier separation of development vs. runtime configurations).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    78
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    79
    tracing execution of a block:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    80
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    81
	MessageTracer trace:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    82
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    83
	MessageTracer traceFull:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    84
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    85
	(for system developer only:)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    86
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    87
	MessageTracer debugTrace:[ ... ]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    88
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    89
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    90
    trapping sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    91
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    92
	MessageTracer trap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    93
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    94
	MessageTracer untrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    95
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    96
	MessageTracer untrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    97
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    98
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    99
27
claus
parents: 26
diff changeset
   100
    trapping some messages sent to a specific object:
claus
parents: 26
diff changeset
   101
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   102
	MessageTracer trap:anObject selectors:aCollectionOfSelectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   103
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   104
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   105
claus
parents: 26
diff changeset
   106
claus
parents: 26
diff changeset
   107
claus
parents: 26
diff changeset
   108
    trapping any message sent to a specific object:
claus
parents: 26
diff changeset
   109
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   110
	MessageTracer trapAll:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   111
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   112
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   113
claus
parents: 26
diff changeset
   114
claus
parents: 26
diff changeset
   115
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   116
    trapping evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   117
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   118
	MessageTracer trapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   119
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   120
	MessageTracer unwrapMethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   121
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   122
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   123
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   124
    trapping evaluation of a specific method with
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   125
    receiver being an instance of some class:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   126
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   127
	MessageTracer trapMethod:aMethod forInstancesOf:aClass
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   128
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   129
	MessageTracer unwrapMethod:aMethod
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   130
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   131
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   132
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   133
    tracing sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   134
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   135
	MessageTracer trace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   136
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   137
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   138
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   139
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   140
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   141
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   142
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   143
    tracing sender only:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   144
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   145
	MessageTracer traceSender:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   146
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   147
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   148
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   149
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   150
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   151
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   152
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   153
    tracing evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   154
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   155
	MessageTracer traceMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   156
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   157
	MessageTracer unwrapmethod:aMethod
18
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   158
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   159
  see more in examples and in method comments.
236
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   160
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   161
    [author:]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   162
	Claus Gittinger
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   163
"
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   164
!
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   165
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   166
examples
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   167
"
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   168
  For the common cases, you will find a menu entry in the SystemBrowser.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   169
  Howeever, more special cases (especially with condition checks) can be
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   170
  set up by evaluating the lower level entries.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   171
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   172
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   173
  trapping specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   174
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   175
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   176
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   177
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   178
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   179
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   180
     MessageTracer untrapClass:Collection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   181
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   182
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   183
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   184
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   185
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   186
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   187
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   188
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   189
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   190
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   191
27
claus
parents: 26
diff changeset
   192
  (by method & instance class):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   193
									[exBegin]
27
claus
parents: 26
diff changeset
   194
     MessageTracer trapMethod:(SequenceableCollection compiledMethodAt:#select:)
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   195
		   forInstancesOf:SortedCollection.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   196
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   197
     (Array new:10) select:[:e | ].       'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   198
     OrderedCollection new select:[:e | ]. 'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   199
     SortedCollection new select:[:e | ].  'caught - Set inherits this from Collection'.
27
claus
parents: 26
diff changeset
   200
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   201
									[exEnd]
27
claus
parents: 26
diff changeset
   202
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   203
  tracing specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   204
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   205
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   206
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   207
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   208
     MessageTracer untraceClass:SequenceableCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   209
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   210
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   211
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   212
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   213
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   214
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   215
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   216
									[exEnd]
27
claus
parents: 26
diff changeset
   217
claus
parents: 26
diff changeset
   218
  object trapping:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   219
									[exBegin]
27
claus
parents: 26
diff changeset
   220
     |o|
claus
parents: 26
diff changeset
   221
claus
parents: 26
diff changeset
   222
     o := OrderedCollection new.
claus
parents: 26
diff changeset
   223
     MessageTracer trapAll:o.
claus
parents: 26
diff changeset
   224
     o collect:[:el | el].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   225
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   226
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   227
  trapping modifications to an objects instVars:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   228
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   229
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   230
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   231
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   232
     MessageTracer trapModificationsIn:o.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   233
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   234
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   235
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   236
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   237
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   238
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   239
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   240
  trapping modifications of a particular instVar:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   241
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   242
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   243
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   244
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   245
     MessageTracer trapModificationsIn:o filter:[:old :new | old x ~~ new x].
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   246
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   247
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   248
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   249
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   250
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   251
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   252
  tracing during block execution:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   253
									[exBegin]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   254
     MessageTracer trace:[ 10 factorialR ]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   255
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   256
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   257
"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   258
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   259
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   260
!MessageTracer class methodsFor:'Signal constants'!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   261
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   262
breakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   263
    ^ BreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   264
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   265
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   266
objectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   267
    ^ ObjectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   268
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   269
    "Created: / 21.4.1998 / 14:38:49 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   270
! !
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   271
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   272
!MessageTracer class methodsFor:'class initialization'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   273
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   274
initialize
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   275
    BreakpointSignal isNil ifTrue:[
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   276
        "/ BreakpointSignal := HaltSignal newSignalMayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   277
        "/ BreakpointSignal nameClass:self message:#breakpointSignal.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   278
        BreakpointSignal := BreakPointInterrupt.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   279
        BreakpointSignal notifierString:'breakpoint encountered'.
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   280
    ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   281
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   282
    ObjectWrittenBreakpointSignal isNil ifTrue:[
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   283
        ObjectWrittenBreakpointSignal := BreakpointSignal newSignalMayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   284
        ObjectWrittenBreakpointSignal nameClass:self message:#objectWrittenBreakpointSignal.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   285
        ObjectWrittenBreakpointSignal notifierString:'object modified'.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   286
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   287
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   288
    "/ the following have been written as cheapBlocks (by purpose)
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   289
    BreakBlock       := [:con | BreakpointSignal raiseRequestWith:nil errorString:nil in:con].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   290
    TraceSenderBlock  := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Stderr)     ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   291
    TraceSenderBlock2 := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Transcript) ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   292
    TraceFullBlock    := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Stderr)       ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   293
    TraceFullBlock2   := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Transcript)   ].
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   294
    LeaveBreakBlock  := [:con :retVal | retVal ].
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   295
    LeaveTraceBlock  := [:con :retVal | retVal ].
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   296
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   297
    ObjectMemory addDependent:self.
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   298
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   299
    MockedMethodMarker := Object new.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   300
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   301
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   302
     BreakpointSignal := nil.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   303
     MessageTracer initialize
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   304
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   305
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   306
    "Modified: / 15-09-2011 / 19:02:13 / cg"
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   307
    "Modified: / 29-07-2014 / 09:16:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   308
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   309
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   310
update:something with:parameter from:changedObject
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   311
    "sent when restarted after a snapIn"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   312
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   313
    (something == #restarted) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   314
	TimeForWrappers := nil
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   315
    ]
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   316
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   317
    "Created: / 30.7.1998 / 17:00:09 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   318
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   319
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   320
!MessageTracer class methodsFor:'class tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   321
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   322
untraceAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   323
    "remove all traces of messages sent to any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   324
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   325
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   326
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   327
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   328
    ^ self untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   329
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   330
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   331
untraceClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   332
    "remove all traces of messages sent to instances of aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   333
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   334
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   335
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   336
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   337
    ^ self untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   338
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   339
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   340
!MessageTracer class methodsFor:'class wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   341
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   342
wrapClass:orgClass selector:aSelector onEntry:entryBlock onExit:exitBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   343
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   344
     aSelector is sent to instances of orgClass or subclasses.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   345
     EntryBlock will be called on entry, and get the current context passed as argument.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   346
     ExitBlock will be called, when the method is left, and get context and the methods return value as arguments.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   347
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   348
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
   349
    |myMetaclass trapMethod s spec implClass newClass dict|
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   350
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   351
    WrappedMethod autoload.     "/ just to make sure ...
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   352
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   353
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   354
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   355
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   356
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   357
    spec := Parser methodSpecificationForSelector:aSelector.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   358
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   359
    s := WriteStream on:''.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   360
    s nextPutAll:spec.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   361
    s cr.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
   362
    s nextPutAll:'<context: #return>'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   363
    s nextPutAll:'|retVal stubClass|'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   364
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   365
        s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   366
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   367
    s nextPutAll:('retVal := #originalMethod. ').    "/ just to get a literal to be replaced by theoriginal method
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   368
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   369
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   370
        s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   371
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   372
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   373
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   374
    ParserFlags
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   375
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   376
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   377
            Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   378
                trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   379
                                compile:s contents
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   380
                                forClass:orgClass
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   381
                                inCategory:'trapping'
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   382
                                notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   383
                                install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   384
                                skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   385
                                silent:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   386
            ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   387
        ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   388
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   389
    implClass := orgClass whichClassIncludesSelector:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   390
    implClass isNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   391
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   392
    ] ifFalse:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   393
        trapMethod changeLiteral:#originalMethod to:(implClass compiledMethodAt:aSelector).
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   394
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   395
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   396
        trapMethod changeLiteral:#literal1 to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   397
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   398
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   399
        trapMethod changeLiteral:#literal2 to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   400
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   401
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   402
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   403
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   404
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   405
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   406
    trapMethod source:'this is a wrapper method - not the real one'.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   407
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   408
    trapMethod register.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   409
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   410
    dict := orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   411
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   412
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   413
     if not already trapping, create a new class
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   414
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   415
    orgClass category == #'* trapping *' ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   416
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   417
        orgClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   418
        newClass := orgClass superclass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   419
    ] ifFalse:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   420
        myMetaclass := orgClass class.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   421
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   422
        newClass := myMetaclass copy new.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   423
        newClass setSuperclass:orgClass superclass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   424
        newClass instSize:orgClass instSize.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   425
        newClass flags:orgClass flags.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   426
        newClass setClassVariableString:orgClass classVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   427
        newClass setSharedPoolNames:(orgClass sharedPoolNames).
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   428
        newClass setInstanceVariableString:orgClass instanceVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   429
        newClass setName:orgClass name.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   430
        newClass setCategory:orgClass category.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   431
        newClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   432
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   433
        orgClass setSuperclass:newClass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   434
        orgClass setClassVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   435
        orgClass setInstanceVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   436
        orgClass setCategory:#'* trapping *'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   437
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   438
        dict := MethodDictionary new:1.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   439
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   440
        orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   441
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   442
    trapMethod changeLiteral:(newClass superclass) to:newClass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   443
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   444
    ObjectMemory flushCaches.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   445
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   446
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   447
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   448
                wrapClass:Point
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   449
                 selector:#scaleBy:
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   450
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   451
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   452
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   453
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   454
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   455
                           ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   456
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   457
     MessageTracer untrapClass:Point selector:#scaleBy:.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   458
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   459
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   460
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   461
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   462
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   463
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   464
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   465
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   466
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   467
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   468
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   469
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   470
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   471
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   472
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   473
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   474
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   475
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   476
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   477
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   478
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   479
     |lvl|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   480
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   481
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   482
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   483
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   484
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   485
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   486
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   487
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   488
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   489
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   490
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   491
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   492
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   493
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   494
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   495
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   496
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   497
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   498
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   499
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   500
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
   501
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   502
    "Modified: / 25-06-1996 / 22:01:05 / stefan"
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   503
    "Modified: / 01-07-2011 / 10:01:59 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   504
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   505
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   506
!MessageTracer class methodsFor:'cleanup'!
27
claus
parents: 26
diff changeset
   507
claus
parents: 26
diff changeset
   508
cleanup
claus
parents: 26
diff changeset
   509
    "if you forgot which classes/methods where wrapped and/or trapped,
claus
parents: 26
diff changeset
   510
     this cleans up everything ..."
claus
parents: 26
diff changeset
   511
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   512
    ObjectCopyHolders := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   513
    MethodCounts := MethodMemoryUsage := MethodTiming := TimeForWrappers := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   514
27
claus
parents: 26
diff changeset
   515
    self untrapAllClasses.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   516
    self unwrapAllMethods.
27
claus
parents: 26
diff changeset
   517
claus
parents: 26
diff changeset
   518
    "
claus
parents: 26
diff changeset
   519
     MessageTracer cleanup
claus
parents: 26
diff changeset
   520
    "
claus
parents: 26
diff changeset
   521
! !
claus
parents: 26
diff changeset
   522
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
   523
!MessageTracer class methodsFor:'execution trace'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   524
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   525
debugTrace:aBlock
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   526
    "trace execution of aBlock. This is for system debugging only;
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   527
     The trace output is a low level trace generated in the VM."
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   528
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   529
    ObjectMemory sendTraceOn.
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
   530
    ^ aBlock ensure:[ObjectMemory sendTraceOff]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   531
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   532
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   533
     MessageTracer debugTrace:[#(6 5 4 3 2 1) sort]
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   534
    "
196
330cc5c849de debugOn/Off is now called sendTraceOn/Off
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   535
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   536
    "Modified: / 31.7.1998 / 16:39:43 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   537
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   538
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   539
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   540
    "evaluate aBlock sending trace information to stdout.
27
claus
parents: 26
diff changeset
   541
     Return the value of the block."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   542
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
   543
     ^ self trace:aBlock on:Processor activeProcess stderr
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   544
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   545
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   546
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   547
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   548
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   549
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   550
trace:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   551
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   552
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   553
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   554
    ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   555
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   556
	trace:aBlock detail:false.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   557
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   558
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   559
     MessageTracer trace:[#(6 5 4 3 2 1) sort] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   560
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   561
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   562
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   563
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   564
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   565
     Return the value of the block.
27
claus
parents: 26
diff changeset
   566
     The trace information is more detailed."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   567
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
   568
     ^ self traceFull:aBlock on:Processor activeProcess stderr
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   569
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   570
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   571
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   572
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   573
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   574
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   575
traceFull:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   576
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   577
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   578
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   579
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   580
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   581
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   582
	trace:aBlock detail:true.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   583
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   584
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   585
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   586
    "
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   587
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   588
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   589
traceFullIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   590
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   591
     Return the value of the block.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   592
     The trace information is more detailed."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   593
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
   594
     ^ self traceFullIndented:aBlock on:Processor activeProcess stderr
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   595
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   596
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   597
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   598
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   599
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   600
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   601
traceFullIndented:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   602
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   603
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   604
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   605
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   606
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   607
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   608
	trace:aBlock detail:#fullIndent.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   609
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   610
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   611
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   612
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   613
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   614
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   615
traceIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   616
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   617
     Return the value of the block."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   618
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
   619
     ^ self traceIndented:aBlock on:Processor activeProcess stderr
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   620
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   621
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   622
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   623
    "
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   624
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   625
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   626
traceIndented:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   627
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   628
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   629
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   630
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   631
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   632
	trace:aBlock detail:#indent.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   633
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   634
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   635
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   636
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   637
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   638
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   639
!MessageTracer class methodsFor:'method breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   640
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   641
trapClass:aClass selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   642
    "arrange for the debugger to be entered when a message with aSelector is
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   643
     sent to instances of aClass (or subclass instances). Use untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   644
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   645
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   646
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   647
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   648
    self trapMethod:(aClass compiledMethodAt:aSelector)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   649
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   650
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   651
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   652
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   653
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   654
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   655
     MessageTracer untrapClass:Collection
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   656
    "
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   657
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   658
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   659
trapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   660
    "arrange for the debugger to be entered when aMethod is about to be executed.
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
   661
     The trap is enabled for any process - see #trapMethod:inProcess: for a more
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   662
     selective breakPoint.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   663
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   664
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   665
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   666
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   667
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   668
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   669
	      onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   670
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   671
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   672
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   673
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   674
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   675
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   676
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   677
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   678
    "
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   679
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   680
    "Modified: 22.10.1996 / 17:39:58 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   681
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   682
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   683
trapMethod:aMethod after:countInvocations
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   684
    "arrange for the debugger to be entered when aMethod has been invoked countInvocations times.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   685
     The trap is enabled for any process.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   686
     Use unwrapMethod or untrapClass to remove this trap.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   687
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   688
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   689
     entry/leave blocks."
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   690
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   691
    |n|
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   692
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   693
    n := 0.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   694
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   695
	      onEntry:[:con | n := n + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   696
			      n > countInvocations
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   697
			      ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   698
				BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   699
			      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   700
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   701
	       onExit:LeaveBreakBlock.
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   702
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   703
!
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   704
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   705
trapMethod:aMethod forInstancesOf:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   706
    "arrange for the debugger to be entered when aMethod is about to be executed
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   707
     for an instance of aClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   708
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   709
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   710
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   711
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   712
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   713
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   714
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   715
			 (con receiver isMemberOf:aClass) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   716
			     BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   717
			 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   718
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   719
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   720
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   721
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   722
     MessageTracer trapMethod:(View compiledMethodAt:#redraw) forInstancesOf:myView.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   723
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   724
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   725
    "Modified: 22.10.1996 / 17:40:03 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   726
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   727
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   728
trapMethod:aMethod if:conditionBlock
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   729
    "arrange for the debugger to be entered when aMethod has been invoked and conditionBlock
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   730
     evaluates to true.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   731
     The trap is enabled for any process.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   732
     Use unwrapMethod or untrapClass to remove this trap.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   733
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   734
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   735
     entry/leave blocks."
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   736
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   737
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   738
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   739
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   740
	    |conditionFires|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   741
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   742
	    Error handle:[:ex |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   743
		'MessageTrace: error in breakpoint condition caught: ' errorPrint.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   744
		ex description errorPrintCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   745
	    ] do:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   746
		conditionBlock numArgs == 1 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   747
		    conditionFires := conditionBlock value:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   748
		] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   749
		    conditionFires := conditionBlock value:con value:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   750
		].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   751
	    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   752
	    conditionFires == true ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   753
		BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   754
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   755
	]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   756
	onExit:LeaveBreakBlock.
2291
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   757
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   758
    "Created: / 18-08-2000 / 22:09:10 / cg"
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   759
    "Modified: / 20-10-2010 / 09:38:57 / cg"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   760
!
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   761
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   762
trapMethod:aMethod inProcess:aProcess
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   763
    "arrange for the debugger to be entered when aMethod is about to be executed,
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
   764
     but only, if executed aProcess or one of aProcess's offspring.
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   765
     This allows for breakpoints to be set on system-critical code.
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
   766
     The trap will only fire for selected processes (making browsers etc. still usable).
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   767
     Use unwrapMethod or untrapClass to remove this trap.
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   768
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   769
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   770
     entry/leave blocks."
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   771
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   772
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   773
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   774
			(Processor activeProcess processGroupId = aProcess id) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   775
			    BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   776
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   777
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   778
	       onExit:LeaveBreakBlock.
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   779
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   780
    "Created: 14.10.1996 / 15:38:46 / cg"
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   781
    "Modified: 22.10.1996 / 17:40:06 / cg"
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   782
!
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   783
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   784
untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   785
    "remove any traps on any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   786
970
116aa95d7b97 allBehaviors vs. allClasses
Claus Gittinger <cg@exept.de>
parents: 957
diff changeset
   787
    Smalltalk allClassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   788
	self untrapClass:aClass
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   789
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   790
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   791
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   792
     MessageTracer untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   793
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   794
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   795
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   796
untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   797
    "remove any traps on aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   798
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   799
    "this is done by just patching the class back to the original"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   800
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   801
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   802
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   803
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   804
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   805
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   806
    orgClass := aClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   807
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   808
    aClass setSuperclass:orgClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   809
    aClass setClassVariableString:orgClass classVariableString.
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   810
    aClass setSharedPoolNames:(orgClass sharedPoolNames).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   811
    aClass setInstanceVariableString:orgClass instanceVariableString.
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
   812
    aClass setCategory:orgClass category.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   813
    aClass methodDictionary:orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   814
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   815
    ObjectMemory flushCaches.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   816
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   817
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   818
     MessageTracer untrapClass:Point
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   819
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   820
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   821
    "Modified: / 05-06-1996 / 13:57:39 / stefan"
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   822
    "Modified: / 18-01-2011 / 20:43:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   823
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   824
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   825
untrapClass:aClass selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   826
    "remove trap of aSelector sent to aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   827
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   828
    |dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   829
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   830
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   831
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   832
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   833
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   834
    dict := aClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   835
    dict at:aSelector ifAbsent:[^ self].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   836
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   837
    ObjectMemory flushCaches. "avoid calling the old trap method"
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   838
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   839
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   840
	"the last trapped method"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   841
	^ self untrapClass:aClass
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   842
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   843
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   844
    aClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   845
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   846
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   847
     MessageTracer trapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   848
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   849
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   850
     MessageTracer trapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   851
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   852
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   853
     MessageTracer untrapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   854
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   855
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   856
     MessageTracer untrapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   857
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   858
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   859
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   860
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   861
    "Modified: 5.6.1996 / 14:00:55 / stefan"
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   862
    "Modified: 10.9.1996 / 20:06:29 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   863
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   864
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   865
untrapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   866
    "remove break on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   867
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   868
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   869
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   870
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   871
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   872
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   873
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   874
!MessageTracer class methodsFor:'method breakpointing - new'!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   875
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   876
breakMethod: method atLine: line
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   877
    "Installs new breakpoint in given method at given line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   878
     Returns the installed breakpoint or nil if none could be
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   879
     installed"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   880
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   881
    | analyzer map lines i breakpoint table |
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   882
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   883
    (ConfigurableFeatures includesFeature: #VMBreakpointSupport) ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   884
	self error: 'Breakpoint support not present'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   885
	^nil.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   886
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   887
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   888
    analyzer := BreakpointAnalyzer parseMethodSilent: method source in: method mclass.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   889
    map := analyzer messageSendMap.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   890
    lines := map keys asSortedCollection.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   891
    i := lines indexForInserting: line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   892
    i > lines size ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   893
	^nil
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   894
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   895
    breakpoint := Breakpoint new line: (lines at: i).
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   896
    breakpoint breaksToIgnore: (((map at: breakpoint line) size - 1) max: 0).
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   897
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   898
    table := method breakpointTable.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   899
    table isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   900
	"/old way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   901
	"/table := Array with: (breakpoint line) with: breakpoint.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   902
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   903
	"/new way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   904
	table := Array with: breakpoint.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   905
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   906
	"/old way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   907
	"/table := table, (Array with: (breakpoint line) with: breakpoint).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   908
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   909
	"/new way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   910
	table := table copyWith: breakpoint
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   911
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   912
    method breakpointTable: table.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   913
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   914
    ^breakpoint
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   915
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   916
    "Created: / 16-04-2013 / 00:25:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   917
    "Modified: / 24-04-2013 / 19:40:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   918
! !
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   919
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   920
!MessageTracer class methodsFor:'method counting'!
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   921
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   922
countMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   923
    "arrange for a aMethod's execution to be counted.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   924
     Use unwrapMethod to remove this."
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   925
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   926
    MethodCounts isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   927
	MethodCounts := IdentityDictionary new.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   928
    ].
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   929
    MethodCounts at:aMethod put:0.
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   930
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   931
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   932
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   933
			|cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   934
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   935
			cnt := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   936
			MethodCounts at:aMethod put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   937
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   938
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   939
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   940
	 onExit:nil
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   941
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   942
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   943
     MessageTracer countMethod:(Integer compiledMethodAt:#factorial).
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   944
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   945
     MessageTracer executionCountOf:(Integer compiledMethodAt:#factorial) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   946
     MessageTracer stopCountingMethod:(Integer compiledMethodAt:#factorial)
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   947
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   948
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   949
    "Created: / 15.12.1995 / 10:57:49 / cg"
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   950
    "Modified: / 27.7.1998 / 10:47:46 / cg"
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   951
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   952
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   953
countMethodByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   954
    "arrange for a aMethod's execution to be counted and maintain
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   955
     a per-receiver class profile.
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   956
     Use unwrapMethod to remove this."
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   957
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   958
    MethodCountsPerReceiverClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   959
	MethodCountsPerReceiverClass := IdentityDictionary new.
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   960
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   961
    MethodCountsPerReceiverClass at:aMethod put:(IdentityDictionary new).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   962
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   963
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   964
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   965
			|cls perMethodCounts cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   966
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   967
			cls := (con receiver class).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   968
			perMethodCounts := MethodCountsPerReceiverClass at:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   969
			cnt := perMethodCounts at:cls ifAbsentPut:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   970
			perMethodCounts at:cls put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   971
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   972
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   973
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   974
	 onExit:nil
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   975
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   976
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   977
     MessageTracer countMethodWithReceiverStatistic:(Collection compiledMethodAt:#detect:).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   978
     NewSystemBrowser open.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   979
     MessageTracer executionCountsOf:(Collection compiledMethodAt:#detect:) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   980
     MessageTracer stopCountingMethod:(Collection compiledMethodAt:#detect:)
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   981
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   982
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   983
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   984
executionCountOfMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   985
    "return the current count"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   986
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   987
    |count counts|
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   988
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   989
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   990
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   991
	    count := MethodCounts at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   992
	    count notNil ifTrue:[^ count].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   993
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   994
	^ MethodCounts at:aMethod ifAbsent:0
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   995
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   996
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   997
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   998
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   999
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1000
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1001
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1002
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1003
	^ (counts collect:[:eachClassCountAssoc | eachClassCountAssoc value]) sum
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1004
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1005
    ^ 0
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1006
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1007
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1008
executionCountsByReceiverClassOfMethod:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1009
    "return a collection mapping receiver class to call counts"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1010
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1011
    |counts|
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1012
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1013
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1014
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1015
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1016
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1017
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1018
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1019
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1020
	^ counts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1021
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1022
    ^ #()
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1023
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1024
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1025
resetCountOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1026
    "return the current count"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1027
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1028
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1029
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1030
	    MethodCounts at:aMethod originalMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1031
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1032
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1033
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1034
    "Created: / 30.7.1998 / 17:42:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1035
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1036
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1037
stopCountingMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1038
    "remove counting of aMethod"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1039
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1040
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1041
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1042
	    MethodCounts removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1043
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1044
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1045
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1046
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1047
	    MethodCountsPerReceiverClass removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1048
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1049
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1050
    ^ self unwrapMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1051
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1052
    "Modified: 15.12.1995 / 15:43:53 / cg"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1053
! !
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1054
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1055
!MessageTracer class methodsFor:'method memory usage'!
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1056
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1057
countMemoryUsageOfMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1058
    "arrange for aMethod's memory usage to be counted.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1059
     Use unwrapMethod to remove this."
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1060
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  1061
    |oldPriority oldScavengeCount oldNewUsed|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1062
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1063
    MethodCounts isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1064
        MethodCounts := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1065
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1066
    MethodMemoryUsage isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1067
        MethodMemoryUsage := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1068
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1069
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1070
    MethodCounts at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1071
    MethodMemoryUsage at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1072
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1073
    ^ self wrapMethod:aMethod
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1074
         onEntry:[:con |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1075
                        oldPriority := Processor activeProcess changePriority:(Processor userInterruptPriority).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1076
                        oldNewUsed := ObjectMemory newSpaceUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1077
                        oldScavengeCount := ObjectMemory scavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1078
                 ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1079
         onExit:[:con :retVal |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1080
             |cnt memUse scavenges|
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1081
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1082
             memUse := ObjectMemory newSpaceUsed - oldNewUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1083
             scavenges := ObjectMemory scavengeCount - oldScavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1084
             scavenges ~~ 0 ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1085
                memUse := memUse + (ObjectMemory newSpaceSize * scavenges)
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1086
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1087
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1088
             MethodCounts notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1089
                 cnt := MethodCounts at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1090
                 MethodCounts at:aMethod put:(cnt + 1).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1091
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1092
             MethodMemoryUsage notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1093
                 cnt := MethodMemoryUsage at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1094
                 MethodMemoryUsage at:aMethod put:(cnt + memUse).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1095
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1096
             Processor activeProcess priority:oldPriority.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1097
             MessageTracer changed:#statistics: with:aMethod.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1098
             aMethod changed:#statistics.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1099
             retVal
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1100
         ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1101
         onUnwind:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1102
             oldPriority notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1103
                 Processor activeProcess priority:oldPriority
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1104
             ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1105
         ]
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1106
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1107
    "
2825
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1108
     MessageTracer countMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR).
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1109
     3 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1110
     Transcript showCR:(MessageTracer memoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1111
     MessageTracer stopCountingMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1112
    "
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1113
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1114
    "Created: / 18.12.1995 / 15:41:27 / stefan"
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1115
    "Modified: / 18.12.1995 / 21:46:48 / stefan"
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1116
    "Modified: / 27.7.1998 / 10:47:38 / cg"
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1117
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1118
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1119
isCountingMemoryUsage:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1120
    "return true if aMethod is counting memoryUsage"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1121
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1122
    MethodMemoryUsage isNil ifTrue:[^ false].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1123
    (MethodMemoryUsage includesKey:aMethod) ifTrue:[^ true].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1124
    aMethod isWrapped ifTrue:[
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  1125
	^ MethodMemoryUsage includesKey:aMethod originalMethod
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1126
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1127
    ^ false
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1128
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1129
    "Created: 18.12.1995 / 15:51:49 / stefan"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1130
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1131
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1132
memoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1133
    "return the current count"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1134
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1135
    |count memUse orgMethod|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1136
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1137
    (MethodCounts isNil or:[MethodMemoryUsage isNil]) ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1138
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1139
	orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1140
	count := MethodCounts at:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1141
	memUse := MethodMemoryUsage at:orgMethod ifAbsent:nil.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1142
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1143
    memUse isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1144
	count := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1145
	memUse := MethodMemoryUsage at:aMethod ifAbsent:0.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1146
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1147
    count = 0 ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1148
    ^ memUse//count
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1149
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1150
    "Modified: 18.12.1995 / 16:25:51 / stefan"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1151
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1152
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1153
resetMemoryUsageOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1154
    "reset the current usage"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1155
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1156
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1157
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1158
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1159
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1160
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1161
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1162
		MethodCounts at:orgMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1163
		MethodMemoryUsage at:orgMethod put:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1164
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1165
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1166
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1167
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1168
    "Created: / 30.7.1998 / 17:43:07 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1169
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1170
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1171
stopCountingMemoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1172
    "remove counting memory of aMethod"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1173
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1174
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1175
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1176
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1177
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1178
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1179
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1180
		MethodCounts removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1181
		MethodMemoryUsage removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1182
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1183
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1184
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1185
    ^ self unwrapMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1186
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1187
    "Modified: 18.12.1995 / 21:54:36 / stefan"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1188
! !
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1189
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1190
!MessageTracer class methodsFor:'method mocking'!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1191
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1192
mock: selector in: class do: block
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1193
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1194
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1195
    method := class compiledMethodAt: selector ifAbsent: [ self error:'No such mnethod' ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1196
    ^ self mockMethod: method do: block
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1197
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1198
    "Created: / 28-07-2014 / 23:53:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1199
    "Modified: / 29-07-2014 / 09:44:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1200
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1201
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1202
mockMethod: method do: block
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1203
    "Temporarily change the behaviour of the given method to perform the given block instead 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1204
     of the method's code. The value of the block is returned as the method's return value.
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1205
     The behaviour is changed only for current thread, i.e., thread the calling this methood
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1206
     and its child threads.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1207
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1208
     The block gets the receiver as the first argument, followed by method parameters
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1209
     and then - optionally - the original method object.
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1210
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1211
     Do not forget to 'unmock' by means of #unmockMethod: or #unmockAllMethods
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1212
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1213
     CAVEAT: The 'current thread and its child threads' detection is done by walking
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1214
             threads along their #creatorId. However, when the parent thread dies, 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1215
             the link if broken and thus 'and its child threads' may not work 100%. 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1216
             For the calling thread itself, mocking should work reliably.
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1217
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1218
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1219
    | selector class trapMethod spec src dict sel saveUS xselector|
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1220
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1221
    CallingLevel := 0.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1222
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1223
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1224
     create a new method, which calls the original one,
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1225
     but only if not already being trapped.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1226
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1227
    (method isNil or:[method isWrapped]) ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1228
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1229
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1230
    method isLazyMethod ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1231
        method makeRealMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1232
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1233
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1234
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1235
     get class/selector
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1236
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1237
    class := method containingClass.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1238
    class isNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1239
        self error:'cannot place trap (no containing class found)' mayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1240
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1241
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1242
    selector := class selectorAtMethod:method.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1243
    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1244
    WrappedMethod autoload. "/ for small systems
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1245
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1246
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1247
     get a new method-spec
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1248
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1249
    xselector := '_x'.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1250
    method numArgs timesRepeat:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1251
        xselector := xselector , '_:'
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1252
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1253
    spec := Parser methodSpecificationForSelector:xselector.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1254
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1255
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1256
     create a method, executing the trap-blocks and the original method via a direct call
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1257
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1258
    src := '%(spec)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1259
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1260
    <context: #return>
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1261
    | currentProcess mock mockedVal context args marker | 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1262
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1263
    context := thisContext.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1264
    currentProcess := Processor activeProcess.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1265
    mock := false.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1266
    marker := #mockedMethodMarker yourself.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1267
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1268
    [ mock not and:[currentProcess notNil] ] whileTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1269
        mock := currentProcess id = %(pid).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1270
        currentProcess := ProcessorScheduler knownProcesses detect:[:p | p id = currentProcess creatorId ] ifNone:[ nil ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1271
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1272
    mock ifTrue:[ 
3793
95cb401a7536 Fixes in #mockMethod:do: - correctly pass receiver and original method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3733
diff changeset
  1273
        mockedVal := #replacementBlock yourself valueWithOptionalArguments: (((Array with: context receiver) , (context args)) copyWith: #originalMethod)
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1274
    ] ifFalse:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1275
        mockedVal := #originalMethod yourself
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1276
                        valueWithReceiver:(context receiver)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1277
                        arguments:(context args)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1278
                        selector:(context selector)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1279
                        search:(context searchClass)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1280
                        sender:nil.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1281
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1282
    ^  mockedVal'.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1283
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1284
    src := src expandPlaceholdersWith:
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1285
        (Dictionary new
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1286
            at: 'spec' put: spec;
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1287
            at: 'pid' put: Processor activeProcess id;
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1288
            yourself).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1289
        
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1290
    saveUS := Compiler allowUnderscoreInIdentifier.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1291
    ParserFlags
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1292
        withSTCCompilation:#never
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1293
        do:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1294
            [
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1295
                Compiler allowUnderscoreInIdentifier:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1296
                Class withoutUpdatingChangesDo:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1297
                    trapMethod := Compiler
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1298
                                    compile:src
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1299
                                    forClass:UndefinedObject
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1300
                                    inCategory:method category
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1301
                                    notifying:nil
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1302
                                    install:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1303
                                    skipIfSame:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1304
                                    silent:false. "/ true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1305
                ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1306
            ] ensure:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1307
                Compiler allowUnderscoreInIdentifier:saveUS.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1308
            ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1309
        ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1310
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1311
    trapMethod setPackage:method package.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1312
    trapMethod changeClassTo:WrappedMethod.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1313
    trapMethod register.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1314
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1315
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1316
     raising our eyebrows here ...
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1317
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1318
    block notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1319
        trapMethod changeLiteral:#replacementBlock to: block.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1320
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1321
    trapMethod changeLiteral:#originalMethod to:method.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1322
    trapMethod changeLiteral:#mockedMethodMarker to: MockedMethodMarker.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1323
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1324
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1325
     change the source of this new method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1326
     (to avoid confusion in the debugger ...)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1327
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1328
    trapMethod source: src.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1329
"/    trapMethod sourceFilename:(method getSource) position:(method getSourcePosition).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1330
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1331
    dict := class methodDictionary.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1332
    sel := dict at:selector ifAbsent:[0].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1333
    sel == 0 ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1334
        self error:'oops, unexpected error' mayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1335
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1336
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1337
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1338
    dict at:selector put:trapMethod.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1339
    class methodDictionary:dict.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1340
    ObjectMemory flushCaches.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1341
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1342
    class changed:#methodTrap with:selector. "/ tell browsers
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1343
    MethodTrapChangeNotificationParameter notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1344
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1345
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1346
    ^ trapMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1347
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1348
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1349
     MessageTracer
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1350
                mockMethod:(Color class compiledMethodAt:#magenta)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1351
                do: [ :color |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1352
                    Color red
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1353
                ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1354
     Color magenta.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1355
     [ [ Color magenta inspect ] fork. Delay waitForSeconds: 1. ] fork.
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1356
     (Color class compiledMethodAt:#magenta) isMocked.
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1357
     MessageTracer unwrapMethod:(Color class compiledMethodAt:#magenta).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1358
     Color magenta.    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1359
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1360
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1361
    "Created: / 29-07-2014 / 09:44:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3793
95cb401a7536 Fixes in #mockMethod:do: - correctly pass receiver and original method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3733
diff changeset
  1362
    "Modified: / 18-02-2015 / 15:25:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1363
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1364
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1365
unmock: selector in: class 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1366
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1367
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1368
    method := class compiledMethodAt: selector ifAbsent: [ self error:'No such mnethod' ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1369
    ^ self unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1370
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1371
    "Created: / 29-07-2014 / 10:02:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1372
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1373
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1374
unmockAllMethods
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1375
    "Remove mocking wrapper from all methods, unconditionally. 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1376
     May (should) be called in tearDdown of each testcase that
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1377
     uses method mocking"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1378
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1379
    WrappedMethod allInstancesDo:[:method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1380
        method isMocked ifTrue:[    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1381
            method unregister.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1382
            self unwrapMethod: method.  
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1383
        ]        
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1384
    ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1385
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1386
    "Created: / 29-07-2014 / 10:12:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1387
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1388
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1389
unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1390
    "Remove mocking wrapper from a method, if it has been mocked by
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1391
     #mockMethod:do:"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1392
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1393
    method isMocked ifTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1394
        self unwrapMethod: method  
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1395
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1396
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1397
    "Created: / 29-07-2014 / 09:45:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1398
! !
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1399
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1400
!MessageTracer class methodsFor:'method profiling'!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1401
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1402
spyMethod:aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1403
    "arrange for given method to collect profiling data
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1404
     using message tally profiler.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1405
     Use unwrapMethod to remove this.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1406
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1407
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1408
    self spyMethod: aMethod interval: MessageTally normalSamplingIntervalMS
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1409
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1410
    "Created: / 01-02-2015 / 09:02:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1411
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1412
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1413
spyMethod:aMethod interval: anInteger
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1414
    "arrange for given method to collect profiling data
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1415
     using message tally profiler.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1416
     Use unwrapMethod to remove this.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1417
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1418
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1419
    |selector class trapMethod s spec src dict sel saveUS xselector info |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1420
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1421
    CallingLevel := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1422
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1423
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1424
     create a new method, which calls the original one,
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1425
     but only if not already being trapped.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1426
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1427
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1428
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1429
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1430
    aMethod isLazyMethod ifTrue:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1431
        aMethod makeRealMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1432
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1433
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1434
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1435
     get class/selector
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1436
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1437
    class := aMethod containingClass.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1438
    class isNil ifTrue:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1439
        self error:'cannot place trap (no containing class found)' mayProceed:true.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1440
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1441
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1442
    selector := class selectorAtMethod:aMethod.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1443
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1444
    WrappedMethod autoload. "/ for small systems
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1445
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1446
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1447
     get a new method-spec
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1448
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1449
    xselector := '_x'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1450
    aMethod numArgs timesRepeat:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1451
        xselector := xselector , '_:'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1452
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1453
    spec := Parser methodSpecificationForSelector:xselector.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1454
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1455
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1456
    info := MethodSpyInfo new.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1457
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1458
     create a method, executing the trap-blocks and the original method via a direct call
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1459
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  1460
    s := WriteStream on:''.
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1461
    s nextPutAll:spec.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1462
    s nextPutAll:' <context: #return>'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1463
    s nextPutAll:' |retVal context| '.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1464
    s nextPutAll:' context := thisContext.'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1465
    s nextPutAll: '#info profiler: (Tools::Profiler ? MessageTally) new.';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1466
      nextPutAll: '#info profiler spyOn: [';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1467
      nextPutAll:'retVal := #originalMethod yourself';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1468
      nextPutAll:             ' valueWithReceiver:(context receiver)';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1469
      nextPutAll:             ' arguments:(context args)';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1470
      nextPutAll:             ' selector:(context selector)';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1471
      nextPutAll:             ' search:(context searchClass)';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1472
      nextPutAll:             ' sender:nil. ';
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1473
      nextPutAll:'] interval:'; nextPutAll: anInteger printString; nextPutAll: '.'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1474
    s nextPutAll:'^ retVal'; cr.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1475
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1476
    src := s contents.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1477
    saveUS := Compiler allowUnderscoreInIdentifier.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1478
    ParserFlags
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1479
        withSTCCompilation:#never
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1480
        do:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1481
            [
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1482
                Compiler allowUnderscoreInIdentifier:true.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1483
                Class withoutUpdatingChangesDo:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1484
                    trapMethod := Compiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1485
                                    compile:src
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1486
                                    forClass:UndefinedObject
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1487
                                    inCategory:aMethod category
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1488
                                    notifying:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1489
                                    install:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1490
                                    skipIfSame:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1491
                                    silent:false. "/ true.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1492
                ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1493
            ] ensure:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1494
                Compiler allowUnderscoreInIdentifier:saveUS.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1495
            ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1496
        ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1497
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1498
    trapMethod setPackage:aMethod package.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1499
    trapMethod changeClassTo:WrappedMethod.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1500
    trapMethod register.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1501
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1502
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1503
     raising our eyebrows here ...
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1504
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1505
    trapMethod changeLiteral:#info to: info. 
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1506
    trapMethod changeLiteral:#originalMethod to:aMethod.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1507
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1508
     change the source of this new method
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1509
     (to avoid confusion in the debugger ...)
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1510
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1511
"/    trapMethod source:'this is a wrapper method - not the real one'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1512
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1513
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1514
    dict := class methodDictionary.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1515
    sel := dict at:selector ifAbsent:[0].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1516
    sel == 0 ifTrue:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1517
        self error:'oops, unexpected error' mayProceed:true.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1518
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1519
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1520
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1521
    dict at:selector put:trapMethod.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1522
    class methodDictionary:dict.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1523
    ObjectMemory flushCaches.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1524
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1525
    class changed:#methodTrap with:selector. "/ tell browsers
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1526
    MethodTrapChangeNotificationParameter notNil ifTrue:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1527
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1528
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1529
    ^ trapMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1530
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1531
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1532
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1533
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1534
                   onEntry:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1535
                    onExit:[:con :retVal |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1536
                               Transcript show:'leave Point>>scaleBy:; returning:'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1537
                               Transcript showCR:retVal printString.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1538
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1539
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1540
     (1@2) scaleBy:5.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1541
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1542
     (1@2) scaleBy:5.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1543
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1544
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1545
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1546
                wrapMethod:(Integer compiledMethodAt:#factorial)
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1547
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1548
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1549
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1550
                    onExit:[:con :retVal |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1551
                               Transcript show:'leave Integer>>factorial; returning:'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1552
                               Transcript showCR:retVal printString.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1553
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1554
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1555
     Transcript showCR:'5 factorial traced'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1556
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1557
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1558
     Transcript showCR:'5 factorial normal'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1559
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1560
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1561
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1562
     |lvl|
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1563
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1564
     lvl := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1565
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1566
                wrapMethod:(Integer compiledMethodAt:#factorial)
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1567
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1568
                               Transcript spaces:lvl. lvl := lvl + 2.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1569
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1570
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1571
                    onExit:[:con :retVal |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1572
                               lvl := lvl - 2. Transcript spaces:lvl.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1573
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1574
                               Transcript showCR:retVal printString.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1575
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1576
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1577
     Transcript showCR:'5 factorial traced'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1578
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1579
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1580
     Transcript showCR:'5 factorial normal'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1581
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1582
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1583
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1584
    "Created: / 01-02-2015 / 09:22:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1585
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1586
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1587
!MessageTracer class methodsFor:'method timing'!
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1588
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1589
executionTimesOfMethod:aMethod
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1590
    "return the current gathered execution time statistics"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1591
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1592
    |info|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1593
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1594
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1595
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1596
	    info := ( MethodTiming at:(aMethod originalMethod) ifAbsent:nil ) copy.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1597
	].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1598
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1599
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1600
    info isNil ifTrue:[ info := MethodTimingInfo new ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1601
    ^ info
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1602
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1603
    "Created: / 17-06-1996 / 17:07:30 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1604
    "Modified: / 05-03-2007 / 15:46:17 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1605
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1606
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1607
resetExecutionTimesOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1608
    "reset the gathered execution times statistics for aMethod;
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1609
     the method remains wrapped."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1610
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1611
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1612
	MethodTiming removeKey:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1613
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1614
	    MethodTiming removeKey:aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1615
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1616
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1617
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1618
    "Created: / 30-07-1998 / 17:12:35 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1619
    "Modified: / 05-03-2007 / 15:36:59 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1620
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1621
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1622
stopTimingMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1623
    "remove timing of aMethod"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1624
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1625
    ^ self unwrapMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1626
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1627
    "Modified: 15.12.1995 / 15:43:53 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1628
    "Created: 17.6.1996 / 17:04:03 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1629
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1630
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1631
timeMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1632
    "arrange for a aMethod's execution time to be measured.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1633
     Use unwrapMethod: or stopTimingMethod: to remove this."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1634
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1635
    |t0|
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1636
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1637
    MethodTiming isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1638
	MethodTiming := IdentityDictionary new.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1639
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1640
    MethodTiming removeKey:aMethod ifAbsent:nil.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1641
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1642
    TimeForWrappers isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1643
	self getTimeForWrappers
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1644
    ].
693
cd020921a251 use microsecond resolution in method timing
Claus Gittinger <cg@exept.de>
parents: 691
diff changeset
  1645
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1646
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1647
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1648
			t0 := OperatingSystem getMicrosecondTime.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1649
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1650
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1651
			|info t cnt minT maxT sumTimes|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1652
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1653
			t := OperatingSystem getMicrosecondTime - t0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1654
			t := t - TimeForWrappers.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1655
			t < 0 ifTrue:[t := 0].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1656
			t := t / 1000.0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1657
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1658
			MethodTiming isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1659
			    MethodTiming := IdentityDictionary new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1660
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1661
			info := MethodTiming at:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1662
			info isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1663
			    MethodTiming at:aMethod put:(info := MethodTimingInfo new)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1664
			] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1665
			    info rememberExecutionTime:t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1666
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1667
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1668
			aMethod changed:#statistics.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1669
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1670
		]
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1671
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1672
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1673
     MessageTracer timeMethod:(Integer compiledMethodAt:#factorial).
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1674
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1675
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1676
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1677
     (MessageTracer executionTimesOfMethod:(Integer compiledMethodAt:#factorial)) printCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1678
     MessageTracer stopTimingMethod:(Integer compiledMethodAt:#factorial)
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1679
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1680
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1681
    "Created: / 17-06-1996 / 17:03:50 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1682
    "Modified: / 05-03-2007 / 15:34:01 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1683
! !
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1684
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1685
!MessageTracer class methodsFor:'method tracing'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1686
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1687
traceClass:aClass selector:aSelector
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1688
    "arrange for a trace message to be output on Stderr, when a message with aSelector is
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1689
     sent to instances of aClass (or subclass instances). Use untraceClass to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1690
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  1691
    self traceClass:aClass selector:aSelector on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1692
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1693
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1694
     MessageTracer traceClass:Integer selector:#factorial.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1695
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1696
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1697
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1698
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1699
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1700
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1701
     MessageTracer untraceClass:SequenceableCollection
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1702
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1703
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1704
     MessageTracer traceClass:Array selector:#at:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1705
     MessageTracer traceClass:Array selector:#at:put:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1706
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1707
     MessageTracer untraceClass:Array
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1708
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1709
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1710
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1711
traceClass:aClass selector:aSelector on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1712
    "arrange for a trace message to be output on aStream, when a message with aSelector is
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1713
     sent to instances of aClass (or subclass instances). Use untraceClass to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1714
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1715
    self traceMethod:(aClass compiledMethodAt:aSelector) on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1716
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1717
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1718
     MessageTracer traceClass:Integer selector:#factorial on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1719
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1720
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1721
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1722
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1723
     MessageTracer traceClass:Integer selector:#factorialR on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1724
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1725
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1726
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1727
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1728
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1729
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1730
traceMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1731
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1732
     when aMethod is executed. Traces both entry and exit.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1733
     Use unwrapMethod to remove this."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1734
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  1735
    ^ self traceMethod:aMethod on:Processor activeProcess stderr
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1736
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1737
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1738
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1739
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1740
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1741
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1742
    "
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1743
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1744
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1745
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1746
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1747
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1748
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1749
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1750
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1751
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1752
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1753
     dont do this:
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1754
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1755
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1756
     MessageTracer traceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1757
     MessageTracer traceMethod:(Object compiledMethodAt:#at:put:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1758
     #(6 1 9 66 2 17) copy sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1759
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1760
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:put:).
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1761
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1762
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1763
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1764
traceMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1765
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1766
     when aMethod is executed. Traces both entry and exit.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1767
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1768
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1769
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1770
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1771
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1772
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1773
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1774
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1775
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1776
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1777
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1778
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1779
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1780
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1781
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1782
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1783
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1784
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1785
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1786
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1787
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1788
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1789
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1790
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1791
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1792
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1793
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1794
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1795
		]
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1796
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1797
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1798
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1799
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1800
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1801
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1802
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1803
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1804
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1805
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1806
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1807
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1808
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1809
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1810
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1811
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1812
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1813
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1814
traceMethodAll:aMethod
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1815
    "arrange for a full trace message to be output on Stderr, when aMethod is executed.
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1816
     Only the sender is traced on entry.
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1817
     Use untraceMethod to remove this trace.
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1818
     This is for system debugging only;
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1819
     The trace output is a low level trace generated in the VM."
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1820
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1821
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1822
	      onEntry:[:con | ObjectMemory flushCaches. ObjectMemory sendTraceOn.]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1823
	      onExit:[:con :retVal | ObjectMemory sendTraceOff. retVal]
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1824
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1825
    "Modified: / 31.7.1998 / 16:40:07 / cg"
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1826
!
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1827
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1828
traceMethodEntry:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1829
    "arrange for a trace message to be output on stdErr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1830
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1831
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1832
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  1833
    ^ self traceMethodEntry:aMethod on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1834
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1835
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1836
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1837
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1838
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1839
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1840
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1841
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1842
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1843
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1844
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1845
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1846
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1847
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1848
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1849
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1850
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1851
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1852
traceMethodEntry:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1853
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1854
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1855
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1856
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1857
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1858
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1859
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1860
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1861
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1862
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1863
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1864
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1865
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1866
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1867
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1868
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1869
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1870
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1871
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1872
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1873
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1874
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1875
	 onExit:nil
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1876
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1877
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1878
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1879
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1880
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1881
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1882
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1883
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1884
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1885
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1886
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1887
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1888
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1889
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1890
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1891
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1892
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1893
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1894
traceMethodFull:aMethod
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1895
    "arrange for a full trace message to be output on Stderr, when amethod is executed.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1896
     Only the sender is traced on entry.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1897
     Use untraceMethod to remove this trace."
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1898
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  1899
    ^ self traceMethodFull:aMethod on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1900
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1901
    "Created: 15.12.1995 / 18:19:31 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1902
    "Modified: 22.10.1996 / 17:39:28 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1903
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1904
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1905
traceMethodFull:aMethod on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1906
    "arrange for a full trace message to be output on Stderr, when aMethod is executed.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1907
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1908
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1909
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1910
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1911
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1912
	onEntry:(self traceFullBlockFor:aStream)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1913
	onExit:LeaveTraceBlock.
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1914
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1915
    "Created: 15.12.1995 / 18:19:31 / cg"
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1916
    "Modified: 22.10.1996 / 17:39:28 / cg"
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1917
!
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1918
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1919
traceMethodSender:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1920
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1921
     when amethod is executed.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1922
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1923
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1924
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  1925
    ^ self traceMethodSender:aMethod on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1926
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1927
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1928
traceMethodSender:aMethod on:aStream
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1929
    "arrange for a trace message to be output on Stderr, when amethod is executed.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1930
     Only the sender is traced on entry.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1931
     Use untraceMethod to remove this trace."
35
claus
parents: 31
diff changeset
  1932
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1933
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1934
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1935
	onEntry:(self traceSenderBlockFor:aStream)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1936
	onExit:LeaveTraceBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1937
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1938
    "Modified: 22.10.1996 / 17:39:33 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1939
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1940
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1941
traceUpdateMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1942
    "arrange for a trace message to be output on aStream,
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1943
     when aMethod is executed.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1944
     Traces both entry and exit.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1945
     Use unwrapMethod to remove this.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1946
     This one is specialized for change-update calling i.e. it traces from the update
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1947
     back to the origial change message."
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1948
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1949
    |lvl inside|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1950
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1951
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1952
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1953
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1954
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1955
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1956
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1957
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1958
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1959
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1960
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1961
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1962
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1963
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1964
			    MessageTracer printUpdateEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1965
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1966
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1967
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1968
	onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1969
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1970
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1971
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1972
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1973
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1974
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1975
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1976
		]
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1977
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1978
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1979
tracelogMethod:aMethod
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1980
    "arrange for a trace log entry to be appended to a standard log using
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1981
     Logger, when aMethod is executed. Traces both entry and exit.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1982
     Use unwrapMethod to remove this."
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1983
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1984
    |lvl inside|
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1985
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1986
    ^ self wrapMethod:aMethod
3627
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1987
         onEntry:[:con |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1988
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1989
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1990
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1991
                            CallingLevel isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1992
                                CallingLevel := 0.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1993
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1994
                            lvl notNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1995
                                lvl := lvl + 1
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1996
                            ] ifFalse:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1997
                                CallingLevel := lvl := CallingLevel + 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1998
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1999
                            msg := String streamContents:[:s|MessageTracer printEntryFull:con level:lvl on:s].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2000
                            Logger log: msg severity: Logger severityENTER attachment: con args.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2001
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2002
                        ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2003
                 ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2004
         onExit:[:con :retVal |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2005
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2006
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2007
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2008
                            msg := String streamContents:[:s|MessageTracer printExit:con with:retVal level:lvl on:s].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2009
                            Logger log: msg severity: Logger severityLEAVE attachment: retVal.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2010
                            CallingLevel := lvl := lvl - 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2011
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2012
                        ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2013
                        retVal
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2014
                ]
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2015
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2016
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2017
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2018
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2019
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2020
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2021
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2022
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2023
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2024
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2025
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2026
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2027
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2028
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2029
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2030
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2031
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2032
    "Created: / 15-03-2013 / 11:04:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3627
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2033
    "Modified: / 03-10-2014 / 15:00:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2034
!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2035
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2036
untraceMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2037
    "remove tracing of aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2038
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2039
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2040
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2041
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2042
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2043
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2044
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2045
!MessageTracer class methodsFor:'method wrapping'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2046
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2047
unwrapAllMethods
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2048
    "just in case you dont know what methods have break/trace-points
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2049
     on them; this removes them all"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2050
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2051
    WrappedMethod allInstancesDo:[:aWrapperMethod |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2052
	aWrapperMethod unregister.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2053
	self unwrapMethod:aWrapperMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2054
    ]
1145
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2055
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2056
    "
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2057
     MessageTracer unwrapAllMethods
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2058
    "
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2059
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2060
    "Modified: / 01-07-2011 / 10:02:47 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2061
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2062
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2063
unwrapMethod:aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2064
    "remove any wrapper on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2065
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2066
    |selector class originalMethod dict mthd|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2067
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2068
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2069
	originalMethod := aMethod originalMethod.
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2070
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2071
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2072
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2073
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2074
	    MethodCounts removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2075
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2076
	MethodCounts removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2077
	MethodCounts := MethodCounts asNilIfEmpty.
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2078
    ].
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2079
    MethodMemoryUsage notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2080
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2081
	    MethodMemoryUsage removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2082
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2083
	MethodMemoryUsage removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2084
	MethodMemoryUsage := MethodMemoryUsage asNilIfEmpty.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2085
    ].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2086
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2087
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2088
	    MethodTiming removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2089
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2090
	MethodTiming removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2091
	MethodTiming := MethodTiming asNilIfEmpty.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2092
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2093
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2094
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2095
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2096
    (aMethod isNil or:[aMethod isWrapped not]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2097
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2098
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2099
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2100
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2101
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2102
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2103
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2104
    class isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2105
	'MessageTracer [info]: no containing class for method found' infoPrintCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2106
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2107
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2108
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2109
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2110
    originalMethod isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2111
	self error:'oops, could not find original method' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2112
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2113
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2114
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2115
    dict := class methodDictionary.
506
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2116
    mthd := dict at:selector ifAbsent:nil.
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2117
    mthd notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2118
	dict at:selector put:originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2119
	class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2120
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2121
	'MessageTracer [info]: no containing class for method found' infoPrintCR.
667
62df9b9b7664 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 666
diff changeset
  2122
"/        self halt:'oops, unexpected error - cannot remove wrap'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2123
	aMethod becomeSameAs:originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2124
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2125
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2126
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2127
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2128
584
2da6bb2c8017 send out change notifications when a trap is removed
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
  2129
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2130
    MethodTrapChangeNotificationParameter notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2131
	Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2132
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2133
    ^ originalMethod
265
f3fb9bec2d4a printNL -> printCR
Claus Gittinger <cg@exept.de>
parents: 258
diff changeset
  2134
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  2135
    "Modified: / 05-06-1996 / 14:08:08 / stefan"
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2136
    "Modified: / 04-10-2007 / 16:41:01 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2137
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2138
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2139
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2140
    ^ self wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock onUnwind:nil
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2141
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2142
    "Modified: 18.12.1995 / 15:58:12 / stefan"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2143
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2144
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2145
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock onUnwind:unwindBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2146
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2147
     aMethod is evaluated.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2148
     EntryBlock will be called on entry, and gets the current context passed as argument.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2149
     ExitBlock will be called, when the method is left, and gets the context and
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2150
     the methods return value as arguments.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2151
     UnwindBlock will be called when the contxt of aMethod is unwound.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2152
     If there is an unwindBlock, the entry and exitBlocks will be called within the unwind block,
572
5b57c4c128af comment
Claus Gittinger <cg@exept.de>
parents: 555
diff changeset
  2153
     because allocating the unwindBlock uses memory and some users want to count allocated memory.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2154
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2155
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2156
    |selector class trapMethod s spec src dict sel saveUS xselector|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2157
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2158
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2159
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2160
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2161
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2162
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2163
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2164
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2165
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2166
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2167
    aMethod isLazyMethod ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2168
        aMethod makeRealMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2169
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2170
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2171
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2172
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2173
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2174
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2175
    class isNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2176
        self error:'cannot place trap (no containing class found)' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2177
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2178
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2179
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2180
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2181
    WrappedMethod autoload. "/ for small systems
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2182
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2183
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2184
     get a new method-spec
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2185
    "
730
635af002b783 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 729
diff changeset
  2186
    xselector := '_x'.
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2187
    aMethod numArgs timesRepeat:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2188
        xselector := xselector , '_:'
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2189
    ].
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2190
    spec := Parser methodSpecificationForSelector:xselector.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2191
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2192
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2193
     create a method, executing the trap-blocks and the original method via a direct call
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2194
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2195
    s := WriteStream on:''.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2196
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  2197
    s nextPutAll:' <context: #return>'.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2198
    s nextPutAll:' |retVal context| '.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2199
    s nextPutAll:' context := thisContext.'.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2200
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2201
        s nextPutAll:'['.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2202
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2203
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2204
        s nextPutAll:'#entryBlock yourself value:context. '.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2205
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2206
    s nextPutAll:'retVal := #originalMethod yourself';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2207
      nextPutAll:             ' valueWithReceiver:(context receiver)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2208
      nextPutAll:             ' arguments:(context args)';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2209
      nextPutAll:             ' selector:(context selector)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2210
      nextPutAll:             ' search:(context searchClass)';
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2211
      nextPutAll:             ' sender:nil. '.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2212
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2213
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2214
        s nextPutAll:'^ #exitBlock yourself value:context value:retVal.'.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2215
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2216
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2217
        s nextPutAll:'] ifCurtailed:#unwindBlock yourself.'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2218
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2219
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2220
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2221
    src := s contents.
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2222
    saveUS := Compiler allowUnderscoreInIdentifier.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2223
    ParserFlags
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2224
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2225
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2226
            [
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2227
                Compiler allowUnderscoreInIdentifier:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2228
                Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2229
                    trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2230
                                    compile:src
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2231
                                    forClass:UndefinedObject
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2232
                                    inCategory:aMethod category
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2233
                                    notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2234
                                    install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2235
                                    skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2236
                                    silent:false. "/ true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2237
                ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2238
            ] ensure:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2239
                Compiler allowUnderscoreInIdentifier:saveUS.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2240
            ].
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2241
        ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2242
955
0516771efa2a preserve a methods packageID when wrapping
Claus Gittinger <cg@exept.de>
parents: 950
diff changeset
  2243
    trapMethod setPackage:aMethod package.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2244
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2245
    trapMethod register.
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2246
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2247
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2248
     raising our eyebrows here ...
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2249
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2250
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2251
        trapMethod changeLiteral:#entryBlock to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2252
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
  2253
    trapMethod changeLiteral:#originalMethod to:aMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2254
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2255
        trapMethod changeLiteral:#exitBlock to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2256
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2257
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2258
        trapMethod changeLiteral:#unwindBlock to:unwindBlock.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2259
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2260
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2261
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2262
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2263
    "
840
5ec82d6c2e55 care for the wrappers source info (to allow source access in browser)
Claus Gittinger <cg@exept.de>
parents: 825
diff changeset
  2264
"/    trapMethod source:'this is a wrapper method - not the real one'.
5ec82d6c2e55 care for the wrappers source info (to allow source access in browser)
Claus Gittinger <cg@exept.de>
parents: 825
diff changeset
  2265
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2266
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2267
    dict := class methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2268
    sel := dict at:selector ifAbsent:[0].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2269
    sel == 0 ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2270
        self error:'oops, unexpected error' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2271
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2272
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2273
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2274
    dict at:selector put:trapMethod.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2275
    class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2276
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2277
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2278
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2279
    MethodTrapChangeNotificationParameter notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2280
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2281
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2282
    ^ trapMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2283
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2284
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2285
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2286
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2287
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2288
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2289
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2290
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2291
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2292
                           ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2293
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2294
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2295
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2296
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2297
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2298
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2299
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2300
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2301
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2302
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2303
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2304
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2305
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2306
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2307
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2308
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2309
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2310
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2311
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2312
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2313
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2314
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2315
     |lvl|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2316
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2317
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2318
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2319
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2320
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2321
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2322
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2323
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2324
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2325
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2326
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2327
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2328
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2329
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2330
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2331
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2332
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2333
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2334
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2335
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  2336
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2337
    "Modified: / 25-06-1996 / 22:04:51 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2338
    "Modified: / 01-07-2011 / 10:01:48 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2339
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2340
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2341
!MessageTracer class methodsFor:'object breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2342
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2343
objectHasWraps:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2344
    "return true, if anObject has any wraps"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2345
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2346
    ^ anObject class category == #'* trapping *'
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2347
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2348
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2349
realClassOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2350
    "return anObjects real class"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2351
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2352
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2353
	^ anObject class
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2354
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2355
    ^ anObject class superclass
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2356
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2357
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2358
trap:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2359
    "arrange for the debugger to be entered when a message with aSelector is
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2360
     sent to anObject. Use untrap to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2361
     The current implementation does not allow integers or nil to be trapped."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2362
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2363
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2364
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2365
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2366
	 onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2367
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2368
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2369
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2370
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2371
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2372
     MessageTracer trap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2373
     p x:5
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2374
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2375
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2376
    "Modified: 22.10.1996 / 17:39:41 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2377
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2378
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2379
trap:anObject selectors:aCollection
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2380
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2381
	 selectors:aCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2382
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2383
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2384
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2385
    "Modified: 22.10.1996 / 17:39:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2386
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2387
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2388
trapAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2389
    "trap on all messages which are understood by anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2390
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2391
    self wrapAll:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2392
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2393
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2394
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2395
    "Modified: 22.10.1996 / 17:39:54 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2396
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2397
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2398
trapAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2399
    "trap on all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2400
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2401
    self trap:anObject selectors:aClass selectors
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2402
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2403
    "Modified: 5.6.1996 / 13:46:06 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2404
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2405
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2406
untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2407
    "remove any traps on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2408
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2409
    "this is done by just patching the objects class back to the original"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2410
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2411
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2412
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2413
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2414
    orgClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2415
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2416
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2417
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2418
    anObject changeClassTo:orgClass superclass.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2419
    ObjectCopyHolders notNil ifTrue:[
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2420
	ObjectCopyHolders removeKey:anObject ifAbsent:nil.
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2421
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2422
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2423
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2424
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2425
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2426
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2427
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2428
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2429
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2430
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2431
     MessageTracer untrap:p
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2432
     p y:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2433
     p x:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2434
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2435
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2436
    "Modified: / 21.4.1998 / 15:43:33 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2437
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2438
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2439
untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2440
    "remove trap on aSelector from anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2441
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  2442
    |orgClass dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2443
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2444
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2445
    orgClass category == #'* trapping *' ifFalse:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2446
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2447
    dict := orgClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2448
    dict at:aSelector ifAbsent:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2449
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2450
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2451
	"the last trap got removed"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2452
	anObject changeClassTo:orgClass superclass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2453
	ObjectCopyHolders notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2454
	    ObjectCopyHolders removeKey:anObject ifAbsent:nil.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2455
	].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2456
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2457
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2458
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2459
    orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2460
    ObjectMemory flushCaches. "avoid calling the old trap method"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2461
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2462
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2463
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2464
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2465
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2466
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2467
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2468
     'trace both ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2469
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2470
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2471
     'trace only y ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2472
     MessageTracer untrap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2473
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2474
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2475
     'trace none ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2476
     MessageTracer untrap:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2477
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2478
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2479
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2480
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2481
    "Modified: / 5.6.1996 / 13:56:08 / stefan"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2482
    "Modified: / 21.4.1998 / 15:43:55 / cg"
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2483
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2484
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2485
wrappedSelectorsOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2486
    "return the set of wrapped selectors (if any)"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2487
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2488
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2489
	^ #()
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2490
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2491
    ^ anObject class selectors
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2492
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2493
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2494
!MessageTracer class methodsFor:'object modification traps'!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2495
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2496
trapModificationsIn:anObject
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2497
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2498
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2499
    self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2500
	trapModificationsIn:anObject filter:[:old :new | true]
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2501
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2502
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2503
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2504
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2505
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2506
     MessageTracer trapModificationsIn:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2507
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2508
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2509
     a at:1.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2510
     a at:2 put:nil.   ' no trap here (nil already there) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2511
     a at:2 put:2.     ' expect trap here (changing nil to 2) '.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2512
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2513
     a at:3.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2514
     a at:2 put:2.      ' no trap here (2 already there) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2515
     a at:2 put:3.      ' expect trap here (changing 2 to 3) '.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2516
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2517
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2518
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2519
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2520
    "Created: / 21.4.1998 / 14:32:34 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2521
    "Modified: / 21.4.1998 / 14:58:24 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2522
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2523
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2524
trapModificationsIn:anObject filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2525
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2526
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2527
    |allSelectors|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2528
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2529
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2530
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2531
	aClass methodDictionary keys addAllTo:allSelectors
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2532
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2533
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2534
    self trapModificationsIn:anObject selectors:allSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2535
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2536
    "trap if arrays 5th slot is modified:
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2537
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2538
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2539
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2540
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2541
     MessageTracer trapModificationsIn:a filter:[:old :new | (old at:5) ~~ (new at:5)].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2542
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2543
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2544
     a at:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2545
     a at:2 put:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2546
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2547
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2548
     a at:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2549
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2550
     a at:2 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2551
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2552
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2553
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2554
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2555
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2556
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2557
    "Modified: / 21.4.1998 / 15:53:38 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2558
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2559
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2560
trapModificationsIn:anObject selector:aSelector filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2561
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2562
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2563
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2564
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2565
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2566
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2567
	trapModificationsIn:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2568
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2569
	filter:aFilterBlock
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2570
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2571
    "Modified: / 21.4.1998 / 15:34:44 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2572
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2573
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2574
trapModificationsIn:anObject selectors:aCollectionOfSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2575
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2576
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2577
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2578
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2579
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2580
    |copyHolder sels checkBlock|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2581
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2582
    (anObject isNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2583
	or:[anObject isSymbol
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2584
	or:[anObject class == SmallInteger
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2585
	or:[anObject == true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2586
	or:[anObject == false]]]])
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2587
    ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2588
	self error:'cannot place trap on this object' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2589
	^ self.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2590
    ].
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2591
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2592
    ObjectCopyHolders isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2593
	ObjectCopyHolders := WeakIdentityDictionary new.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2594
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2595
    copyHolder := ObjectCopyHolders at:anObject ifAbsent:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2596
    copyHolder isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2597
	ObjectCopyHolders at:anObject put:(copyHolder := ValueHolder new).
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2598
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2599
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2600
    copyHolder value:(anObject shallowCopy).
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2601
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2602
    "/ some required ones, which are used in the wrapped code and are known to
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2603
    "/ do no harm to the object ... consider this a kludge
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2604
    sels := aCollectionOfSelectors copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2605
    sels removeAll:#(#class #species #yourself #'sameContentsAs:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2606
		     #'instVarAt:' #'at:' #'basicAt:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2607
		     #'shallowCopy' #'copy'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2608
		     #'=' #'==' #'~=' #'~~'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2609
		     #'size'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2610
		    ).
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2611
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2612
    checkBlock :=
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2613
		   [:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2614
			|oldValue|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2615
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2616
			oldValue :=  copyHolder value.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2617
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2618
			"/ compare with copy ...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2619
			(anObject sameContentsAs:oldValue) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2620
			    "/ see oldValue vs. anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2621
			    (aFilterBlock value:oldValue value:anObject) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2622
				copyHolder value:(anObject shallowCopy).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2623
				ObjectWrittenBreakpointSignal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2624
				    raiseRequestWith:(oldValue -> anObject)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2625
				    errorString:('object was modififed in: ' , con sender selector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2626
				    in:con sender
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2627
			    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2628
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2629
		   ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2630
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2631
    sels do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2632
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2633
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2634
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2635
	    onEntry:[:con | ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2636
	    onExit:checkBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2637
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2638
	    flushCaches:false.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2639
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2640
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2641
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2642
    "Created: / 21.4.1998 / 15:34:05 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2643
    "Modified: / 21.4.1998 / 16:00:39 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2644
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2645
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2646
trapModificationsOf:anInstVarOrOffset in:anObject
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2647
    "trap modifications in anObject"
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2648
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2649
    |idx selectors definingClass|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2650
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2651
    anInstVarOrOffset isInteger ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2652
	"/ indexed slot
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2653
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2654
	    trapModificationsIn:anObject filter:[:old :new | (old at:anInstVarOrOffset) ~~ (new at:anInstVarOrOffset)]
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2655
   ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2656
	"/ instVar by name
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2657
	selectors := IdentitySet new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2658
	definingClass := anObject class whichClassDefinesInstVar:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2659
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2660
	definingClass withAllSuperclassesDo:[:aClass |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2661
	    aClass methodDictionary keys addAllTo:selectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2662
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2663
	idx := anObject class instVarIndexFor:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2664
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2665
	    trapModificationsIn:anObject selectors:selectors filter:[:old :new | (old instVarAt:idx) ~~ (new instVarAt:idx)]
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2666
   ]
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2667
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2668
    "
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2669
     |a|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2670
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2671
     a := Array new:10.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2672
     MessageTracer trapModificationsOf:2 in:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2673
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2674
     a size.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2675
     a at:1.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2676
     a at:2 put:nil.   ' no trap here (nil already there) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2677
     a at:2 put:2.     ' expect trap here (changing nil to 2) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2678
     a at:2.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2679
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2680
     a at:2 put:2.      ' no trap here (2 already there) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2681
     a at:2 put:3.      ' expect trap here (changing nil to 2) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2682
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2683
     a at:3 put:3.      ' no trap here (index is different) '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2684
     MessageTracer untrace:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2685
     a at:3 put:5.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2686
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2687
! !
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2688
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2689
!MessageTracer class methodsFor:'object tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2690
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2691
trace:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2692
    "arrange for a trace message to be output on Stderr, when a message with
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2693
     aSelector is sent to anObject. Both entry and exit are traced.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2694
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2695
     The current implementation does not allow integers or nil to be traced."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2696
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2697
    self trace:anObject selector:aSelector on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2698
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2699
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2700
     |p|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  2701
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2702
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2703
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2704
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2705
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2706
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2707
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2708
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2709
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2710
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2711
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2712
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2713
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2714
     MessageTracer trace:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2715
     MessageTracer trace:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2716
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2717
    "
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  2718
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2719
    "Modified: / 21.4.1998 / 15:37:05 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2720
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2721
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2722
trace:anObject selector:aSelector on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2723
    "arrange for a trace message to be output on Stderr, when a message with
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2724
     aSelector is sent to anObject. Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2725
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2726
     The current implementation does not allow integers or nil to be traced."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2727
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2728
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2729
	trace:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2730
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2731
	on:aStream
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2732
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2733
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2734
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2735
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2736
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2737
     MessageTracer trace:p selector:#x: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2738
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2739
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2740
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2741
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2742
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2743
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2744
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2745
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2746
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2747
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2748
     MessageTracer trace:a selector:#at:put: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2749
     MessageTracer trace:a selector:#at:.    on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2750
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2751
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2752
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2753
    "Modified: / 21.4.1998 / 15:37:05 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2754
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2755
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2756
trace:anObject selectors:aCollectionOfSelectors
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2757
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2758
     from aCollectionOfSelectors is sent to anObject.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2759
     Both entry and exit are traced.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2760
     Use untrap:/untrace: to remove this trace.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2761
     The current implementation does not allow integers or nil to be traced."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2762
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2763
    self trace:anObject selectors:aCollectionOfSelectors on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2764
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2765
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2766
     |p|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2767
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2768
     p := Point new.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2769
     MessageTracer trace:p selector:#x:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2770
     p x:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2771
     p y:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2772
     p x:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2773
     MessageTracer untrap:p.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2774
     p x:7
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2775
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2776
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2777
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2778
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2779
     a := #(6 1 9 66 2 17) copy.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2780
     MessageTracer trace:a selector:#at:put:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2781
     MessageTracer trace:a selector:#at:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2782
     a sort.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2783
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2784
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2785
    "Modified: / 21.4.1998 / 15:41:57 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2786
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2787
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2788
trace:anObject selectors:aCollectionOfSelectors on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2789
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2790
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2791
     Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2792
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2793
     The current implementation does not allow integers or nil to be traced."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2794
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2795
    aCollectionOfSelectors do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2796
	|methodName|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2797
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2798
	methodName := anObject class name , '>>' , aSelector.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2799
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2800
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2801
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2802
	    onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2803
			aStream nextPutAll:'enter '; nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2804
			aStream nextPutAll:' receiver='.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2805
			con receiver printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2806
			aStream nextPutAll:' args='. (con args) printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2807
			aStream nextPutAll:' from:'. con sender printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2808
			aStream cr; flush
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2809
		    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2810
	    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2811
			aStream nextPutAll:'leave '; nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2812
			aStream nextPutAll:' receiver='. con receiver printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2813
			aStream nextPutAll:' returning:'. retVal printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2814
			aStream cr; flush
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2815
		   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2816
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2817
	    flushCaches:false
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2818
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2819
    ObjectMemory flushCaches
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2820
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2821
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2822
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2823
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2824
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2825
     MessageTracer trace:p selectors:#(x:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2826
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2827
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2828
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2829
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2830
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2831
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2832
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2833
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2834
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2835
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2836
     MessageTracer trace:a selectors:#( at:put: at:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2837
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2838
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2839
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2840
    "Modified: / 21.4.1998 / 15:41:57 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2841
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2842
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2843
traceAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2844
    "trace all messages which are understood by anObject"
27
claus
parents: 26
diff changeset
  2845
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2846
    self traceAll:anObject on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2847
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2848
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2849
     trace all (implemented) messages sent to Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2850
     (other messages lead to an error, anyway)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2851
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2852
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2853
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2854
     MessageTracer traceAll:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2855
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2856
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2857
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2858
    "Modified: 5.6.1996 / 13:43:51 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2859
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2860
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2861
traceAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2862
    "trace all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2863
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2864
    self traceAll:anObject from:aClass on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2865
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2866
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2867
     trace all methods in Display, which are implemented
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2868
     in the DisplayWorkstation class.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2869
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2870
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2871
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2872
     MessageTracer traceAll:Display from:XWorkstation
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2873
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2874
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2875
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2876
    "Modified: 5.6.1996 / 13:45:37 / stefan"
27
claus
parents: 26
diff changeset
  2877
!
claus
parents: 26
diff changeset
  2878
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2879
traceAll:anObject from:aClass on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2880
    "trace all messages defined in aClass sent to anObject"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2881
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2882
    self trace:anObject selectors:aClass selectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2883
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2884
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2885
     trace all methods in Display, which are implemented
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2886
     in the DisplayWorkstation class.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2887
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2888
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2889
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2890
     MessageTracer traceAll:Display from:XWorkstation on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2891
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2892
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2893
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2894
    "Modified: 5.6.1996 / 13:45:37 / stefan"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2895
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2896
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2897
traceAll:anObject on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2898
    "trace all messages which are understood by anObject"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2899
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2900
    |allSelectors|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2901
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2902
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2903
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2904
	aClass methodDictionary keys addAllTo:allSelectors
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2905
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2906
    self trace:anObject selectors:allSelectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2907
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2908
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2909
     trace all (implemented) messages sent to Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2910
     (other messages lead to an error, anyway)
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2911
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2912
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2913
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2914
     MessageTracer traceAll:Display on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2915
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2916
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2917
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2918
    "Modified: 5.6.1996 / 13:43:51 / stefan"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2919
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2920
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2921
traceEntry:anObject selectors:aCollectionOfSelectors on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2922
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2923
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2924
     Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2925
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2926
     The current implementation does not allow integers or nil to be traced."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2927
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2928
    self
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2929
        traceEntry:anObject selectors:aCollectionOfSelectors on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2930
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2931
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2932
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2933
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2934
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2935
     MessageTracer traceEntry:p selectors:#(x:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2936
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2937
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2938
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2939
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2940
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2941
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2942
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2943
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2944
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2945
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2946
     MessageTracer traceEntry:a selectors:#( at:put: at:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2947
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2948
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2949
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2950
    "Modified: / 21.4.1998 / 15:41:57 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2951
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2952
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2953
traceSender:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2954
    "arrange for a trace message to be output on Stderr, when a message with
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2955
     aSelector is sent to anObject. Only the sender is traced on entry.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2956
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2957
     The current implementation does not allow integers or nil to be traced."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2958
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  2959
    ^ self traceSender:anObject selector:aSelector on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2960
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2961
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2962
     |p|
27
claus
parents: 26
diff changeset
  2963
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2964
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2965
     MessageTracer traceSender:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2966
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2967
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2968
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2969
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2970
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2971
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2972
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2973
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2974
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2975
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2976
     MessageTracer traceSender:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2977
     MessageTracer traceSender:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2978
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2979
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2980
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  2981
    "Modified: 10.1.1997 / 17:54:53 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2982
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2983
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2984
traceSender:anObject selector:aSelector on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2985
    "arrange for a trace message to be output on Stderr, when a message with
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2986
     aSelector is sent to anObject. Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2987
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2988
     The current implementation does not allow integers or nil to be traced."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2989
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2990
    |methodName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2991
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2992
    methodName := anObject class name , '>>' , aSelector.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2993
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2994
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2995
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2996
		     aStream nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2997
		     aStream nextPutAll:' from '.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2998
		     con sender printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2999
		     aStream cr; flush.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3000
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3001
	 onExit:LeaveTraceBlock.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3002
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3003
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3004
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3005
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3006
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3007
     MessageTracer traceSender:p selector:#x: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3008
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3009
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3010
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3011
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3012
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3013
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3014
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3015
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3016
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3017
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3018
     MessageTracer traceSender:a selector:#at:put: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3019
     MessageTracer traceSender:a selector:#at:.    on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3020
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3021
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3022
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3023
    "Modified: 10.1.1997 / 17:54:53 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3024
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3025
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3026
untrace:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3027
    "remove any traces on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3028
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3029
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3030
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3031
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3032
    ^ self untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3033
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3034
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3035
untrace:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3036
    "remove traces of aSelector sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3037
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3038
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3039
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3040
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3041
    ^ self untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3042
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3043
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3044
!MessageTracer class methodsFor:'object wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3045
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3046
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3047
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3048
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3049
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3050
     when the method is left, and get the context and the methods return value as arguments.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3051
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3052
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3053
    "I have not yet enough experience, if the wrapped original method should
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3054
     run as an instance of the original, or of the catching class;
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3055
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3056
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3057
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3058
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3059
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3060
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3061
	wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3062
	selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3063
	onEntry:entryBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3064
	onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3065
	withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3066
	flushCaches:true
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3067
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3068
    "Modified: / 21.4.1998 / 15:29:50 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3069
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3070
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3071
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock additionalEntryCode:additionalEntryCode additionalExitCode:additionalExitCode  additionalVariables:additionalVariables withOriginalClass:withOriginalClass flushCaches:flushCaches
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3072
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3073
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3074
     entry, and get the current context passed as argument. ExitBlock will be called,
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3075
     when the method is left, and get the current context and the methods return value as argument.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3076
     If withOriginalClass is true, the class of anObject will be set to its original class
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3077
     before the wrapped method will be called.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3078
     NOTICE: The current implementation does not allow integers or nil to be wrapped."
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3079
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3080
    |newClass orgClass myMetaclass trapMethod s spec implClass dict
955
0516771efa2a preserve a methods packageID when wrapping
Claus Gittinger <cg@exept.de>
parents: 950
diff changeset
  3081
     originalMethod|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3082
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3083
    "
27
claus
parents: 26
diff changeset
  3084
     some are not allowed (otherwise we get into trouble ...)
claus
parents: 26
diff changeset
  3085
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3086
    (aSelector == #class
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3087
    or:[aSelector == #changeClassTo:]) ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3088
        Transcript showCR:'sorry, cannot place trap on: ' , aSelector.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3089
        ^ self
27
claus
parents: 26
diff changeset
  3090
    ].
claus
parents: 26
diff changeset
  3091
claus
parents: 26
diff changeset
  3092
    WrappedMethod autoload.     "/ just to make sure ...
claus
parents: 26
diff changeset
  3093
claus
parents: 26
diff changeset
  3094
    "
3393
943250332a24 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3347
diff changeset
  3095
     create a new (anonymous) subclass of the receiver's class
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3096
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3097
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3098
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  3099
    orgClass category == #'* trapping *' ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3100
        newClass := orgClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3101
    ] ifFalse:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3102
        myMetaclass := orgClass class.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3103
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3104
        newClass := myMetaclass copy new.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3105
        newClass setSuperclass:orgClass.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3106
        newClass instSize:orgClass instSize.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3107
        newClass flags:orgClass flags.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3108
        newClass isMeta ifFalse:[newClass setClassVariableString:''].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3109
        newClass setInstanceVariableString:''.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3110
        newClass setName:orgClass name.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3111
        newClass setCategory:#'* trapping *'.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3112
        newClass methodDictionary:MethodDictionary new.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3113
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3114
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3115
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3116
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3117
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3118
    spec := Parser methodSpecificationForSelector:aSelector.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  3119
    s := WriteStream on:''.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3120
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  3121
    s nextPutAll:' <context: #return>'.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3122
    s nextPutAll:' |retVal stubClass '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3123
    additionalVariables notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3124
        s nextPutAll:additionalVariables.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3125
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3126
    s nextPutAll:'| '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3127
    withOriginalClass ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3128
        s nextPutAll:'stubClass := self class. '.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3129
        s nextPutAll:'self changeClassTo:(stubClass superclass). '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3130
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3131
    additionalEntryCode notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3132
        s nextPutAll:additionalEntryCode.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3133
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3134
    entryBlock notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3135
        s nextPutAll:'#literal1 yourself value:thisContext. '.               "/ #literal1 will be replaced by the entryBlock
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3136
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3137
    s nextPutAll:('retVal := #originalMethod. ').                            "/ just to get a place for the originalMethod
27
claus
parents: 26
diff changeset
  3138
    s nextPutAll:('retVal := super ' , spec , '. ').
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3139
    exitBlock notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3140
        s nextPutAll:'#literal2 yourself value:thisContext value:retVal. '.  "/ #literal2 will be replaced by the exitBlock
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3141
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3142
    additionalExitCode notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3143
        s nextPutAll:additionalExitCode.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3144
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3145
    withOriginalClass ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3146
        s nextPutAll:'self changeClassTo:stubClass. '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3147
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3148
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3149
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3150
    ParserFlags
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3151
        withSTCCompilation:#never
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3152
        do:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3153
            Class withoutUpdatingChangesDo:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3154
                [
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3155
                    trapMethod := Compiler
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3156
                                    compile:s contents
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3157
                                    forClass:newClass
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3158
                                    inCategory:'breakpointed'
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3159
                                    notifying:nil
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3160
                                    install:false
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3161
                                    skipIfSame:false
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3162
                                    silent:true.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3163
                ] on: ParseError do:[:ex |
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3164
                    "/ Sigh, compiler used to return #Error but now raises
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3165
                    "/ a ParseError. Simulate old behaviour
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3166
                    trapMethod := #Error
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3167
                ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3168
            ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3169
        ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3170
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3171
    trapMethod == #Error ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3172
        Transcript showCR:('cannot place trap on method: ' , aSelector).
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3173
        ^ self
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3174
    ].
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3175
29
claus
parents: 27
diff changeset
  3176
    implClass := orgClass whichClassIncludesSelector:aSelector.
claus
parents: 27
diff changeset
  3177
    implClass isNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3178
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
29
claus
parents: 27
diff changeset
  3179
    ] ifFalse:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3180
        originalMethod := (implClass compiledMethodAt:aSelector).
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3181
        originalMethod notNil ifTrue:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3182
            trapMethod setPackage:originalMethod package.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3183
        ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3184
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3185
        trapMethod changeLiteral:#originalMethod to:originalMethod.
29
claus
parents: 27
diff changeset
  3186
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3187
    entryBlock notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3188
        trapMethod changeLiteral:#literal1 to:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3189
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3190
    exitBlock notNil ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3191
        trapMethod changeLiteral:#literal2 to:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3192
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3193
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3194
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3195
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3196
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3197
    trapMethod source:'this is a wrapper method - not the real one'.
27
claus
parents: 26
diff changeset
  3198
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3199
    trapMethod register.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3200
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3201
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3202
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3203
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3204
    dict := newClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3205
    dict := dict at:aSelector putOrAppend:trapMethod.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3206
    flushCaches ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3207
        newClass methodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3208
    ] ifFalse:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3209
        newClass setMethodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3210
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3211
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3212
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3213
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3214
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3215
    newClass ~~ orgClass ifTrue:[
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3216
        anObject changeClassTo:newClass
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3217
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3218
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3219
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3220
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3221
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3222
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3223
     p := Point new copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3224
     MessageTracer
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3225
                wrap:p
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3226
            selector:#y:
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3227
             onEntry:nil
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3228
              onExit:[:context :retVal |
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3229
                         Transcript show:'leave Point>>y:, returning:'.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3230
                         Transcript showCR:retVal printString.
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3231
                         Transcript endEntry
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3232
                     ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3233
               withOriginalClass:true.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3234
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3235
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3236
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3237
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3238
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3239
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3240
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3241
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3242
     p y:1.
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3243
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3244
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3245
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3246
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3247
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3248
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3249
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3250
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3251
     MessageTracer wrap:p
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3252
               selector:#y:
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3253
                onEntry:[:context | self halt:'y: you are trapped']
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3254
                 onExit:nil
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3255
                  withOriginalClass:false.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3256
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3257
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3258
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3259
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3260
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3261
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3262
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3263
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3264
     p y:1.
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3265
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3266
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  3267
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3268
    "Modified: / 25-06-1996 / 22:11:21 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3269
    "Created: / 21-04-1998 / 15:30:27 / cg"
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3270
    "Modified: / 29-07-2014 / 11:58:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3271
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3272
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3273
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock withOriginalClass:withOriginalClass flushCaches:flushCaches
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3274
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3275
     a message with aSelector is sent to anObject. EntryBlock will be called on
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3276
     entry, and get the current context passed as argument. ExitBlock will be called,
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3277
     when the method is left, and get the current context and the methods return value as argument.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3278
     If withOriginalClass is true, the class of anObject will be set to its original class
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3279
     before the wrapped method will be called.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3280
     NOTICE: The current implementation does not allow integers or nil to be wrapped."
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3281
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3282
    ^ self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3283
	wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3284
	additionalEntryCode:nil additionalExitCode:nil  additionalVariables:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3285
	withOriginalClass:withOriginalClass flushCaches:flushCaches
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3286
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3287
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3288
wrap:anObject selectors:aCollection onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3289
    "install wrappers for anObject on all selectors from aCollection"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3290
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3291
    aCollection do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3292
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3293
	    wrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3294
	    onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3295
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3296
	    flushCaches:false
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3297
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3298
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3299
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3300
    "Modified: / 21.4.1998 / 15:40:28 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3301
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3302
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3303
wrapAll:anObject onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3304
    "install wrappers for anObject on all implemented selectors"
27
claus
parents: 26
diff changeset
  3305
claus
parents: 26
diff changeset
  3306
    |allSelectors|
claus
parents: 26
diff changeset
  3307
claus
parents: 26
diff changeset
  3308
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3309
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3310
	aClass methodDictionary keys addAllTo:allSelectors
27
claus
parents: 26
diff changeset
  3311
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3312
    self wrap:anObject selectors:allSelectors onEntry:entryBlock onExit:exitBlock
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3313
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3314
    "Modified: 5.6.1996 / 14:50:07 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3315
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3316
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3317
!MessageTracer class methodsFor:'queries'!
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3318
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3319
allWrappedMethods
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3320
    ^ WrappedMethod allWrappedMethods. 
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3321
    "/ ^ Smalltalk allMethodsForWhich:[:mthd | mthd isWrapped]
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3322
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3323
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3324
areAnyMethodsWrapped
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3325
    ^ WrappedMethod allWrappedMethods notEmpty.
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3326
"/    Smalltalk allMethodsDo:[:mthd |
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3327
"/        mthd isWrapped ifTrue:[ ^ true ]
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3328
"/    ].
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3329
"/    ^ false
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3330
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3331
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3332
isCounting:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3333
    "return true if aMethod is counted"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3334
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3335
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3336
	(MethodCounts includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3337
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3338
	    (MethodCounts includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3339
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3340
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3341
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3342
	(MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3343
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3344
	    (MethodCountsPerReceiverClass includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3345
	].
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3346
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3347
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3348
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3349
    "Created: 15.12.1995 / 11:07:58 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3350
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3351
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3352
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3353
isCountingByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3354
    "return true if aMethod is counted with per receiver class statistics"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3355
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3356
    MethodCountsPerReceiverClass isNil ifTrue:[^ false].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3357
    (MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3358
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3359
	^ MethodCountsPerReceiverClass includesKey:aMethod originalMethod
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3360
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3361
    ^ false
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3362
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3363
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3364
isMocking:aMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3365
    "Return true if aMethod is mocking"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3366
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3367
    aMethod basicLiterals do:[ :object | object == MockedMethodMarker ifTrue:[ ^ true ] ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3368
    ^ false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3369
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3370
    "Created: / 29-07-2014 / 09:51:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3371
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3372
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3373
isTiming:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3374
    "return true if aMethod is timed"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3375
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3376
    MethodTiming isNil ifTrue:[^ false].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3377
    (MethodTiming includesKey:aMethod) ifTrue:[^ true].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3378
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3379
	^ MethodTiming includesKey:aMethod originalMethod
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3380
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3381
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3382
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3383
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3384
    "Created: 17.6.1996 / 17:04:29 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3385
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3386
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3387
isTrapped:aMethod
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3388
    "return true, if a breakpoint is set on aMethod.
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3389
     This only returns true for standard breakpoints (i.e. for user-wraps,
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3390
     this returns false)"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3391
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3392
    aMethod isWrapped ifFalse:[^ false].
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3393
    ^ aMethod basicLiterals includesIdentical:LeaveBreakBlock
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3394
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3395
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3396
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3397
     Transcript showCR:(Collection compiledMethodAt:#select:) isWrapped.
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3398
     Transcript showCR:(MessageTracer isTrapped:(Collection compiledMethodAt:#select:)).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3399
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3400
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3401
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3402
    "Modified: 22.10.1996 / 17:40:37 / cg"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3403
! !
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3404
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3405
!MessageTracer class methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3406
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3407
dummyEmptyMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3408
    "helper - to get the time it takes to evaluate the wrappers for
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3409
     a dummy method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3410
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3411
    "Created: / 30.7.1998 / 16:58:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3412
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3413
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3414
getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3415
    "helper - get the overhead (in ms) spent in the wrapper code of
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3416
     a timed method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3417
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3418
    |m times|
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3419
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3420
    TimeForWrappers := 0.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3421
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3422
    "/ wrap the dummy method ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3423
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3424
    m := self class compiledMethodAt:#dummyEmptyMethod.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3425
    m := self timeMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3426
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3427
    "/ invoke it a few times ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3428
    "/ (cannot take the smallest, since the work done in the wrapper
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3429
    "/  depends on whether there is already some statistic data)
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3430
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3431
    10 timesRepeat:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3432
	self dummyEmptyMethod.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3433
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3434
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3435
    "/ fetch min time & unwrap
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3436
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3437
    times := self executionTimesOfMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3438
    self stopTimingMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3439
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3440
    ^ (TimeForWrappers := times avgTime)
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3441
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3442
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3443
     self getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3444
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3445
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3446
    "Modified: / 05-03-2007 / 15:44:24 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3447
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3448
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3449
printEntryFull:aContext
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3450
    self printEntryFull:aContext level:0 on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3451
!
27
claus
parents: 26
diff changeset
  3452
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3453
printEntryFull:aContext level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3454
    self printEntryFull:aContext level:lvl on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3455
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3456
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3457
printEntryFull:aContext level:lvl on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3458
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3459
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3460
	nextPutAll:'enter '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3461
    self printFull:aContext on:aStream withSender:true.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3462
!
27
claus
parents: 26
diff changeset
  3463
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3464
printEntryFull:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3465
    self printEntryFull:aContext level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3466
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3467
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3468
printEntrySender:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3469
    |sender mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3470
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3471
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3472
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3473
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3474
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3475
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3476
    ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3477
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3478
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3479
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3480
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3481
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3482
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3483
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3484
	nextPutAll:' from '.
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3485
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3486
    sender := aContext sender.
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3487
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3488
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3489
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3490
	].
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3491
    ].
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3492
    sender printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3493
    aStream cr; flush.
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3494
695
88a741b6008f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 694
diff changeset
  3495
    "Modified: / 30.7.1998 / 20:40:14 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3496
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3497
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3498
printExit:aContext with:retVal
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3499
    self printExit:aContext with:retVal level:0 on:Processor activeProcess stderr
27
claus
parents: 26
diff changeset
  3500
!
claus
parents: 26
diff changeset
  3501
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3502
printExit:aContext with:retVal level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3503
    self printExit:aContext with:retVal level:lvl on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3504
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3505
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3506
printExit:aContext with:retVal level:lvl on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3507
    |mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3508
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3509
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3510
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3511
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3512
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3513
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3514
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3515
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3516
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3517
	nextPutAll:'leave ';
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3518
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3519
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3520
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3521
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3522
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3523
	nextPutAll:' rec=['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3524
1486
d7ae9a86ea38 print same receiver on entry and exit
Stefan Vogel <sv@exept.de>
parents: 1472
diff changeset
  3525
    self printObject:aContext receiver on:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3526
    aStream nextPutAll:'] return: ['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3527
    retVal printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3528
    aStream nextPutAll:']'; cr; flush.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3529
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3530
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3531
printExit:aContext with:retVal on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3532
    self printExit:aContext with:retVal level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3533
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3534
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3535
printFull:aContext on:aStream withSender:withSender
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3536
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3537
	printFull:aContext on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3538
	withSenderContext:(withSender ifTrue:[aContext sender]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3539
				      ifFalse:[nil])
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3540
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3541
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3542
printFull:aContext on:aStream withSenderContext:aSenderContextOrNil
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3543
    |mClass mClassName|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3544
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3545
    mClass := aContext methodClass.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3546
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3547
	mClassName := '???'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3548
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3549
	mClassName := mClass name
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3550
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3551
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3552
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3553
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3554
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3555
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3556
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3557
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3558
	nextPutAll:' rec=['.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3559
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3560
    self printObject:aContext receiver on:aStream.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3561
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3562
    aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3563
    (aContext args) keysAndValuesDo:[:idx :arg |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3564
	aStream nextPutAll:'arg'. idx printOn:aStream. aStream nextPutAll:'=['.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3565
	self printObject:arg on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3566
	aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3567
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3568
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3569
    aSenderContextOrNil notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3570
	self printSender:aSenderContextOrNil on:aStream.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3571
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3572
    aStream cr; flush.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3573
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3574
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3575
printObject:anObject on:aStream
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3576
    |s|
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3577
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3578
    s := anObject printString.
2085
21d40e42e3fa Better traces of object printStrings
Stefan Vogel <sv@exept.de>
parents: 2004
diff changeset
  3579
    s size > 40 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3580
	s := s chopTo:40.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3581
    ].
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3582
    aStream nextPutAll:s
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3583
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3584
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3585
printSender:aSenderContext on:aStream
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3586
    |sender|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3587
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3588
    sender := aSenderContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3589
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3590
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3591
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3592
	].
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3593
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3594
    aStream nextPutAll:'from:'.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3595
    aStream bold.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3596
    sender printOn:aStream.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3597
    aStream normal.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3598
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3599
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3600
printUpdateEntryFull:aContext level:lvl on:aStream
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3601
    |con|
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3602
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3603
    con := aContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3604
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3605
    [con notNil
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3606
     and:[con selector ~~ #'changed:with:']
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3607
    ] whileTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3608
	con := con sender.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3609
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3610
    "/ con is #'changed:with:'
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3611
    con isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3612
	^ self printEntryFull:aContext level:lvl on:aStream.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3613
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3614
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3615
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3616
    and:[ con sender selector == #'changed:']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3617
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3618
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3619
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3620
    and:[ con sender selector == #'changed']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3621
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3622
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3623
    (con sender notNil) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3624
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3625
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3626
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3627
    aStream spaces:lvl; nextPutAll:'enter '.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3628
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3629
	printFull:aContext
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3630
	on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3631
	withSenderContext:con
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3632
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3633
697
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3634
traceEntryFull:aContext on:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3635
    aStream nextPutLine:'-----------------------------------------'.
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3636
    aContext fullPrintAllOn:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3637
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3638
    "Created: / 30.7.1998 / 20:39:57 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3639
    "Modified: / 30.7.1998 / 20:42:23 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3640
!
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3641
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3642
traceFullBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3643
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3644
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3645
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3646
	^ TraceFullBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3647
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3648
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3649
	^ TraceFullBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3650
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3651
    ^ [:con | con fullPrintAllOn:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3652
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3653
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3654
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3655
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3656
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3657
traceSenderBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3658
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3659
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3660
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3661
	^ TraceSenderBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3662
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3663
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3664
	^ TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3665
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3666
    ^ [:con | MessageTracer printEntrySender:con on:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3667
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3668
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3669
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3670
! !
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  3671
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3672
!MessageTracer methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3673
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3674
trace:aBlock detail:fullDetail
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3675
    "trace execution of aBlock."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3676
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3677
    traceDetail := fullDetail.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3678
    tracedBlock := aBlock.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3679
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3680
    ObjectMemory stepInterruptHandler:self.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3681
    ^ [
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3682
	ObjectMemory flushInlineCaches.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3683
	StepInterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3684
	InterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3685
	aBlock value
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
  3686
    ] ensure:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3687
	tracedBlock := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3688
	StepInterruptPending := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3689
	ObjectMemory stepInterruptHandler:nil.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3690
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3691
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3692
    "
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3693
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:false
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3694
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3695
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3696
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3697
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3698
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3699
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3700
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3701
! !
27
claus
parents: 26
diff changeset
  3702
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3703
!MessageTracer::InteractionCollector methodsFor:'trace helpers'!
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3704
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3705
stepInterrupt
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3706
    StepInterruptPending := nil.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3707
    ObjectMemory flushInlineCaches.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3708
    StepInterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3709
    InterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3710
! !
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3711
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3712
!MessageTracer::MethodSpyInfo methodsFor:'accessing'!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3713
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3714
profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3715
    ^ profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3716
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3717
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3718
profiler:aMessageTally
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3719
    profiler := aMessageTally.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3720
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3721
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3722
!MessageTracer::MethodTimingInfo methodsFor:'accessing'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3723
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3724
avgTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3725
    sumTimes notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3726
	^ sumTimes / count
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3727
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3728
    ^ nil
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3729
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3730
    "Created: / 05-03-2007 / 15:38:43 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3731
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3732
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3733
avgTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3734
    |avg|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3735
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3736
    avg := self avgTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3737
    avg > 100 ifTrue:[ ^ avg roundTo:1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3738
    avg > 10 ifTrue:[ ^ avg roundTo:0.1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3739
    avg > 1 ifTrue:[ ^ avg roundTo:0.01 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3740
    ^ avg roundTo:0.001
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3741
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3742
    "Created: / 05-03-2007 / 15:47:02 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3743
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3744
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3745
count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3746
    ^ count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3747
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3748
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3749
count:countArg minTime:minTimeArg maxTime:maxTimeArg sumTimes:sumTimesArg
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3750
    count := countArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3751
    minTime := minTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3752
    maxTime := maxTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3753
    sumTimes := sumTimesArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3754
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3755
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3756
maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3757
    ^ maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3758
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3759
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3760
maxTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3761
    |max|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3762
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3763
    max := self maxTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3764
    ^ max roundTo:(max > 10 ifTrue:0.1 ifFalse:0.01)
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3765
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3766
    "Created: / 05-03-2007 / 15:47:22 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3767
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3768
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3769
minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3770
    ^ minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3771
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3772
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3773
minTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3774
    |min|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3775
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3776
    min := self minTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3777
    ^ min roundTo:(min > 10 ifTrue:0.1 ifFalse:0.01)
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3778
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3779
    "Created: / 05-03-2007 / 15:47:16 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3780
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3781
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3782
sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3783
    ^ sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3784
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3785
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3786
!MessageTracer::MethodTimingInfo methodsFor:'initialization'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3787
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3788
rememberExecutionTime:t
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3789
    (count isNil or:[count == 0]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3790
	minTime := maxTime := sumTimes := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3791
	count := 1.
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3792
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3793
	t < minTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3794
	    minTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3795
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3796
	    t > maxTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3797
		maxTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3798
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3799
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3800
	sumTimes := (sumTimes + t).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3801
	count := count + 1
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3802
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3803
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3804
    "Created: / 05-03-2007 / 15:32:43 / cg"
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3805
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3806
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3807
!MessageTracer::PrintingMessageTracer methodsFor:'accessing'!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3808
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3809
output:something
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3810
    output := something.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3811
! !
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3812
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3813
!MessageTracer::PrintingMessageTracer methodsFor:'trace helpers'!
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3814
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3815
stepInterrupt
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3816
    "called for every send while tracing"
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3817
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  3818
    |ignore sel con r outStream senderContext|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3819
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3820
    StepInterruptPending := nil.
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  3821
    con := senderContext := thisContext sender.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3822
    ignore := false.
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3823
    outStream := output notNil ifTrue:[output] ifFalse:[Processor activeProcess stderr].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3824
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3825
    con receiver == Processor ifTrue:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3826
        (sel := con selector) == #threadSwitch: ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3827
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3828
        ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3829
        sel == #timerInterrupt ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3830
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3831
        ]
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3832
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3833
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3834
    con lineNumber == 1 ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3835
        ignore := true
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3836
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3837
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3838
    ignore ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3839
        con markForInterruptOnUnwind.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3840
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3841
        ((r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3842
        and:[r ~~ tracedBlock]) ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3843
            traceDetail == #fullIndent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3844
                [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3845
                and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3846
                and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3847
                    '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3848
                    con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3849
                ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3850
                con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3851
                self class printFull:con on:outStream withSender:false.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3852
            ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3853
                traceDetail == #indent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3854
                    [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3855
                    and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3856
                    and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3857
                        '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3858
                        con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3859
                    ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3860
                    con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3861
                    con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3862
                    outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3863
                ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3864
                    traceDetail == true ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3865
                        self class printFull:con on:outStream withSender:true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3866
                    ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3867
                        con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3868
                        outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3869
                    ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3870
                ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3871
            ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3872
        ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3873
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3874
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3875
    ObjectMemory flushInlineCaches.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3876
    StepInterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3877
    InterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3878
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3879
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3880
     self new trace:[#(6 5 4 3 2 1) sort] detail:false
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3881
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3882
     self new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3883
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3884
     self new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3885
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3886
     self new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3887
     self new trace:[ View new ] detail:#fullIndent
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3888
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3889
! !
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3890
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3891
!MessageTracer class methodsFor:'documentation'!
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  3892
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
  3893
version_CVS
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  3894
    ^ '$Header$'
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  3895
! !
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
  3896
3130
cf77484583b8 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2972
diff changeset
  3897
27
claus
parents: 26
diff changeset
  3898
MessageTracer initialize!