MessageTracer.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 01 Feb 2015 10:21:20 +0100
changeset 3733 406ed5a2c24d
parent 3680 499ea3cafd70
child 3793 95cb401a7536
permissions -rw-r--r--
Added utility method to profile (using MessageTally) on given method.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     1
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
     3
	      All Rights Reserved
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     4
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    11
"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    12
"{ Package: 'stx:libbasic3' }"
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    13
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    14
"{ NameSpace: Smalltalk }"
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    15
120
950e4628d657 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    16
Object subclass:#MessageTracer
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    17
	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
    18
	classVariableNames:'BreakpointSignal CallingLevel BreakBlock TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
    19
		TraceSenderBlock2 LeaveBreakBlock LeaveTraceBlock MethodCounts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    20
		MethodCountsPerReceiverClass MethodMemoryUsage MethodTiming
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    21
		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
    22
		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
    23
	poolDictionaries:''
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    24
	category:'System-Debugging-Support'
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    25
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    26
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    27
MessageTracer subclass:#InteractionCollector
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    28
	instanceVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    29
	classVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    30
	poolDictionaries:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    31
	privateIn:MessageTracer
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    32
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    33
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    34
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
    35
	instanceVariableNames:'profiler'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    36
	classVariableNames:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    37
	poolDictionaries:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    38
	privateIn:MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    39
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    40
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    41
Object subclass:#MethodTimingInfo
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    42
	instanceVariableNames:'count minTime maxTime sumTimes avgTime'
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    43
	classVariableNames:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    44
	poolDictionaries:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    45
	privateIn:MessageTracer
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    46
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    47
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    48
MessageTracer subclass:#PrintingMessageTracer
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    49
	instanceVariableNames:'output'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    50
	classVariableNames:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    51
	poolDictionaries:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    52
	privateIn:MessageTracer
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    53
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    54
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
    55
!MessageTracer class methodsFor:'documentation'!
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    56
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    57
copyright
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    58
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    59
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    60
	      All Rights Reserved
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    61
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    62
 This software is furnished under a license and may be used
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    63
 only in accordance with the terms of that license and with the
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    64
 inclusion of the above copyright notice.   This software may not
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    65
 be provided or otherwise made available to, or used by, any
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    66
 other person.  No title to or ownership of the software is
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    67
 hereby transferred.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    68
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    69
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    70
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    71
documentation
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    72
"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    73
    This class provides a common home for the tracing
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    74
    facilities (originally, they where in Object, but have been moved to
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    75
    allow easier separation of development vs. runtime configurations).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    76
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    77
    tracing execution of a block:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    78
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    79
	MessageTracer trace:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    80
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    81
	MessageTracer traceFull:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    82
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    83
	(for system developer only:)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    84
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    85
	MessageTracer debugTrace:[ ... ]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    86
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    87
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    88
    trapping sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    89
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    90
	MessageTracer trap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    91
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    92
	MessageTracer untrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    93
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    94
	MessageTracer untrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    95
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    96
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    97
27
claus
parents: 26
diff changeset
    98
    trapping some messages sent to a specific object:
claus
parents: 26
diff changeset
    99
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   100
	MessageTracer trap:anObject selectors:aCollectionOfSelectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   101
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   102
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   103
claus
parents: 26
diff changeset
   104
claus
parents: 26
diff changeset
   105
claus
parents: 26
diff changeset
   106
    trapping any message sent to a specific object:
claus
parents: 26
diff changeset
   107
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   108
	MessageTracer trapAll:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   109
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   110
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   111
claus
parents: 26
diff changeset
   112
claus
parents: 26
diff changeset
   113
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   114
    trapping evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   115
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   116
	MessageTracer trapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   117
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   118
	MessageTracer unwrapMethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   119
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   120
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   121
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   122
    trapping evaluation of a specific method with
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   123
    receiver being an instance of some class:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   124
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   125
	MessageTracer trapMethod:aMethod forInstancesOf:aClass
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   126
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   127
	MessageTracer unwrapMethod:aMethod
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   128
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   129
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   130
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   131
    tracing sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   132
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   133
	MessageTracer trace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   134
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   135
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   136
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   137
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   138
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   139
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   140
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   141
    tracing sender only:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   142
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   143
	MessageTracer traceSender:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   144
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   145
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   146
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   147
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   148
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   149
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   150
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   151
    tracing evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   152
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   153
	MessageTracer traceMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   154
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   155
	MessageTracer unwrapmethod:aMethod
18
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   156
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   157
  see more in examples and in method comments.
236
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   158
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   159
    [author:]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   160
	Claus Gittinger
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   161
"
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   162
!
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   163
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   164
examples
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   165
"
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   166
  For the common cases, you will find a menu entry in the SystemBrowser.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   167
  Howeever, more special cases (especially with condition checks) can be
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   168
  set up by evaluating the lower level entries.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   169
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   170
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   171
  trapping specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   172
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   173
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   174
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   175
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   176
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   177
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   178
     MessageTracer untrapClass:Collection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   179
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   180
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   181
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   182
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   183
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   184
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   185
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   186
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   187
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   188
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   189
27
claus
parents: 26
diff changeset
   190
  (by method & instance class):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   191
									[exBegin]
27
claus
parents: 26
diff changeset
   192
     MessageTracer trapMethod:(SequenceableCollection compiledMethodAt:#select:)
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   193
		   forInstancesOf:SortedCollection.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   194
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   195
     (Array new:10) select:[:e | ].       'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   196
     OrderedCollection new select:[:e | ]. 'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   197
     SortedCollection new select:[:e | ].  'caught - Set inherits this from Collection'.
27
claus
parents: 26
diff changeset
   198
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   199
									[exEnd]
27
claus
parents: 26
diff changeset
   200
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   201
  tracing specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   202
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   203
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   204
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   205
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   206
     MessageTracer untraceClass:SequenceableCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   207
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   208
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   209
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   210
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   211
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   212
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   213
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   214
									[exEnd]
27
claus
parents: 26
diff changeset
   215
claus
parents: 26
diff changeset
   216
  object trapping:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   217
									[exBegin]
27
claus
parents: 26
diff changeset
   218
     |o|
claus
parents: 26
diff changeset
   219
claus
parents: 26
diff changeset
   220
     o := OrderedCollection new.
claus
parents: 26
diff changeset
   221
     MessageTracer trapAll:o.
claus
parents: 26
diff changeset
   222
     o collect:[:el | el].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   223
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   224
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   225
  trapping modifications to an objects instVars:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   226
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   227
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   228
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   229
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   230
     MessageTracer trapModificationsIn:o.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   231
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   232
     o y:2.
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
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   236
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   237
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   238
  trapping modifications of a particular instVar:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   239
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   240
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   241
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   242
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   243
     MessageTracer trapModificationsIn:o filter:[:old :new | old x ~~ new x].
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   244
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   245
     o y:2.
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
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   249
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   250
  tracing during block execution:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   251
									[exBegin]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   252
     MessageTracer trace:[ 10 factorialR ]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   253
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   254
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   255
"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   256
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   257
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   258
!MessageTracer class methodsFor:'Signal constants'!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   259
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   260
breakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   261
    ^ BreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   262
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   263
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   264
objectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   265
    ^ ObjectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   266
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   267
    "Created: / 21.4.1998 / 14:38:49 / cg"
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   270
!MessageTracer class methodsFor:'class initialization'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   271
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   272
initialize
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   273
    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
   274
        "/ 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
   275
        "/ 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
   276
        BreakpointSignal := BreakPointInterrupt.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   277
        BreakpointSignal notifierString:'breakpoint encountered'.
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   278
    ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   279
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   280
    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
   281
        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
   282
        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
   283
        ObjectWrittenBreakpointSignal notifierString:'object modified'.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   284
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   285
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   286
    "/ the following have been written as cheapBlocks (by purpose)
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   287
    BreakBlock       := [:con | BreakpointSignal raiseRequestWith:nil errorString:nil in:con].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   288
    TraceSenderBlock  := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Stderr)     ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   289
    TraceSenderBlock2 := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Transcript) ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   290
    TraceFullBlock    := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Stderr)       ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   291
    TraceFullBlock2   := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Transcript)   ].
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   292
    LeaveBreakBlock  := [:con :retVal | retVal ].
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   293
    LeaveTraceBlock  := [:con :retVal | retVal ].
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   294
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   295
    ObjectMemory addDependent:self.
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   296
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   297
    MockedMethodMarker := Object new.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   298
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   299
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   300
     BreakpointSignal := nil.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   301
     MessageTracer initialize
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   302
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   303
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   304
    "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
   305
    "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
   306
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   307
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   308
update:something with:parameter from:changedObject
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   309
    "sent when restarted after a snapIn"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   310
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   311
    (something == #restarted) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   312
	TimeForWrappers := nil
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   313
    ]
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   314
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   315
    "Created: / 30.7.1998 / 17:00:09 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   316
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   317
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   318
!MessageTracer class methodsFor:'class tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   319
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   320
untraceAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   321
    "remove all traces of messages sent to any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   322
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   323
    "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
   324
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   325
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   326
    ^ self untrapAllClasses
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   329
untraceClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   330
    "remove all traces of messages sent to instances of aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   331
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   332
    "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
   333
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   334
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   335
    ^ self untrapClass:aClass
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
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   338
!MessageTracer class methodsFor:'class wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   339
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   340
wrapClass:orgClass selector:aSelector onEntry:entryBlock onExit:exitBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   341
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   342
     aSelector is sent to instances of orgClass or subclasses.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   343
     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
   344
     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
   345
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   346
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
   347
    |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
   348
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   349
    WrappedMethod autoload.     "/ just to make sure ...
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   350
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   351
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   352
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   353
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   354
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   355
    spec := Parser methodSpecificationForSelector:aSelector.
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
    s := WriteStream on:String new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   358
    s nextPutAll:spec.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   359
    s cr.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
   360
    s nextPutAll:'<context: #return>'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   361
    s nextPutAll:'|retVal stubClass|'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   362
    entryBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   363
	s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   364
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   365
    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
   366
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   367
    exitBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   368
	s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   369
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   370
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   371
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   372
    ParserFlags
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   373
	withSTCCompilation:#never
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   374
	do:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   375
	    Class withoutUpdatingChangesDo:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   376
		trapMethod := Compiler
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   377
				compile:s contents
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   378
				forClass:orgClass
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   379
				inCategory:'trapping'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   380
				notifying:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   381
				install:false
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   382
				skipIfSame:false
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   383
				silent:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   384
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   385
	].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   386
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   387
    implClass := orgClass whichClassIncludesSelector:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   388
    implClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   389
	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
   390
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   391
	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
   392
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   393
    entryBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   394
	trapMethod changeLiteral:#literal1 to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   395
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   396
    exitBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   397
	trapMethod changeLiteral:#literal2 to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   398
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   399
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   400
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   401
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   402
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   403
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   404
    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
   405
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   406
    trapMethod register.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   407
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   408
    dict := orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   409
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   410
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   411
     if not already trapping, create a new class
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   412
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   413
    orgClass category == #'* trapping *' ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   414
	dict at:aSelector put:trapMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   415
	orgClass methodDictionary:dict.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   416
	newClass := orgClass superclass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   417
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   418
	myMetaclass := orgClass class.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   419
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   420
	newClass := myMetaclass copy new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   421
	newClass setSuperclass:orgClass superclass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   422
	newClass instSize:orgClass instSize.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   423
	newClass flags:orgClass flags.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   424
	newClass setClassVariableString:orgClass classVariableString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   425
	newClass setSharedPoolNames:(orgClass sharedPoolNames).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   426
	newClass setInstanceVariableString:orgClass instanceVariableString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   427
	newClass setName:orgClass name.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   428
	newClass setCategory:orgClass category.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   429
	newClass methodDictionary:dict.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   430
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   431
	orgClass setSuperclass:newClass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   432
	orgClass setClassVariableString:''.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   433
	orgClass setInstanceVariableString:''.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   434
	orgClass setCategory:#'* trapping *'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   435
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   436
	dict := MethodDictionary new:1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   437
	dict at:aSelector put:trapMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   438
	orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   439
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   440
    trapMethod changeLiteral:(newClass superclass) to:newClass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   441
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   442
    ObjectMemory flushCaches.
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
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   445
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   446
		wrapClass:Point
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   447
		 selector:#scaleBy:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   448
		   onEntry:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   449
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   450
			       Transcript show:'leave Point>>scaleBy:; returning:'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   451
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   452
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   453
			   ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   454
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   455
     MessageTracer untrapClass:Point selector:#scaleBy:.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   456
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   457
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   458
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   459
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   460
		wrapClass:Integer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   461
		 selector:#factorial
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   462
		   onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   463
			       Transcript showCR:('entering ' , con receiver printString , '>>factorial').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   464
			   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   465
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   466
			       Transcript show:'leave Integer>>factorial; returning:'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   467
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   468
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   469
			   ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   470
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   471
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   472
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   473
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   474
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   475
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   476
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   477
     |lvl|
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 := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   480
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   481
		wrapClass:Integer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   482
		 selector:#factorial
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   483
		   onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   484
			       Transcript spaces:lvl. lvl := lvl + 2.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   485
			       Transcript showCR:('entering ' , con receiver printString , '>>factorial').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   486
			   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   487
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   488
			       lvl := lvl - 2. Transcript spaces:lvl.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   489
			       Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   490
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   491
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   492
			   ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   493
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   494
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   495
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   496
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   497
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   498
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
   499
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   500
    "Modified: / 25-06-1996 / 22:01:05 / stefan"
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   501
    "Modified: / 01-07-2011 / 10:01:59 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   502
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   503
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   504
!MessageTracer class methodsFor:'cleanup'!
27
claus
parents: 26
diff changeset
   505
claus
parents: 26
diff changeset
   506
cleanup
claus
parents: 26
diff changeset
   507
    "if you forgot which classes/methods where wrapped and/or trapped,
claus
parents: 26
diff changeset
   508
     this cleans up everything ..."
claus
parents: 26
diff changeset
   509
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   510
    ObjectCopyHolders := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   511
    MethodCounts := MethodMemoryUsage := MethodTiming := TimeForWrappers := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   512
27
claus
parents: 26
diff changeset
   513
    self untrapAllClasses.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   514
    self unwrapAllMethods.
27
claus
parents: 26
diff changeset
   515
claus
parents: 26
diff changeset
   516
    "
claus
parents: 26
diff changeset
   517
     MessageTracer cleanup
claus
parents: 26
diff changeset
   518
    "
claus
parents: 26
diff changeset
   519
! !
claus
parents: 26
diff changeset
   520
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
   521
!MessageTracer class methodsFor:'execution trace'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   522
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   523
debugTrace:aBlock
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   524
    "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
   525
     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
   526
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   527
    ObjectMemory sendTraceOn.
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
   528
    ^ aBlock ensure:[ObjectMemory sendTraceOff]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   529
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   530
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   531
     MessageTracer debugTrace:[#(6 5 4 3 2 1) sort]
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   532
    "
196
330cc5c849de debugOn/Off is now called sendTraceOn/Off
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   533
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   534
    "Modified: / 31.7.1998 / 16:39:43 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   535
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   536
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   537
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   538
    "evaluate aBlock sending trace information to stdout.
27
claus
parents: 26
diff changeset
   539
     Return the value of the block."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   540
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   541
     ^ self trace:aBlock on:Stderr
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   542
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   543
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   544
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   545
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   546
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   547
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   548
trace:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   549
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   550
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   551
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   552
    ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   553
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   554
	trace:aBlock detail:false.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   555
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   556
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   557
     MessageTracer trace:[#(6 5 4 3 2 1) sort] on:Transcript
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
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   560
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   561
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   562
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   563
     Return the value of the block.
27
claus
parents: 26
diff changeset
   564
     The trace information is more detailed."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   565
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   566
     ^ self traceFull:aBlock on:Stderr
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   567
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   568
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   569
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
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
!
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
traceFull:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   574
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   575
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   576
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   577
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   578
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   579
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   580
	trace:aBlock detail:true.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   581
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   582
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   583
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   584
    "
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   585
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   586
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   587
traceFullIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   588
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   589
     Return the value of the block.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   590
     The trace information is more detailed."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   591
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   592
     ^ self traceFullIndented:aBlock on:Stderr
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   593
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   594
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   595
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
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
!
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
traceFullIndented:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   600
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   601
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   602
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   603
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   604
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   605
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   606
	trace:aBlock detail:#fullIndent.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   607
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   608
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   609
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
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
!
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
traceIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   614
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   615
     Return the value of the block."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   616
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   617
     ^ self traceIndented:aBlock on:Stderr
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   618
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   619
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   620
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   621
    "
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   622
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   623
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   624
traceIndented:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   625
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   626
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   627
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   628
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   629
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   630
	trace:aBlock detail:#indent.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   631
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   632
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   633
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   634
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   635
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   636
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   637
!MessageTracer class methodsFor:'method breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   638
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   639
trapClass:aClass selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   640
    "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
   641
     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
   642
     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
   643
     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
   644
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   645
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   646
    self trapMethod:(aClass compiledMethodAt:aSelector)
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
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   649
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   650
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   651
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   652
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   653
     MessageTracer untrapClass:Collection
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   654
    "
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   655
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   656
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   657
trapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   658
    "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
   659
     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
   660
     selective breakPoint.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   661
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   662
     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
   663
     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
   664
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   665
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   666
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   667
	      onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   668
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   669
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   670
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   671
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   672
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   673
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   674
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   675
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   676
    "
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   677
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   678
    "Modified: 22.10.1996 / 17:39:58 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   679
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   680
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   681
trapMethod:aMethod after:countInvocations
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   682
    "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
   683
     The trap is enabled for any process.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   684
     Use unwrapMethod or untrapClass to remove this trap.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   685
     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
   686
     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
   687
     entry/leave blocks."
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   688
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   689
    |n|
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 := 0.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   692
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   693
	      onEntry:[:con | n := n + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   694
			      n > countInvocations
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   695
			      ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   696
				BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   697
			      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   698
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   699
	       onExit:LeaveBreakBlock.
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   700
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   701
!
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   702
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   703
trapMethod:aMethod forInstancesOf:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   704
    "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
   705
     for an instance of aClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   706
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   707
     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
   708
     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
   709
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   710
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   711
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   712
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   713
			 (con receiver isMemberOf:aClass) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   714
			     BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   715
			 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   716
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   717
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   718
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   719
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   720
     MessageTracer trapMethod:(View compiledMethodAt:#redraw) forInstancesOf:myView.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   721
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   722
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   723
    "Modified: 22.10.1996 / 17:40:03 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   724
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   725
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   726
trapMethod:aMethod if:conditionBlock
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   727
    "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
   728
     evaluates to true.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   729
     The trap is enabled for any process.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   730
     Use unwrapMethod or untrapClass to remove this trap.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   731
     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
   732
     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
   733
     entry/leave blocks."
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   734
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   735
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   736
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   737
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   738
	    |conditionFires|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   739
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   740
	    Error handle:[:ex |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   741
		'MessageTrace: error in breakpoint condition caught: ' errorPrint.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   742
		ex description errorPrintCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   743
	    ] do:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   744
		conditionBlock numArgs == 1 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   745
		    conditionFires := conditionBlock value:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   746
		] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   747
		    conditionFires := conditionBlock value:con value:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   748
		].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   749
	    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   750
	    conditionFires == true ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   751
		BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   752
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   753
	]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   754
	onExit:LeaveBreakBlock.
2291
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   755
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   756
    "Created: / 18-08-2000 / 22:09:10 / cg"
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   757
    "Modified: / 20-10-2010 / 09:38:57 / cg"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   758
!
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   759
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   760
trapMethod:aMethod inProcess:aProcess
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   761
    "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
   762
     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
   763
     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
   764
     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
   765
     Use unwrapMethod or untrapClass to remove this trap.
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   766
     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
   767
     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
   768
     entry/leave blocks."
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   769
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   770
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   771
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   772
			(Processor activeProcess processGroupId = aProcess id) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   773
			    BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   774
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   775
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   776
	       onExit:LeaveBreakBlock.
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   777
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   778
    "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
   779
    "Modified: 22.10.1996 / 17:40:06 / cg"
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   780
!
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   781
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   782
untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   783
    "remove any traps on any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   784
970
116aa95d7b97 allBehaviors vs. allClasses
Claus Gittinger <cg@exept.de>
parents: 957
diff changeset
   785
    Smalltalk allClassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   786
	self untrapClass:aClass
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   787
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   788
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   789
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   790
     MessageTracer untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   791
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   792
!
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
untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   795
    "remove any traps on aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   796
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   797
    "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
   798
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   799
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   800
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   801
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   802
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   803
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   804
    orgClass := aClass superclass.
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
    aClass setSuperclass:orgClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   807
    aClass setClassVariableString:orgClass classVariableString.
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   808
    aClass setSharedPoolNames:(orgClass sharedPoolNames).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   809
    aClass setInstanceVariableString:orgClass instanceVariableString.
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
   810
    aClass setCategory:orgClass category.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   811
    aClass methodDictionary:orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   812
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   813
    ObjectMemory flushCaches.
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
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   816
     MessageTracer untrapClass:Point
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   817
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   818
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   819
    "Modified: / 05-06-1996 / 13:57:39 / stefan"
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   820
    "Modified: / 18-01-2011 / 20:43:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   821
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   822
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   823
untrapClass:aClass selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   824
    "remove trap of aSelector sent to aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   825
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   826
    |dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   827
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   828
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   829
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   830
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   831
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   832
    dict := aClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   833
    dict at:aSelector ifAbsent:[^ self].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   834
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   835
    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
   836
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   837
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   838
	"the last trapped method"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   839
	^ self untrapClass:aClass
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   840
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   841
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   842
    aClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   843
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   844
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   845
     MessageTracer trapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   846
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   847
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   848
     MessageTracer trapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   849
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   850
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   851
     MessageTracer untrapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   852
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   853
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   854
     MessageTracer untrapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   855
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   856
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   857
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   858
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   859
    "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
   860
    "Modified: 10.9.1996 / 20:06:29 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   861
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   862
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   863
untrapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   864
    "remove break on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   865
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   866
    "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
   867
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   868
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   869
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   870
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   871
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   872
!MessageTracer class methodsFor:'method breakpointing - new'!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   873
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   874
breakMethod: method atLine: line
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   875
    "Installs new breakpoint in given method at given line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   876
     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
   877
     installed"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   878
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   879
    | analyzer map lines i breakpoint table |
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
    (ConfigurableFeatures includesFeature: #VMBreakpointSupport) ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   882
	self error: 'Breakpoint support not present'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   883
	^nil.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   884
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   885
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   886
    analyzer := BreakpointAnalyzer parseMethodSilent: method source in: method mclass.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   887
    map := analyzer messageSendMap.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   888
    lines := map keys asSortedCollection.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   889
    i := lines indexForInserting: line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   890
    i > lines size ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   891
	^nil
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   892
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   893
    breakpoint := Breakpoint new line: (lines at: i).
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   894
    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
   895
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   896
    table := method breakpointTable.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   897
    table isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   898
	"/old way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   899
	"/table := Array with: (breakpoint line) with: breakpoint.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   900
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   901
	"/new way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   902
	table := Array with: breakpoint.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   903
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   904
	"/old way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   905
	"/table := table, (Array with: (breakpoint line) with: breakpoint).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   906
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   907
	"/new way:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   908
	table := table copyWith: breakpoint
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   909
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   910
    method breakpointTable: table.
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
    ^breakpoint
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
    "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
   915
    "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
   916
! !
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   917
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   918
!MessageTracer class methodsFor:'method counting'!
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   919
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   920
countMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   921
    "arrange for a aMethod's execution to be counted.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   922
     Use unwrapMethod to remove this."
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   923
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   924
    MethodCounts isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   925
	MethodCounts := IdentityDictionary new.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   926
    ].
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   927
    MethodCounts at:aMethod put:0.
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
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   930
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   931
			|cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   932
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   933
			cnt := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   934
			MethodCounts at:aMethod put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   935
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   936
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   937
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   938
	 onExit:nil
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   939
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   940
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   941
     MessageTracer countMethod:(Integer compiledMethodAt:#factorial).
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   942
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   943
     MessageTracer executionCountOf:(Integer compiledMethodAt:#factorial) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   944
     MessageTracer stopCountingMethod:(Integer compiledMethodAt:#factorial)
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   945
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   946
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   947
    "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
   948
    "Modified: / 27.7.1998 / 10:47:46 / cg"
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   949
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   950
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   951
countMethodByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   952
    "arrange for a aMethod's execution to be counted and maintain
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   953
     a per-receiver class profile.
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   954
     Use unwrapMethod to remove this."
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   955
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   956
    MethodCountsPerReceiverClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   957
	MethodCountsPerReceiverClass := IdentityDictionary new.
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   958
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   959
    MethodCountsPerReceiverClass at:aMethod put:(IdentityDictionary new).
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
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   962
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   963
			|cls perMethodCounts cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   964
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   965
			cls := (con receiver class).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   966
			perMethodCounts := MethodCountsPerReceiverClass at:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   967
			cnt := perMethodCounts at:cls ifAbsentPut:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   968
			perMethodCounts at:cls put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   969
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   970
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   971
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   972
	 onExit:nil
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   973
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   974
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   975
     MessageTracer countMethodWithReceiverStatistic:(Collection compiledMethodAt:#detect:).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   976
     NewSystemBrowser open.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   977
     MessageTracer executionCountsOf:(Collection compiledMethodAt:#detect:) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   978
     MessageTracer stopCountingMethod:(Collection compiledMethodAt:#detect:)
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   979
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   980
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   981
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   982
executionCountOfMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   983
    "return the current count"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   984
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   985
    |count counts|
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   986
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   987
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   988
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   989
	    count := MethodCounts at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   990
	    count notNil ifTrue:[^ count].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   991
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   992
	^ MethodCounts at:aMethod ifAbsent:0
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   993
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   994
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   995
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   996
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   997
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   998
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   999
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1000
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1001
	^ (counts collect:[:eachClassCountAssoc | eachClassCountAssoc value]) sum
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1002
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1003
    ^ 0
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1004
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1005
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1006
executionCountsByReceiverClassOfMethod:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1007
    "return a collection mapping receiver class to call counts"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1008
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1009
    |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
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1012
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1013
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1014
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1015
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1016
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1017
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1018
	^ counts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1019
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1020
    ^ #()
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1021
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1022
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1023
resetCountOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1024
    "return the current count"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1025
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1026
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1027
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1028
	    MethodCounts at:aMethod originalMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1029
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1030
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1031
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1032
    "Created: / 30.7.1998 / 17:42:08 / cg"
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
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1035
stopCountingMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1036
    "remove counting of aMethod"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1037
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1038
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1039
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1040
	    MethodCounts removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1041
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1042
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1043
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1044
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1045
	    MethodCountsPerReceiverClass removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1046
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1047
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1048
    ^ self unwrapMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1049
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1050
    "Modified: 15.12.1995 / 15:43:53 / cg"
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
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1053
!MessageTracer class methodsFor:'method memory usage'!
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1054
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1055
countMemoryUsageOfMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1056
    "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
  1057
     Use unwrapMethod to remove this."
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1058
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  1059
    |oldPriority oldScavengeCount oldNewUsed|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1060
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1061
    MethodCounts isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1062
	MethodCounts := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1063
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1064
    MethodMemoryUsage isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1065
	MethodMemoryUsage := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1066
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1067
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1068
    MethodCounts at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1069
    MethodMemoryUsage at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1070
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1071
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1072
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1073
			oldPriority := Processor activeProcess changePriority:(Processor userInterruptPriority).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1074
			oldNewUsed := ObjectMemory newSpaceUsed.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1075
			oldScavengeCount := ObjectMemory scavengeCount.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1076
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1077
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1078
	     |cnt memUse scavenges|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1079
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1080
	     memUse := ObjectMemory newSpaceUsed - oldNewUsed.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1081
	     scavenges := ObjectMemory scavengeCount - oldScavengeCount.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1082
	     scavenges ~= 0 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1083
		memUse := memUse + (ObjectMemory newSpaceSize * scavenges)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1084
	     ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1085
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1086
	     MethodCounts notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1087
		 cnt := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1088
		 MethodCounts at:aMethod put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1089
	     ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1090
	     MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1091
		 cnt := MethodMemoryUsage at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1092
		 MethodMemoryUsage at:aMethod put:(cnt + memUse).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1093
	     ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1094
	     Processor activeProcess priority:oldPriority.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1095
	     MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1096
	     aMethod changed:#statistics.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1097
	     retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1098
	 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1099
	 onUnwind:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1100
	     oldPriority notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1101
		 Processor activeProcess priority:oldPriority
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1102
	     ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1103
	 ]
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1104
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1105
    "
2825
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1106
     MessageTracer countMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR).
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1107
     3 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1108
     Transcript showCR:(MessageTracer memoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1109
     MessageTracer stopCountingMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1110
    "
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1111
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1112
    "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
  1113
    "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
  1114
    "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
  1115
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1116
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1117
isCountingMemoryUsage:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1118
    "return true if aMethod is counting memoryUsage"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1119
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1120
    MethodMemoryUsage isNil ifTrue:[^ false].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1121
    (MethodMemoryUsage includesKey:aMethod) ifTrue:[^ true].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1122
    aMethod isWrapped ifTrue:[
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  1123
	^ MethodMemoryUsage includesKey:aMethod originalMethod
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1124
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1125
    ^ false
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
    "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
  1128
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1129
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1130
memoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1131
    "return the current count"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1132
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1133
    |count memUse orgMethod|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1134
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1135
    (MethodCounts isNil or:[MethodMemoryUsage isNil]) ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1136
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1137
	orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1138
	count := MethodCounts at:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1139
	memUse := MethodMemoryUsage at:orgMethod ifAbsent:nil.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1140
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1141
    memUse isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1142
	count := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1143
	memUse := MethodMemoryUsage at:aMethod ifAbsent:0.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1144
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1145
    count = 0 ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1146
    ^ memUse//count
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1147
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1148
    "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
  1149
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1150
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1151
resetMemoryUsageOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1152
    "reset the current usage"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1153
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1154
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1155
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1156
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1157
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1158
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1159
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1160
		MethodCounts at:orgMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1161
		MethodMemoryUsage at:orgMethod put:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1162
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1163
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1164
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1165
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1166
    "Created: / 30.7.1998 / 17:43:07 / cg"
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
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1169
stopCountingMemoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1170
    "remove counting memory of aMethod"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1171
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1172
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1173
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1174
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1175
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1176
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1177
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1178
		MethodCounts removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1179
		MethodMemoryUsage removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1180
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1181
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1182
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1183
    ^ self unwrapMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1184
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1185
    "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
  1186
! !
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1187
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1188
!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
  1189
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1190
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
  1191
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1192
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1193
    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
  1194
    ^ 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
  1195
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1196
    "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
  1197
    "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
  1198
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1199
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1200
mockMethod: method do: block
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1201
    "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
  1202
     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
  1203
     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
  1204
     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
  1205
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1206
     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
  1207
     and then - optionally - the original method object.
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1208
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1209
     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
  1210
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1211
     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
  1212
             threads along their #creatorId. However, when the parent thread dies, 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1213
             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
  1214
             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
  1215
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1216
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1217
    | 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
  1218
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1219
    CallingLevel := 0.
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
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1222
     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
  1223
     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
  1224
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1225
    (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
  1226
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1227
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1228
    method isLazyMethod ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1229
        method makeRealMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1230
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1231
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
     get class/selector
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
    class := method containingClass.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1236
    class isNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1237
        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
  1238
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1239
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1240
    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
  1241
    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1242
    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
  1243
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1244
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1245
     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
  1246
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1247
    xselector := '_x'.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1248
    method numArgs timesRepeat:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1249
        xselector := xselector , '_:'
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1250
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1251
    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
  1252
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1253
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1254
     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
  1255
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1256
    src := '%(spec)
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
    <context: #return>
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1259
    | 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
  1260
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1261
    context := thisContext.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1262
    currentProcess := Processor activeProcess.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1263
    mock := false.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1264
    marker := #mockedMethodMarker yourself.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1265
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1266
    [ 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
  1267
        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
  1268
        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
  1269
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1270
    mock ifTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1271
        mockedVal := #replacementBlock yourself valueWithArguments: (Array with: context) , (context args)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1272
    ] ifFalse:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1273
        mockedVal := #originalMethod yourself
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1274
                        valueWithReceiver:(context receiver)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1275
                        arguments:(context args)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1276
                        selector:(context selector)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1277
                        search:(context searchClass)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1278
                        sender:nil.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1279
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1280
    ^  mockedVal'.
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
    src := src expandPlaceholdersWith:
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1283
        (Dictionary new
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1284
            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
  1285
            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
  1286
            yourself).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1287
        
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1288
    saveUS := Compiler allowUnderscoreInIdentifier.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1289
    ParserFlags
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1290
        withSTCCompilation:#never
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1291
        do:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1292
            [
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1293
                Compiler allowUnderscoreInIdentifier:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1294
                Class withoutUpdatingChangesDo:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1295
                    trapMethod := Compiler
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1296
                                    compile:src
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1297
                                    forClass:UndefinedObject
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1298
                                    inCategory:method category
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1299
                                    notifying:nil
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1300
                                    install:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1301
                                    skipIfSame:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1302
                                    silent:false. "/ true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1303
                ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1304
            ] ensure:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1305
                Compiler allowUnderscoreInIdentifier:saveUS.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1306
            ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1307
        ].
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
    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
  1310
    trapMethod changeClassTo:WrappedMethod.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1311
    trapMethod register.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1312
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1313
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1314
     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
  1315
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1316
    block notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1317
        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
  1318
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1319
    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
  1320
    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
  1321
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1322
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1323
     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
  1324
     (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
  1325
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1326
    trapMethod source: src.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1327
"/    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
  1328
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1329
    dict := class methodDictionary.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1330
    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
  1331
    sel == 0 ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1332
        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
  1333
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1334
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1335
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1336
    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
  1337
    class methodDictionary:dict.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1338
    ObjectMemory flushCaches.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1339
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1340
    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
  1341
    MethodTrapChangeNotificationParameter notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1342
        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
  1343
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1344
    ^ trapMethod
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
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1347
     MessageTracer
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1348
                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
  1349
                do: [ :color |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1350
                    Color red
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1351
                ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1352
     Color magenta.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1353
     [ [ Color magenta inspect ] fork. Delay waitForSeconds: 1. ] fork.
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1354
     (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
  1355
     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
  1356
     Color magenta.    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1357
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1358
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1359
    "Created: / 29-07-2014 / 09:44:11 / 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
  1360
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1361
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1362
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
  1363
    | method |
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
    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
  1366
    ^ self unmockMethod: 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
    "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
  1369
!
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
unmockAllMethods
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1372
    "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
  1373
     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
  1374
     uses method mocking"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1375
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1376
    WrappedMethod allInstancesDo:[:method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1377
        method isMocked ifTrue:[    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1378
            method unregister.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1379
            self unwrapMethod: method.  
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1380
        ]        
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1381
    ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1382
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1383
    "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
  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
unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1387
    "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
  1388
     #mockMethod:do:"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1389
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1390
    method isMocked ifTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1391
        self unwrapMethod: method  
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
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1394
    "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
  1395
! !
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1396
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1397
!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
  1398
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1399
spyMethod:aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1400
    "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
  1401
     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
  1402
     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
  1403
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1404
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1405
    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
  1406
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1407
    "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
  1408
!
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
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
  1411
    "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
  1412
     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
  1413
     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
  1414
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1415
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1416
    |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
  1417
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1418
    CallingLevel := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1419
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
     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
  1422
     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
  1423
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1424
    (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
  1425
        ^ aMethod
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 isLazyMethod 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 makeRealMethod
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
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1431
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1432
     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
  1433
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1434
    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
  1435
    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
  1436
        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
  1437
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1438
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1439
    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
  1440
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1441
    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
  1442
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
     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
  1445
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1446
    xselector := '_x'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1447
    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
  1448
        xselector := xselector , '_:'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1449
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1450
    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
  1451
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
    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
  1454
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1455
     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
  1456
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1457
    s := WriteStream on:String new.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1458
    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
  1459
    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
  1460
    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
  1461
    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
  1462
    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
  1463
      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
  1464
      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
  1465
      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
  1466
      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
  1467
      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
  1468
      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
  1469
      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
  1470
      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
  1471
    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
  1472
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1473
    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
  1474
    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
  1475
    ParserFlags
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1476
        withSTCCompilation:#never
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1477
        do:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1478
            [
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1479
                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
  1480
                Class withoutUpdatingChangesDo:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1481
                    trapMethod := Compiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1482
                                    compile:src
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1483
                                    forClass:UndefinedObject
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1484
                                    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
  1485
                                    notifying:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1486
                                    install:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1487
                                    skipIfSame:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1488
                                    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
  1489
                ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1490
            ] ensure:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1491
                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
  1492
            ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1493
        ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1494
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1495
    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
  1496
    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
  1497
    trapMethod register.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1498
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1499
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1500
     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
  1501
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1502
    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
  1503
    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
  1504
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1505
     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
  1506
     (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
  1507
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1508
"/    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
  1509
    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
  1510
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1511
    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
  1512
    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
  1513
    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
  1514
        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
  1515
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1516
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1517
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1518
    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
  1519
    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
  1520
    ObjectMemory flushCaches.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1521
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1522
    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
  1523
    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
  1524
        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
  1525
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1526
    ^ trapMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1527
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
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1530
                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
  1531
                   onEntry:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1532
                    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
  1533
                               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
  1534
                               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
  1535
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1536
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1537
     (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
  1538
     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
  1539
     (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
  1540
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1541
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1542
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1543
                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
  1544
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1545
                               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
  1546
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1547
                    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
  1548
                               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
  1549
                               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
  1550
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1551
                           ].
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:'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
  1553
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1554
     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
  1555
     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
  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
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1558
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1559
     |lvl|
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
     lvl := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1562
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1563
                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
  1564
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1565
                               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
  1566
                               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
  1567
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1568
                    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
  1569
                               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
  1570
                               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
  1571
                               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
  1572
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1573
                           ].
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:'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
  1575
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1576
     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
  1577
     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
  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
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1580
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1581
    "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
  1582
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1583
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1584
!MessageTracer class methodsFor:'method timing'!
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1585
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1586
executionTimesOfMethod:aMethod
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1587
    "return the current gathered execution time statistics"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1588
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1589
    |info|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1590
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1591
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1592
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1593
	    info := ( MethodTiming at:(aMethod originalMethod) ifAbsent:nil ) copy.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1594
	].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1595
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1596
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1597
    info isNil ifTrue:[ info := MethodTimingInfo new ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1598
    ^ info
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1599
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1600
    "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
  1601
    "Modified: / 05-03-2007 / 15:46:17 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1602
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1603
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1604
resetExecutionTimesOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1605
    "reset the gathered execution times statistics for aMethod;
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1606
     the method remains wrapped."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1607
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1608
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1609
	MethodTiming removeKey:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1610
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1611
	    MethodTiming removeKey:aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1612
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1613
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1614
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1615
    "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
  1616
    "Modified: / 05-03-2007 / 15:36:59 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1617
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1618
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1619
stopTimingMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1620
    "remove timing of aMethod"
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
    ^ self unwrapMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1623
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1624
    "Modified: 15.12.1995 / 15:43:53 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1625
    "Created: 17.6.1996 / 17:04:03 / cg"
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
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1628
timeMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1629
    "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
  1630
     Use unwrapMethod: or stopTimingMethod: to remove this."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1631
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1632
    |t0|
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1633
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1634
    MethodTiming isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1635
	MethodTiming := IdentityDictionary new.
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 removeKey:aMethod ifAbsent:nil.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1638
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1639
    TimeForWrappers isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1640
	self getTimeForWrappers
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1641
    ].
693
cd020921a251 use microsecond resolution in method timing
Claus Gittinger <cg@exept.de>
parents: 691
diff changeset
  1642
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1643
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1644
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1645
			t0 := OperatingSystem getMicrosecondTime.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1646
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1647
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1648
			|info t cnt minT maxT sumTimes|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1649
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1650
			t := OperatingSystem getMicrosecondTime - t0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1651
			t := t - TimeForWrappers.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1652
			t < 0 ifTrue:[t := 0].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1653
			t := t / 1000.0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1654
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1655
			MethodTiming isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1656
			    MethodTiming := IdentityDictionary new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1657
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1658
			info := MethodTiming at:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1659
			info isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1660
			    MethodTiming at:aMethod put:(info := MethodTimingInfo new)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1661
			] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1662
			    info rememberExecutionTime:t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1663
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1664
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1665
			aMethod changed:#statistics.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1666
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1667
		]
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1668
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1669
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1670
     MessageTracer timeMethod:(Integer compiledMethodAt:#factorial).
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1671
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1672
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1673
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1674
     (MessageTracer executionTimesOfMethod:(Integer compiledMethodAt:#factorial)) printCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1675
     MessageTracer stopTimingMethod:(Integer compiledMethodAt:#factorial)
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1676
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1677
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1678
    "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
  1679
    "Modified: / 05-03-2007 / 15:34:01 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1680
! !
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1681
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1682
!MessageTracer class methodsFor:'method tracing'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1683
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1684
traceClass:aClass selector:aSelector
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1685
    "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
  1686
     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
  1687
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1688
    self traceClass:aClass selector:aSelector on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1689
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1690
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1691
     MessageTracer traceClass:Integer selector:#factorial.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1692
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1693
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1694
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1695
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1696
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1697
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1698
     MessageTracer untraceClass:SequenceableCollection
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1699
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1700
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1701
     MessageTracer traceClass:Array selector:#at:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1702
     MessageTracer traceClass:Array selector:#at:put:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1703
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1704
     MessageTracer untraceClass:Array
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1705
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1706
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1707
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1708
traceClass:aClass selector:aSelector on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1709
    "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
  1710
     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
  1711
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1712
    self traceMethod:(aClass compiledMethodAt:aSelector) on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1713
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
     MessageTracer traceClass:Integer selector:#factorial on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1716
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1717
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1718
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1719
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1720
     MessageTracer traceClass:Integer selector:#factorialR on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1721
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1722
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1723
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1724
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1725
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1726
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1727
traceMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1728
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1729
     when aMethod is executed. Traces both entry and exit.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1730
     Use unwrapMethod to remove this."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1731
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1732
    ^ self traceMethod:aMethod on:Stderr
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1733
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1734
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1735
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1736
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1737
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1738
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1739
    "
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1740
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1741
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1742
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1743
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1744
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1745
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1746
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1747
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1748
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1749
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1750
     dont do this:
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
     MessageTracer traceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1754
     MessageTracer traceMethod:(Object compiledMethodAt:#at:put:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1755
     #(6 1 9 66 2 17) copy sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1756
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1757
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:put:).
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1758
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1759
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1760
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1761
traceMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1762
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1763
     when aMethod is executed. Traces both entry and exit.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1764
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1765
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1766
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1767
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1768
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1769
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1770
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1771
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1772
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1773
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1774
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1775
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1776
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1777
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1778
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1779
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1780
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1781
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1782
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1783
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1784
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1785
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1786
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1787
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1788
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1789
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1790
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1791
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1792
		]
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1793
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1794
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1795
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1796
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1797
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1798
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1799
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1800
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1801
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1802
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1803
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1804
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1805
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1806
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1807
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1808
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1809
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1810
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1811
traceMethodAll:aMethod
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1812
    "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
  1813
     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
  1814
     Use untraceMethod to remove this trace.
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1815
     This is for system debugging only;
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1816
     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
  1817
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1818
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1819
	      onEntry:[:con | ObjectMemory flushCaches. ObjectMemory sendTraceOn.]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1820
	      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
  1821
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1822
    "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
  1823
!
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1824
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1825
traceMethodEntry:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1826
    "arrange for a trace message to be output on stdErr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1827
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1828
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1829
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1830
    ^ self traceMethodEntry:aMethod on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1831
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1832
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1833
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1834
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1835
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1836
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1837
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1838
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1839
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1840
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1841
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1842
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1843
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1844
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1845
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1846
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1847
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1848
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1849
traceMethodEntry:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1850
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1851
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1852
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1853
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1854
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1855
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1856
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1857
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1858
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1859
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1860
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1861
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1862
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1863
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1864
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1865
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1866
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1867
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1868
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1869
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1870
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1871
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1872
	 onExit:nil
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1873
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1874
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1875
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1876
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1877
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1878
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1879
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1880
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1881
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1882
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1883
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1884
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1885
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1886
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1887
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1888
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1889
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1890
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1891
traceMethodFull:aMethod
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1892
    "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
  1893
     Only the sender is traced on entry.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1894
     Use untraceMethod to remove this trace."
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1895
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1896
    ^ self traceMethodFull:aMethod on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1897
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1898
    "Created: 15.12.1995 / 18:19:31 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1899
    "Modified: 22.10.1996 / 17:39:28 / cg"
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1902
traceMethodFull:aMethod on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1903
    "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
  1904
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1905
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1906
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1907
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1908
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1909
	onEntry:(self traceFullBlockFor:aStream)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1910
	onExit:LeaveTraceBlock.
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1911
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  1912
    "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
  1913
    "Modified: 22.10.1996 / 17:39:28 / cg"
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1916
traceMethodSender:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1917
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1918
     when amethod is executed.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1919
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1920
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1921
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1922
    ^ self traceMethodSender:aMethod on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1923
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1924
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1925
traceMethodSender:aMethod on:aStream
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1926
    "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
  1927
     Only the sender is traced on entry.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1928
     Use untraceMethod to remove this trace."
35
claus
parents: 31
diff changeset
  1929
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1930
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1931
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1932
	onEntry:(self traceSenderBlockFor:aStream)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1933
	onExit:LeaveTraceBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1934
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1935
    "Modified: 22.10.1996 / 17:39:33 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1936
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1937
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1938
traceUpdateMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1939
    "arrange for a trace message to be output on aStream,
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1940
     when aMethod is executed.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1941
     Traces both entry and exit.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1942
     Use unwrapMethod to remove this.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1943
     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
  1944
     back to the origial change message."
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1945
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1946
    |lvl inside|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1947
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1948
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1949
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1950
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1951
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1952
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1953
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1954
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1955
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1956
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1957
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1958
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1959
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1960
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1961
			    MessageTracer printUpdateEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1962
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1963
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1964
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1965
	onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1966
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1967
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1968
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1969
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1970
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1971
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1972
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1973
		]
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1974
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  1975
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1976
tracelogMethod:aMethod
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1977
    "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
  1978
     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
  1979
     Use unwrapMethod to remove this."
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1980
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1981
    |lvl inside|
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1982
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  1983
    ^ self wrapMethod:aMethod
3627
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1984
         onEntry:[:con |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1985
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1986
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1987
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1988
                            CallingLevel isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1989
                                CallingLevel := 0.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1990
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1991
                            lvl notNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1992
                                lvl := lvl + 1
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1993
                            ] ifFalse:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1994
                                CallingLevel := lvl := CallingLevel + 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1995
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1996
                            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
  1997
                            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
  1998
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  1999
                        ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2000
                 ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2001
         onExit:[:con :retVal |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2002
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2003
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2004
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2005
                            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
  2006
                            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
  2007
                            CallingLevel := lvl := lvl - 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2008
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2009
                        ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2010
                        retVal
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2011
                ]
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2012
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2013
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2014
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2015
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2016
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2017
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2018
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2019
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2020
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2021
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2022
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2023
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2024
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2025
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2026
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2027
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2028
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2029
    "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
  2030
    "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
  2031
!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2032
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2033
untraceMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2034
    "remove tracing of aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2035
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2036
    "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
  2037
     trace facilities ..."
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
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2040
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2041
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2042
!MessageTracer class methodsFor:'method wrapping'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2043
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2044
unwrapAllMethods
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2045
    "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
  2046
     on them; this removes them all"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2047
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2048
    WrappedMethod allInstancesDo:[:aWrapperMethod |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2049
	aWrapperMethod unregister.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2050
	self unwrapMethod:aWrapperMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2051
    ]
1145
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2052
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2053
    "
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2054
     MessageTracer unwrapAllMethods
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2055
    "
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2056
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2057
    "Modified: / 01-07-2011 / 10:02:47 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2058
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2059
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2060
unwrapMethod:aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2061
    "remove any wrapper on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2062
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2063
    |selector class originalMethod dict mthd|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2064
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2065
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2066
	originalMethod := aMethod originalMethod.
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2067
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2068
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2069
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2070
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2071
	    MethodCounts removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2072
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2073
	MethodCounts removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2074
	MethodCounts := MethodCounts asNilIfEmpty.
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2075
    ].
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2076
    MethodMemoryUsage notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2077
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2078
	    MethodMemoryUsage removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2079
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2080
	MethodMemoryUsage removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2081
	MethodMemoryUsage := MethodMemoryUsage asNilIfEmpty.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2082
    ].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2083
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2084
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2085
	    MethodTiming removeKey:originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2086
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2087
	MethodTiming removeKey:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2088
	MethodTiming := MethodTiming asNilIfEmpty.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2089
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2090
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2091
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2092
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2093
    (aMethod isNil or:[aMethod isWrapped not]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2094
	^ aMethod
88
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2097
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2098
     get class/selector
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
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2101
    class isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2102
	'MessageTracer [info]: no containing class for method found' infoPrintCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2103
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2104
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2105
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2106
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2107
    originalMethod isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2108
	self error:'oops, could not find original method' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2109
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2110
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2111
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2112
    dict := class methodDictionary.
506
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2113
    mthd := dict at:selector ifAbsent:nil.
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2114
    mthd notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2115
	dict at:selector put:originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2116
	class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2117
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2118
	'MessageTracer [info]: no containing class for method found' infoPrintCR.
667
62df9b9b7664 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 666
diff changeset
  2119
"/        self halt:'oops, unexpected error - cannot remove wrap'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2120
	aMethod becomeSameAs:originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2121
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2122
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2123
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2124
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2125
584
2da6bb2c8017 send out change notifications when a trap is removed
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
  2126
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2127
    MethodTrapChangeNotificationParameter notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2128
	Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2129
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2130
    ^ originalMethod
265
f3fb9bec2d4a printNL -> printCR
Claus Gittinger <cg@exept.de>
parents: 258
diff changeset
  2131
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  2132
    "Modified: / 05-06-1996 / 14:08:08 / stefan"
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2133
    "Modified: / 04-10-2007 / 16:41:01 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2134
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2135
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2136
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2137
    ^ 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
  2138
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2139
    "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
  2140
!
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
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock onUnwind:unwindBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2143
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2144
     aMethod is evaluated.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2145
     EntryBlock will be called on entry, and gets the current context passed as argument.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2146
     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
  2147
     the methods return value as arguments.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2148
     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
  2149
     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
  2150
     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
  2151
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2152
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2153
    |selector class trapMethod s spec src dict sel saveUS xselector|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2154
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2155
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2156
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
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2159
     but only if not already being trapped.
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
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2162
	^ aMethod
88
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 isLazyMethod ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2165
	aMethod makeRealMethod
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2168
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2169
     get class/selector
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
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2172
    class isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2173
	self error:'cannot place trap (no containing class found)' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2174
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2175
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2176
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2177
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2178
    WrappedMethod autoload. "/ for small systems
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2179
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
     get a new method-spec
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2182
    "
730
635af002b783 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 729
diff changeset
  2183
    xselector := '_x'.
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2184
    aMethod numArgs timesRepeat:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2185
	xselector := xselector , '_:'
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2186
    ].
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2187
    spec := Parser methodSpecificationForSelector:xselector.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2188
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2189
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2190
     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
  2191
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2192
    s := WriteStream on:String new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2193
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  2194
    s nextPutAll:' <context: #return>'.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2195
    s nextPutAll:' |retVal context| '.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2196
    s nextPutAll:' context := thisContext.'.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2197
    unwindBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2198
	s nextPutAll:'['.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2199
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2200
    entryBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2201
	s nextPutAll:'#entryBlock yourself value:context. '.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2202
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2203
    s nextPutAll:'retVal := #originalMethod yourself';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2204
      nextPutAll:             ' valueWithReceiver:(context receiver)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2205
      nextPutAll:             ' arguments:(context args)';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2206
      nextPutAll:             ' selector:(context selector)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2207
      nextPutAll:             ' search:(context searchClass)';
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2208
      nextPutAll:             ' sender:nil. '.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2209
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2210
    exitBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2211
	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
  2212
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2213
    unwindBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2214
	s nextPutAll:'] ifCurtailed:#unwindBlock yourself.'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2215
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2216
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2217
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2218
    src := s contents.
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2219
    saveUS := Compiler allowUnderscoreInIdentifier.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2220
    ParserFlags
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2221
	withSTCCompilation:#never
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2222
	do:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2223
	    [
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2224
		Compiler allowUnderscoreInIdentifier:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2225
		Class withoutUpdatingChangesDo:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2226
		    trapMethod := Compiler
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2227
				    compile:src
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2228
				    forClass:UndefinedObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2229
				    inCategory:aMethod category
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2230
				    notifying:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2231
				    install:false
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2232
				    skipIfSame:false
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2233
				    silent:false. "/ true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2234
		]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2235
	    ] ensure:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2236
		Compiler allowUnderscoreInIdentifier:saveUS.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2237
	    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2238
	].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2239
955
0516771efa2a preserve a methods packageID when wrapping
Claus Gittinger <cg@exept.de>
parents: 950
diff changeset
  2240
    trapMethod setPackage:aMethod package.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2241
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2242
    trapMethod register.
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2243
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2244
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2245
     raising our eyebrows here ...
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2246
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2247
    entryBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2248
	trapMethod changeLiteral:#entryBlock to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2249
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
  2250
    trapMethod changeLiteral:#originalMethod to:aMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2251
    exitBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2252
	trapMethod changeLiteral:#exitBlock to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2253
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2254
    unwindBlock notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2255
	trapMethod changeLiteral:#unwindBlock to:unwindBlock.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2256
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2257
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2258
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2259
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2260
    "
840
5ec82d6c2e55 care for the wrappers source info (to allow source access in browser)
Claus Gittinger <cg@exept.de>
parents: 825
diff changeset
  2261
"/    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
  2262
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2263
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2264
    dict := class methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2265
    sel := dict at:selector ifAbsent:[0].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2266
    sel == 0 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2267
	self error:'oops, unexpected error' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2268
	^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2269
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2270
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2271
    dict at:selector put:trapMethod.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2272
    class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2273
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2274
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2275
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2276
    MethodTrapChangeNotificationParameter notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2277
	Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2278
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2279
    ^ trapMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2280
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2281
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2282
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2283
		wrapMethod:(Point compiledMethodAt:#scaleBy:)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2284
		   onEntry:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2285
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2286
			       Transcript show:'leave Point>>scaleBy:; returning:'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2287
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2288
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2289
			   ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2290
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2291
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2292
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2293
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2294
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2295
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2296
		wrapMethod:(Integer compiledMethodAt:#factorial)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2297
		   onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2298
			       Transcript showCR:('entering ' , con receiver printString , '>>factorial').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2299
			   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2300
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2301
			       Transcript show:'leave Integer>>factorial; returning:'.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2302
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2303
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2304
			   ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2305
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2306
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2307
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2308
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2309
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2310
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2311
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2312
     |lvl|
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
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2315
     MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2316
		wrapMethod:(Integer compiledMethodAt:#factorial)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2317
		   onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2318
			       Transcript spaces:lvl. lvl := lvl + 2.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2319
			       Transcript showCR:('entering ' , con receiver printString , '>>factorial').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2320
			   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2321
		    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2322
			       lvl := lvl - 2. Transcript spaces:lvl.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2323
			       Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2324
			       Transcript showCR:retVal printString.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2325
			       Transcript endEntry
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2326
			   ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2327
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2328
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2329
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2330
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2331
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2332
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  2333
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2334
    "Modified: / 25-06-1996 / 22:04:51 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2335
    "Modified: / 01-07-2011 / 10:01:48 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2336
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2337
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2338
!MessageTracer class methodsFor:'object breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2339
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2340
objectHasWraps:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2341
    "return true, if anObject has any wraps"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2342
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2343
    ^ anObject class category == #'* trapping *'
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2344
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2345
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2346
realClassOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2347
    "return anObjects real class"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2348
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2349
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2350
	^ anObject class
525
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 superclass
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2353
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2354
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2355
trap:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2356
    "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
  2357
     sent to anObject. Use untrap to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2358
     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
  2359
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2360
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2361
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2362
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2363
	 onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2364
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2365
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2366
     |p|
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
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2369
     MessageTracer trap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2370
     p x:5
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2371
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2372
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2373
    "Modified: 22.10.1996 / 17:39:41 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2374
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2375
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2376
trap:anObject selectors:aCollection
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2377
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2378
	 selectors:aCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2379
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2380
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2381
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2382
    "Modified: 22.10.1996 / 17:39:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2383
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2384
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2385
trapAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2386
    "trap on all messages which are understood by anObject"
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
    self wrapAll:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2389
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2390
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2391
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2392
    "Modified: 22.10.1996 / 17:39:54 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2393
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2394
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2395
trapAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2396
    "trap on all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2397
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2398
    self trap:anObject selectors:aClass selectors
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2399
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2400
    "Modified: 5.6.1996 / 13:46:06 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2401
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2402
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2403
untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2404
    "remove any traps on anObject"
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
    "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
  2407
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2408
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2409
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2410
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2411
    orgClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2412
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2413
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2414
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2415
    anObject changeClassTo:orgClass superclass.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2416
    ObjectCopyHolders notNil ifTrue:[
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2417
	ObjectCopyHolders removeKey:anObject ifAbsent:nil.
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2418
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2419
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2420
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2421
     |p|
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
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2424
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2425
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2426
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2427
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2428
     MessageTracer untrap:p
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2429
     p y:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2430
     p x:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2431
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2432
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2433
    "Modified: / 21.4.1998 / 15:43:33 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2434
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2435
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2436
untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2437
    "remove trap on aSelector from anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2438
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  2439
    |orgClass dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2440
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2441
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2442
    orgClass category == #'* trapping *' ifFalse:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2443
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2444
    dict := orgClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2445
    dict at:aSelector ifAbsent:[^ 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 size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2448
	"the last trap got removed"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2449
	anObject changeClassTo:orgClass superclass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2450
	ObjectCopyHolders notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2451
	    ObjectCopyHolders removeKey:anObject ifAbsent:nil.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2452
	].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2453
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2454
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2455
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2456
    orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2457
    ObjectMemory flushCaches. "avoid calling the old trap method"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2458
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2459
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2460
     |p|
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
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2463
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2464
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2465
     'trace both ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2466
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2467
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2468
     'trace only y ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2469
     MessageTracer untrap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2470
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2471
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2472
     'trace none ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2473
     MessageTracer untrap:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2474
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2475
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2476
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2477
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2478
    "Modified: / 5.6.1996 / 13:56:08 / stefan"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2479
    "Modified: / 21.4.1998 / 15:43:55 / cg"
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2480
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2481
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2482
wrappedSelectorsOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2483
    "return the set of wrapped selectors (if any)"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2484
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2485
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2486
	^ #()
525
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 selectors
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2489
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2490
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2491
!MessageTracer class methodsFor:'object modification traps'!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2492
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2493
trapModificationsIn:anObject
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2494
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2495
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2496
    self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2497
	trapModificationsIn:anObject filter:[:old :new | true]
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2498
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2499
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2500
     |a|
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
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2503
     MessageTracer trapModificationsIn: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 size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2506
     a at:1.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2507
     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
  2508
     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
  2509
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2510
     a at:3.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2511
     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
  2512
     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
  2513
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2514
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2515
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2516
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2517
    "Created: / 21.4.1998 / 14:32:34 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2518
    "Modified: / 21.4.1998 / 14:58:24 / cg"
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
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2521
trapModificationsIn:anObject filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2522
    "trap modifications in anObject"
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
    |allSelectors|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2525
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2526
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2527
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2528
	aClass methodDictionary keys addAllTo:allSelectors
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2529
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2530
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2531
    self trapModificationsIn:anObject selectors:allSelectors filter:aFilterBlock
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
    "trap if arrays 5th slot is modified:
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2534
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2535
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2536
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2537
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2538
     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
  2539
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2540
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2541
     a at:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2542
     a at:2 put:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2543
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2544
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2545
     a at:3.
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 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2548
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2549
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2550
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2551
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2552
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2553
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2554
    "Modified: / 21.4.1998 / 15:53:38 / cg"
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
trapModificationsIn:anObject selector:aSelector filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2558
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2559
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2560
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2561
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2562
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2563
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2564
	trapModificationsIn:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2565
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2566
	filter:aFilterBlock
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2567
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2568
    "Modified: / 21.4.1998 / 15:34:44 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2569
!
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
trapModificationsIn:anObject selectors:aCollectionOfSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2572
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2573
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2574
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2575
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2576
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2577
    |copyHolder sels checkBlock|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2578
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2579
    (anObject isNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2580
	or:[anObject isSymbol
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2581
	or:[anObject class == SmallInteger
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2582
	or:[anObject == true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2583
	or:[anObject == false]]]])
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2584
    ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2585
	self error:'cannot place trap on this object' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2586
	^ self.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2587
    ].
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2588
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2589
    ObjectCopyHolders isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2590
	ObjectCopyHolders := WeakIdentityDictionary new.
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
    copyHolder := ObjectCopyHolders at:anObject ifAbsent:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2593
    copyHolder isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2594
	ObjectCopyHolders at:anObject put:(copyHolder := ValueHolder new).
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2595
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2596
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2597
    copyHolder value:(anObject shallowCopy).
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2598
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2599
    "/ 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
  2600
    "/ do no harm to the object ... consider this a kludge
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2601
    sels := aCollectionOfSelectors copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2602
    sels removeAll:#(#class #species #yourself #'sameContentsAs:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2603
		     #'instVarAt:' #'at:' #'basicAt:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2604
		     #'shallowCopy' #'copy'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2605
		     #'=' #'==' #'~=' #'~~'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2606
		     #'size'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2607
		    ).
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2608
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2609
    checkBlock :=
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2610
		   [:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2611
			|oldValue|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2612
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2613
			oldValue :=  copyHolder value.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2614
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2615
			"/ compare with copy ...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2616
			(anObject sameContentsAs:oldValue) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2617
			    "/ see oldValue vs. anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2618
			    (aFilterBlock value:oldValue value:anObject) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2619
				copyHolder value:(anObject shallowCopy).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2620
				ObjectWrittenBreakpointSignal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2621
				    raiseRequestWith:(oldValue -> anObject)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2622
				    errorString:('object was modififed in: ' , con sender selector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2623
				    in:con sender
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2624
			    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2625
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2626
		   ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2627
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2628
    sels do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2629
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2630
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2631
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2632
	    onEntry:[:con | ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2633
	    onExit:checkBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2634
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2635
	    flushCaches:false.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2636
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2637
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2638
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2639
    "Created: / 21.4.1998 / 15:34:05 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2640
    "Modified: / 21.4.1998 / 16:00:39 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2641
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2642
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2643
trapModificationsOf:anInstVarOrOffset in:anObject
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2644
    "trap modifications in anObject"
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
    |idx selectors definingClass|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2647
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2648
    anInstVarOrOffset isInteger ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2649
	"/ indexed slot
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2650
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2651
	    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
  2652
   ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2653
	"/ instVar by name
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2654
	selectors := IdentitySet new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2655
	definingClass := anObject class whichClassDefinesInstVar:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2656
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2657
	definingClass withAllSuperclassesDo:[:aClass |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2658
	    aClass methodDictionary keys addAllTo:selectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2659
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2660
	idx := anObject class instVarIndexFor:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2661
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2662
	    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
  2663
   ]
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2664
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2665
    "
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2666
     |a|
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
     a := Array new:10.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2669
     MessageTracer trapModificationsOf:2 in: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 size.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2672
     a at:1.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2673
     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
  2674
     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
  2675
     a at:2.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2676
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2677
     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
  2678
     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
  2679
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2680
     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
  2681
     MessageTracer untrace:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2682
     a at:3 put:5.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2683
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2684
! !
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2685
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2686
!MessageTracer class methodsFor:'object tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2687
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2688
trace:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2689
    "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
  2690
     aSelector is sent to anObject. Both entry and exit are traced.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2691
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2692
     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
  2693
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2694
    self trace:anObject selector:aSelector on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2695
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2696
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2697
     |p|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  2698
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2699
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2700
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2701
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2702
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2703
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2704
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2705
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2706
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2707
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2708
     |a|
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
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2711
     MessageTracer trace:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2712
     MessageTracer trace:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2713
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2714
    "
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  2715
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2716
    "Modified: / 21.4.1998 / 15:37:05 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2717
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2718
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2719
trace:anObject selector:aSelector on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2720
    "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
  2721
     aSelector is sent to anObject. Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2722
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2723
     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
  2724
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2725
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2726
	trace:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2727
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2728
	on:aStream
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2729
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2730
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2731
     |p|
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
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2734
     MessageTracer trace:p selector:#x: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2735
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2736
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2737
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2738
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2739
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2740
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2741
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2742
     |a|
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
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2745
     MessageTracer trace:a selector:#at:put: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2746
     MessageTracer trace:a selector:#at:.    on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2747
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2748
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2749
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2750
    "Modified: / 21.4.1998 / 15:37:05 / cg"
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
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2753
trace:anObject selectors:aCollectionOfSelectors
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2754
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2755
     from aCollectionOfSelectors is sent to anObject.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2756
     Both entry and exit are traced.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2757
     Use untrap:/untrace: to remove this trace.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2758
     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
  2759
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2760
    self trace:anObject selectors:aCollectionOfSelectors on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2761
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2762
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2763
     |p|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2764
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2765
     p := Point new.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2766
     MessageTracer trace:p selector:#x:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2767
     p x:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2768
     p y:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2769
     p x:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2770
     MessageTracer untrap:p.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2771
     p x:7
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2772
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2773
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2774
     |a|
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
     a := #(6 1 9 66 2 17) copy.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2777
     MessageTracer trace:a selector:#at:put:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2778
     MessageTracer trace:a selector:#at:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2779
     a sort.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2780
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2781
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2782
    "Modified: / 21.4.1998 / 15:41:57 / cg"
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
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2785
trace:anObject selectors:aCollectionOfSelectors on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2786
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2787
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2788
     Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2789
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2790
     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
  2791
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2792
    aCollectionOfSelectors do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2793
	|methodName|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2794
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2795
	methodName := anObject class name , '>>' , aSelector.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2796
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2797
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2798
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2799
	    onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2800
			aStream nextPutAll:'enter '; nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2801
			aStream nextPutAll:' receiver='.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2802
			con receiver printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2803
			aStream nextPutAll:' args='. (con args) printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2804
			aStream nextPutAll:' from:'. con sender printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2805
			aStream cr; flush
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2806
		    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2807
	    onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2808
			aStream nextPutAll:'leave '; nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2809
			aStream nextPutAll:' receiver='. con receiver printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2810
			aStream nextPutAll:' returning:'. retVal printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2811
			aStream cr; flush
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2812
		   ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2813
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2814
	    flushCaches:false
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2815
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2816
    ObjectMemory flushCaches
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2817
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
     |p|
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
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2822
     MessageTracer trace:p selectors:#(x:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2823
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2824
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2825
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2826
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2827
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2828
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2829
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2830
     |a|
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
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2833
     MessageTracer trace:a selectors:#( at:put: at:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2834
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2835
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2836
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2837
    "Modified: / 21.4.1998 / 15:41:57 / cg"
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2840
traceAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2841
    "trace all messages which are understood by anObject"
27
claus
parents: 26
diff changeset
  2842
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2843
    self traceAll:anObject on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2844
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2845
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2846
     trace all (implemented) messages sent to Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2847
     (other messages lead to an error, anyway)
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2850
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2851
     MessageTracer traceAll:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2852
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2853
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2854
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2855
    "Modified: 5.6.1996 / 13:43:51 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2856
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2857
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2858
traceAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2859
    "trace all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2860
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2861
    self traceAll:anObject from:aClass on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2862
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2863
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2864
     trace all methods in Display, which are implemented
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2865
     in the DisplayWorkstation class.
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2868
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2869
     MessageTracer traceAll:Display from:XWorkstation
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2870
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2871
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2872
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2873
    "Modified: 5.6.1996 / 13:45:37 / stefan"
27
claus
parents: 26
diff changeset
  2874
!
claus
parents: 26
diff changeset
  2875
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2876
traceAll:anObject from:aClass on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2877
    "trace all messages defined in aClass sent to anObject"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2878
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2879
    self trace:anObject selectors:aClass selectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2880
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
     trace all methods in Display, which are implemented
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2883
     in the DisplayWorkstation class.
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2886
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2887
     MessageTracer traceAll:Display from:XWorkstation on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2888
     MessageTracer untrace:Display
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2891
    "Modified: 5.6.1996 / 13:45:37 / stefan"
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
traceAll:anObject on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2895
    "trace all messages which are understood by anObject"
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
    |allSelectors|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2898
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2899
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2900
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2901
	aClass methodDictionary keys addAllTo:allSelectors
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2902
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2903
    self trace:anObject selectors:allSelectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2904
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
     trace all (implemented) messages sent to Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2907
     (other messages lead to an error, anyway)
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2910
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2911
     MessageTracer traceAll:Display on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2912
     MessageTracer untrace:Display
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2915
    "Modified: 5.6.1996 / 13:43:51 / stefan"
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
traceEntry:anObject selectors:aCollectionOfSelectors on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2919
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2920
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2921
     Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2922
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2923
     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
  2924
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2925
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2926
	traceEntry:anObject selectors:aCollectionOfSelectors on:Stderr
664
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
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2929
     |p|
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
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2932
     MessageTracer traceEntry:p selectors:#(x:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2933
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2934
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2935
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2936
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2937
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2938
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2939
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2940
     |a|
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
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2943
     MessageTracer traceEntry:a selectors:#( at:put: at:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2944
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2945
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2946
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2947
    "Modified: / 21.4.1998 / 15:41:57 / cg"
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2950
traceSender:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2951
    "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
  2952
     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
  2953
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2954
     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
  2955
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2956
    ^ self traceSender:anObject selector:aSelector on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2957
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2958
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2959
     |p|
27
claus
parents: 26
diff changeset
  2960
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2961
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2962
     MessageTracer traceSender:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2963
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2964
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2965
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2966
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2967
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2968
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2969
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2970
     |a|
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
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2973
     MessageTracer traceSender:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2974
     MessageTracer traceSender:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2975
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2976
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2977
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  2978
    "Modified: 10.1.1997 / 17:54:53 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2979
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2980
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2981
traceSender:anObject selector:aSelector on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2982
    "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
  2983
     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
  2984
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2985
     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
  2986
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2987
    |methodName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2988
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2989
    methodName := anObject class name , '>>' , aSelector.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2990
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2991
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2992
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2993
		     aStream nextPutAll:methodName.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2994
		     aStream nextPutAll:' from '.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2995
		     con sender printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2996
		     aStream cr; flush.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2997
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2998
	 onExit:LeaveTraceBlock.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2999
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3000
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3001
     |p|
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
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3004
     MessageTracer traceSender:p selector:#x: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3005
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3006
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3007
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3008
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3009
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3010
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3011
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3012
     |a|
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
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3015
     MessageTracer traceSender:a selector:#at:put: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3016
     MessageTracer traceSender:a selector:#at:.    on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3017
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3018
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3019
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3020
    "Modified: 10.1.1997 / 17:54:53 / cg"
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3023
untrace:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3024
    "remove any traces on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3025
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3026
    "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
  3027
     trace facilities ..."
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
    ^ self untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3030
!
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
untrace:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3033
    "remove traces of aSelector sent to anObject"
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
    "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
  3036
     trace facilities ..."
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
    ^ self untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3039
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3040
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3041
!MessageTracer class methodsFor:'object wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3042
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3043
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3044
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3045
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3046
     entry, and get the current context passed as argument. ExitBlock will be called,
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3047
     when the method is left, and get the context and the methods return value as arguments.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3048
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3049
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3050
    "I have not yet enough experience, if the wrapped original method should
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3051
     run as an instance of the original, or of the catching class;
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3052
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3053
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3054
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3055
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3056
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3057
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3058
	wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3059
	selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3060
	onEntry:entryBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3061
	onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3062
	withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3063
	flushCaches:true
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3064
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3065
    "Modified: / 21.4.1998 / 15:29:50 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3066
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3067
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3068
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
  3069
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3070
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3071
     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
  3072
     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
  3073
     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
  3074
     before the wrapped method will be called.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3075
     NOTICE: The current implementation does not allow integers or nil to be wrapped."
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3076
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3077
    |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
  3078
     originalMethod|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3079
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3080
    "
27
claus
parents: 26
diff changeset
  3081
     some are not allowed (otherwise we get into trouble ...)
claus
parents: 26
diff changeset
  3082
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3083
    (aSelector == #class
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3084
    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
  3085
        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
  3086
        ^ self
27
claus
parents: 26
diff changeset
  3087
    ].
claus
parents: 26
diff changeset
  3088
claus
parents: 26
diff changeset
  3089
    WrappedMethod autoload.     "/ just to make sure ...
claus
parents: 26
diff changeset
  3090
claus
parents: 26
diff changeset
  3091
    "
3393
943250332a24 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3347
diff changeset
  3092
     create a new (anonymous) subclass of the receiver's class
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3093
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3094
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3095
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  3096
    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
  3097
        newClass := orgClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3098
    ] 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
  3099
        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
  3100
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3101
        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
  3102
        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
  3103
        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
  3104
        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
  3105
        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
  3106
        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
  3107
        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
  3108
        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
  3109
        newClass methodDictionary:MethodDictionary new.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3110
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3111
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3112
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3113
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3114
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3115
    spec := Parser methodSpecificationForSelector:aSelector.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3116
    s := WriteStream on:String new.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3117
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  3118
    s nextPutAll:' <context: #return>'.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3119
    s nextPutAll:' |retVal stubClass '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3120
    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
  3121
        s nextPutAll:additionalVariables.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3122
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3123
    s nextPutAll:'| '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3124
    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
  3125
        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
  3126
        s nextPutAll:'self changeClassTo:(stubClass superclass). '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3127
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3128
    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
  3129
        s nextPutAll:additionalEntryCode.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3130
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3131
    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
  3132
        s nextPutAll:'#literal1 yourself value:thisContext. '.               "/ #literal1 will be replaced by the entryBlock
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3133
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3134
    s nextPutAll:('retVal := #originalMethod. ').                            "/ just to get a place for the originalMethod
27
claus
parents: 26
diff changeset
  3135
    s nextPutAll:('retVal := super ' , spec , '. ').
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3136
    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
  3137
        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
  3138
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3139
    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
  3140
        s nextPutAll:additionalExitCode.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3141
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3142
    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
  3143
        s nextPutAll:'self changeClassTo:stubClass. '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3144
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3145
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3146
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3147
    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
  3148
        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
  3149
        do:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3150
            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
  3151
                [
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3152
                    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
  3153
                                    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
  3154
                                    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
  3155
                                    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
  3156
                                    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
  3157
                                    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
  3158
                                    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
  3159
                                    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
  3160
                ] 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
  3161
                    "/ 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
  3162
                    "/ 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
  3163
                    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
  3164
                ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3165
            ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3166
        ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3167
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3168
    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
  3169
        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
  3170
        ^ self
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3171
    ].
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3172
29
claus
parents: 27
diff changeset
  3173
    implClass := orgClass whichClassIncludesSelector:aSelector.
claus
parents: 27
diff changeset
  3174
    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
  3175
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
29
claus
parents: 27
diff changeset
  3176
    ] 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
  3177
        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
  3178
        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
  3179
            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
  3180
        ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3181
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 changeLiteral:#originalMethod to:originalMethod.
29
claus
parents: 27
diff changeset
  3183
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3184
    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
  3185
        trapMethod changeLiteral:#literal1 to:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3186
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3187
    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
  3188
        trapMethod changeLiteral:#literal2 to:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3189
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3190
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3191
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3192
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3193
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3194
    trapMethod source:'this is a wrapper method - not the real one'.
27
claus
parents: 26
diff changeset
  3195
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3196
    trapMethod register.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3197
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3198
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3199
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3200
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3201
    dict := newClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3202
    dict := dict at:aSelector putOrAppend:trapMethod.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3203
    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
  3204
        newClass methodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3205
    ] 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
  3206
        newClass setMethodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3207
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3208
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3209
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3210
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3211
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3212
    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
  3213
        anObject changeClassTo:newClass
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3214
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3215
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3216
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3217
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3218
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3219
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3220
     p := Point new copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3221
     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
  3222
                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
  3223
            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
  3224
             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
  3225
              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
  3226
                         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
  3227
                         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
  3228
                         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
  3229
                     ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3230
               withOriginalClass:true.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3231
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3232
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3233
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3234
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3235
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3236
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3237
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3238
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3239
     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
  3240
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3241
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3242
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3243
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3244
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3245
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3246
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3247
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3248
     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
  3249
               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
  3250
                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
  3251
                 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
  3252
                  withOriginalClass:false.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3253
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3254
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3255
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3256
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3257
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3258
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3259
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3260
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3261
     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
  3262
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3263
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  3264
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3265
    "Modified: / 25-06-1996 / 22:11:21 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3266
    "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
  3267
    "Modified: / 29-07-2014 / 11:58:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3268
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3269
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3270
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
  3271
    "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
  3272
     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
  3273
     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
  3274
     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
  3275
     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
  3276
     before the wrapped method will be called.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3277
     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
  3278
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3279
    ^ self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3280
	wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3281
	additionalEntryCode:nil additionalExitCode:nil  additionalVariables:nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3282
	withOriginalClass:withOriginalClass flushCaches:flushCaches
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3283
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3284
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3285
wrap:anObject selectors:aCollection onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3286
    "install wrappers for anObject on all selectors from aCollection"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3287
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3288
    aCollection do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3289
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3290
	    wrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3291
	    onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3292
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3293
	    flushCaches:false
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3294
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3295
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3296
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3297
    "Modified: / 21.4.1998 / 15:40:28 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3298
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3299
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3300
wrapAll:anObject onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3301
    "install wrappers for anObject on all implemented selectors"
27
claus
parents: 26
diff changeset
  3302
claus
parents: 26
diff changeset
  3303
    |allSelectors|
claus
parents: 26
diff changeset
  3304
claus
parents: 26
diff changeset
  3305
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3306
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3307
	aClass methodDictionary keys addAllTo:allSelectors
27
claus
parents: 26
diff changeset
  3308
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3309
    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
  3310
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3311
    "Modified: 5.6.1996 / 14:50:07 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3312
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3313
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3314
!MessageTracer class methodsFor:'queries'!
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3315
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3316
allWrappedMethods
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3317
    ^ WrappedMethod allWrappedMethods. 
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3318
    "/ ^ Smalltalk allMethodsForWhich:[:mthd | mthd isWrapped]
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3319
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3320
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3321
areAnyMethodsWrapped
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3322
    ^ WrappedMethod allWrappedMethods notEmpty.
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3323
"/    Smalltalk allMethodsDo:[:mthd |
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3324
"/        mthd isWrapped ifTrue:[ ^ true ]
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3325
"/    ].
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3326
"/    ^ false
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3327
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3328
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3329
isCounting:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3330
    "return true if aMethod is counted"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3331
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3332
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3333
	(MethodCounts includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3334
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3335
	    (MethodCounts includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3336
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3337
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3338
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3339
	(MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3340
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3341
	    (MethodCountsPerReceiverClass includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3342
	].
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3343
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3344
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3345
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3346
    "Created: 15.12.1995 / 11:07:58 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3347
    "Modified: 15.12.1995 / 15:42:10 / cg"
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
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3350
isCountingByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3351
    "return true if aMethod is counted with per receiver class statistics"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3352
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3353
    MethodCountsPerReceiverClass isNil ifTrue:[^ false].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3354
    (MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3355
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3356
	^ MethodCountsPerReceiverClass includesKey:aMethod originalMethod
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3357
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3358
    ^ false
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3359
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3360
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3361
isMocking:aMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3362
    "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
  3363
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3364
    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
  3365
    ^ false
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
    "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
  3368
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3369
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3370
isTiming:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3371
    "return true if aMethod is timed"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3372
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3373
    MethodTiming isNil ifTrue:[^ false].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3374
    (MethodTiming includesKey:aMethod) ifTrue:[^ true].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3375
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3376
	^ MethodTiming includesKey:aMethod originalMethod
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3377
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3378
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3379
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3380
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3381
    "Created: 17.6.1996 / 17:04:29 / cg"
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
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3384
isTrapped:aMethod
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3385
    "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
  3386
     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
  3387
     this returns false)"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3388
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3389
    aMethod isWrapped ifFalse:[^ false].
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3390
    ^ aMethod basicLiterals includesIdentical:LeaveBreakBlock
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
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3393
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3394
     Transcript showCR:(Collection compiledMethodAt:#select:) isWrapped.
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3395
     Transcript showCR:(MessageTracer isTrapped:(Collection compiledMethodAt:#select:)).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3396
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3397
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3398
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3399
    "Modified: 22.10.1996 / 17:40:37 / cg"
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
!MessageTracer class methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3403
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3404
dummyEmptyMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3405
    "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
  3406
     a dummy method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3407
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3408
    "Created: / 30.7.1998 / 16:58:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3409
!
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
getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3412
    "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
  3413
     a timed method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3414
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3415
    |m times|
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3416
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3417
    TimeForWrappers := 0.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3418
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3419
    "/ wrap the dummy method ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3420
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3421
    m := self class compiledMethodAt:#dummyEmptyMethod.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3422
    m := self timeMethod:m.
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
    "/ invoke it a few times ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3425
    "/ (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
  3426
    "/  depends on whether there is already some statistic data)
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3427
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3428
    10 timesRepeat:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3429
	self dummyEmptyMethod.
694
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
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3432
    "/ fetch min time & unwrap
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
    times := self executionTimesOfMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3435
    self stopTimingMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3436
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3437
    ^ (TimeForWrappers := times avgTime)
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3438
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3439
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3440
     self getTimeForWrappers
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
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3443
    "Modified: / 05-03-2007 / 15:44:24 / cg"
694
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3446
printEntryFull:aContext
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3447
    self printEntryFull:aContext level:0 on:Stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3448
!
27
claus
parents: 26
diff changeset
  3449
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3450
printEntryFull:aContext level:lvl
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3451
    self printEntryFull:aContext level:lvl on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3452
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3453
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3454
printEntryFull:aContext level:lvl on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3455
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3456
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3457
	nextPutAll:'enter '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3458
    self printFull:aContext on:aStream withSender:true.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3459
!
27
claus
parents: 26
diff changeset
  3460
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3461
printEntryFull:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3462
    self printEntryFull:aContext level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3463
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3464
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3465
printEntrySender:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3466
    |sender mClass mClassName|
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
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3469
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3470
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3471
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3472
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3473
    ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3474
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3475
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3476
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3477
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3478
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3479
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3480
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3481
	nextPutAll:' from '.
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3482
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3483
    sender := aContext sender.
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3484
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3485
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3486
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3487
	].
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3488
    ].
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3489
    sender printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3490
    aStream cr; flush.
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3491
695
88a741b6008f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 694
diff changeset
  3492
    "Modified: / 30.7.1998 / 20:40:14 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3493
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3494
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3495
printExit:aContext with:retVal
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3496
    self printExit:aContext with:retVal level:0 on:Stderr
27
claus
parents: 26
diff changeset
  3497
!
claus
parents: 26
diff changeset
  3498
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3499
printExit:aContext with:retVal level:lvl
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3500
    self printExit:aContext with:retVal level:lvl on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3501
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3502
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3503
printExit:aContext with:retVal level:lvl on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3504
    |mClass mClassName|
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
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3507
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3508
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3509
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3510
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3511
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3512
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3513
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3514
	nextPutAll:'leave ';
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3515
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3516
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3517
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3518
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3519
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3520
	nextPutAll:' rec=['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3521
1486
d7ae9a86ea38 print same receiver on entry and exit
Stefan Vogel <sv@exept.de>
parents: 1472
diff changeset
  3522
    self printObject:aContext receiver on:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3523
    aStream nextPutAll:'] return: ['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3524
    retVal printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3525
    aStream nextPutAll:']'; cr; flush.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3526
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3527
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3528
printExit:aContext with:retVal on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3529
    self printExit:aContext with:retVal level:0 on:aStream
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
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3532
printFull:aContext on:aStream withSender:withSender
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3533
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3534
	printFull:aContext on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3535
	withSenderContext:(withSender ifTrue:[aContext sender]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3536
				      ifFalse:[nil])
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3537
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3538
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3539
printFull:aContext on:aStream withSenderContext:aSenderContextOrNil
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3540
    |mClass mClassName|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3541
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3542
    mClass := aContext methodClass.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3543
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3544
	mClassName := '???'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3545
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3546
	mClassName := mClass name
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3547
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3548
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3549
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3550
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3551
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3552
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3553
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3554
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3555
	nextPutAll:' rec=['.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3556
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3557
    self printObject:aContext receiver on:aStream.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3558
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3559
    aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3560
    (aContext args) keysAndValuesDo:[:idx :arg |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3561
	aStream nextPutAll:'arg'. idx printOn:aStream. aStream nextPutAll:'=['.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3562
	self printObject:arg on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3563
	aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3564
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3565
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3566
    aSenderContextOrNil notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3567
	self printSender:aSenderContextOrNil on:aStream.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3568
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3569
    aStream cr; flush.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3570
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3571
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3572
printObject:anObject on:aStream
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3573
    |s|
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3574
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3575
    s := anObject printString.
2085
21d40e42e3fa Better traces of object printStrings
Stefan Vogel <sv@exept.de>
parents: 2004
diff changeset
  3576
    s size > 40 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3577
	s := s chopTo:40.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3578
    ].
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3579
    aStream nextPutAll:s
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3580
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3581
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3582
printSender:aSenderContext on:aStream
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3583
    |sender|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3584
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3585
    sender := aSenderContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3586
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3587
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3588
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3589
	].
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3590
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3591
    aStream nextPutAll:'from:'.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3592
    aStream bold.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3593
    sender printOn:aStream.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3594
    aStream normal.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3595
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3596
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3597
printUpdateEntryFull:aContext level:lvl on:aStream
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3598
    |con|
1071
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
    con := aContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3601
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3602
    [con notNil
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3603
     and:[con selector ~~ #'changed:with:']
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3604
    ] whileTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3605
	con := con sender.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3606
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3607
    "/ con is #'changed:with:'
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3608
    con isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3609
	^ self printEntryFull:aContext level:lvl on:aStream.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3610
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3611
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3612
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3613
    and:[ con sender selector == #'changed:']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3614
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3615
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3616
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3617
    and:[ con sender selector == #'changed']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3618
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3619
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3620
    (con sender notNil) 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
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3623
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3624
    aStream spaces:lvl; nextPutAll:'enter '.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3625
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3626
	printFull:aContext
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3627
	on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3628
	withSenderContext:con
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3629
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3630
697
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3631
traceEntryFull:aContext on:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3632
    aStream nextPutLine:'-----------------------------------------'.
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3633
    aContext fullPrintAllOn:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3634
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3635
    "Created: / 30.7.1998 / 20:39:57 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3636
    "Modified: / 30.7.1998 / 20:42:23 / cg"
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
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3639
traceFullBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3640
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3641
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3642
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3643
	^ TraceFullBlock2
664
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 == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3646
	^ TraceFullBlock
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
    ^ [:con | con fullPrintAllOn:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3649
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
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
traceSenderBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3655
    "avoid generation of fullBlocks"
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
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3658
	^ TraceSenderBlock2
664
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 == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3661
	^ TraceSenderBlock
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
    ^ [:con | MessageTracer printEntrySender:con on:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3664
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
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3667
! !
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  3668
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3669
!MessageTracer methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3670
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3671
trace:aBlock detail:fullDetail
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3672
    "trace execution of aBlock."
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
    traceDetail := fullDetail.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3675
    tracedBlock := aBlock.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3676
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3677
    ObjectMemory stepInterruptHandler:self.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3678
    ^ [
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3679
	ObjectMemory flushInlineCaches.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3680
	StepInterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3681
	InterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3682
	aBlock value
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
  3683
    ] ensure:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3684
	tracedBlock := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3685
	StepInterruptPending := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3686
	ObjectMemory stepInterruptHandler:nil.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3687
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3688
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3689
    "
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3690
     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
  3691
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3692
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3693
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3694
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3695
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3696
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3697
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3698
! !
27
claus
parents: 26
diff changeset
  3699
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3700
!MessageTracer::InteractionCollector methodsFor:'trace helpers'!
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3701
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3702
stepInterrupt
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3703
    StepInterruptPending := nil.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3704
    ObjectMemory flushInlineCaches.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3705
    StepInterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3706
    InterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3707
! !
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  3708
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3709
!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
  3710
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3711
profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3712
    ^ profiler
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
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3715
profiler:aMessageTally
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3716
    profiler := aMessageTally.
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
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3719
!MessageTracer::MethodTimingInfo methodsFor:'accessing'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3720
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3721
avgTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3722
    sumTimes notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3723
	^ sumTimes / count
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3724
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3725
    ^ nil
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3726
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3727
    "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
  3728
!
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
avgTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3731
    |avg|
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
    avg := self avgTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3734
    avg > 100 ifTrue:[ ^ avg roundTo:1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3735
    avg > 10 ifTrue:[ ^ avg roundTo:0.1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3736
    avg > 1 ifTrue:[ ^ avg roundTo:0.01 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3737
    ^ avg roundTo:0.001
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3738
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3739
    "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
  3740
!
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
count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3743
    ^ count
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
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3746
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
  3747
    count := countArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3748
    minTime := minTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3749
    maxTime := maxTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3750
    sumTimes := sumTimesArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3751
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3752
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3753
maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3754
    ^ maxTime
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
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3757
maxTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3758
    |max|
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
    max := self maxTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3761
    ^ 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
  3762
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3763
    "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
  3764
!
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
minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3767
    ^ minTime
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
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3770
minTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3771
    |min|
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
    min := self minTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3774
    ^ 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
  3775
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3776
    "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
  3777
!
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
sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3780
    ^ sumTimes
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
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3783
!MessageTracer::MethodTimingInfo methodsFor:'initialization'!
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
rememberExecutionTime:t
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3786
    (count isNil or:[count == 0]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3787
	minTime := maxTime := sumTimes := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3788
	count := 1.
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3789
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3790
	t < minTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3791
	    minTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3792
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3793
	    t > maxTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3794
		maxTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3795
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3796
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3797
	sumTimes := (sumTimes + t).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3798
	count := count + 1
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3799
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3800
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3801
    "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
  3802
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3803
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3804
!MessageTracer::PrintingMessageTracer methodsFor:'accessing'!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3805
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3806
output:something
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3807
    output := something.
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
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3810
!MessageTracer::PrintingMessageTracer methodsFor:'trace helpers'!
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3811
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3812
stepInterrupt
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3813
    "called for every send while tracing"
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3814
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  3815
    |ignore sel con r outStream senderContext|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3816
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3817
    StepInterruptPending := nil.
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  3818
    con := senderContext := thisContext sender.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3819
    ignore := false.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  3820
    outStream := output ? Stderr.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3821
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3822
    con receiver == Processor ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3823
	(sel := con selector) == #threadSwitch: ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3824
	    ignore := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3825
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3826
	sel == #timerInterrupt ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3827
	    ignore := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3828
	]
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3829
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3830
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3831
    con lineNumber == 1 ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3832
	ignore := true
734
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
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3835
    ignore ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3836
	con markForInterruptOnUnwind.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3837
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3838
	((r := con receiver) ~~ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3839
	and:[r ~~ tracedBlock]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3840
	    traceDetail == #fullIndent ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3841
		[con notNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3842
		and:[(r := con receiver) ~~ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3843
		and:[r ~~ tracedBlock]]] whileTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3844
		    '  ' printOn:outStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3845
		    con := con sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3846
		].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3847
		con := senderContext.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3848
		self class printFull:con on:outStream withSender:false.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3849
	    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3850
		traceDetail == #indent ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3851
		    [con notNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3852
		    and:[(r := con receiver) ~~ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3853
		    and:[r ~~ tracedBlock]]] whileTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3854
			'  ' printOn:outStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3855
			con := con sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3856
		    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3857
		    con := senderContext.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3858
		    con printOn:outStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3859
		    outStream cr.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3860
		] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3861
		    traceDetail == true ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3862
			self class printFull:con on:outStream withSender:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3863
		    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3864
			con printOn:outStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3865
			outStream cr.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3866
		    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3867
		]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3868
	    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3869
	].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3870
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3871
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3872
    ObjectMemory flushInlineCaches.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3873
    StepInterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3874
    InterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3875
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3876
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3877
     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
  3878
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3879
     self new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3880
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3881
     self new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3882
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3883
     self new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3884
     self new trace:[ View new ] detail:#fullIndent
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3885
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3886
! !
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3887
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3888
!MessageTracer class methodsFor:'documentation'!
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  3889
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
  3890
version_CVS
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  3891
    ^ '$Header: /cvs/stx/stx/libbasic3/MessageTracer.st,v 1.136 2015-02-01 09:21:20 vrany Exp $'
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  3892
! !
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
  3893
3130
cf77484583b8 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2972
diff changeset
  3894
27
claus
parents: 26
diff changeset
  3895
MessageTracer initialize!