MessageTracer.st
author Claus Gittinger <cg@exept.de>
Wed, 29 Jan 2020 15:04:22 +0100
changeset 4544 99c2956f85fa
parent 4533 d75502a4c955
child 4547 39478d06eadd
permissions -rw-r--r--
#UI_ENHANCEMENT by cg class: CVSSourceCodeManager class changed: #checkin:text:directory:module:logMessage:force:onBranch: #checkinClass:fileName:directory:module:source:logMessage:force:asBranch:
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.
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
   344
     ExitBlock will be called, when the method is left, and get context and the method's return value as arguments.
88
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
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   357
    s := WriteStream on:''.
88
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   373
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   374
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   375
            Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   376
                trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   377
                                compile:s contents
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   378
                                forClass:orgClass
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   379
                                inCategory:'trapping'
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   380
                                notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   381
                                install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   382
                                skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   383
                                silent:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   384
            ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   414
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   415
        orgClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   416
        newClass := orgClass superclass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   417
    ] ifFalse:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   418
        myMetaclass := orgClass class.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   419
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   420
        newClass := myMetaclass copy new.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   421
        newClass setSuperclass:orgClass superclass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   422
        newClass instSize:orgClass instSize.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   423
        newClass flags:orgClass flags.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   424
        newClass setClassVariableString:orgClass classVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   425
        newClass setSharedPoolNames:(orgClass sharedPoolNames).
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   426
        newClass setInstanceVariableString:orgClass instanceVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   427
        newClass setName:orgClass name.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   428
        newClass setCategory:orgClass category.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   429
        newClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   430
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   431
        orgClass setSuperclass:newClass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   432
        orgClass setClassVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   433
        orgClass setInstanceVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   434
        orgClass setCategory:#'* trapping *'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   435
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   436
        dict := MethodDictionary new:1.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   437
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   446
                wrapClass:Point
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   447
                 selector:#scaleBy:
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   448
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   449
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   450
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   451
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   452
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   453
                           ].
3577
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
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   460
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   461
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   462
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   463
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   464
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   465
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   466
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   467
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   468
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   481
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   482
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   483
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   484
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   485
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   486
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   487
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   488
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   489
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   490
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   491
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
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"
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
   502
    "Modified (comment): / 21-11-2017 / 13:03:22 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   503
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   504
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   505
!MessageTracer class methodsFor:'cleanup'!
27
claus
parents: 26
diff changeset
   506
claus
parents: 26
diff changeset
   507
cleanup
claus
parents: 26
diff changeset
   508
    "if you forgot which classes/methods where wrapped and/or trapped,
claus
parents: 26
diff changeset
   509
     this cleans up everything ..."
claus
parents: 26
diff changeset
   510
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   511
    ObjectCopyHolders := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   512
    MethodCounts := MethodMemoryUsage := MethodTiming := TimeForWrappers := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   513
27
claus
parents: 26
diff changeset
   514
    self untrapAllClasses.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   515
    self unwrapAllMethods.
27
claus
parents: 26
diff changeset
   516
claus
parents: 26
diff changeset
   517
    "
claus
parents: 26
diff changeset
   518
     MessageTracer cleanup
claus
parents: 26
diff changeset
   519
    "
claus
parents: 26
diff changeset
   520
! !
claus
parents: 26
diff changeset
   521
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
   522
!MessageTracer class methodsFor:'execution trace'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   523
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   524
debugTrace:aBlock
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   525
    "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
   526
     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
   527
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   528
    ObjectMemory sendTraceOn.
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
   529
    ^ aBlock ensure:[ObjectMemory sendTraceOff]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   530
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   531
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   532
     MessageTracer debugTrace:[#(6 5 4 3 2 1) sort]
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   533
    "
196
330cc5c849de debugOn/Off is now called sendTraceOn/Off
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   534
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   535
    "Modified: / 31.7.1998 / 16:39:43 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   536
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   537
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   538
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   539
    "evaluate aBlock sending trace information to stdout.
27
claus
parents: 26
diff changeset
   540
     Return the value of the block."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   541
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   542
     ^ self trace:aBlock on:(Processor activeProcess stderr)
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   543
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   544
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   545
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   546
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   547
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   548
    "Modified (comment): / 29-06-2019 / 09:05:58 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   549
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   550
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   551
trace:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   552
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   553
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   554
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   555
    ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   556
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   557
	trace:aBlock detail:false.
2972
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
     MessageTracer trace:[#(6 5 4 3 2 1) sort] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   561
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   562
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   563
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   564
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   565
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   566
     Return the value of the block.
27
claus
parents: 26
diff changeset
   567
     The trace information is more detailed."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   568
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   569
     ^ self traceFull:aBlock on:(Processor activeProcess stderr)
2972
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
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   573
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   574
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   575
    "Modified (comment): / 29-06-2019 / 09:05:54 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   576
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   577
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   578
traceFull:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   579
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   580
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   581
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   582
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   583
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   584
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   585
	trace:aBlock detail:true.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   586
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   587
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   588
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   589
    "
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   590
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   591
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   592
traceFullIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   593
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   594
     Return the value of the block.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   595
     The trace information is more detailed."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   596
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   597
     ^ self traceFullIndented:aBlock on:(Processor activeProcess stderr)
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   598
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   599
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   600
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   601
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   602
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   603
    "Modified (comment): / 29-06-2019 / 09:05:51 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   604
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   605
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   606
traceFullIndented:aBlock on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   607
    "evaluate aBlock sending trace information to aStream.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   608
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   609
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   610
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   611
     ^ PrintingMessageTracer new
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   612
        output:aStream;
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   613
        trace:aBlock detail:#fullIndent.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   614
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   615
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   616
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   617
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   618
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   619
    "Modified (comment): / 29-06-2019 / 09:04:56 / Claus Gittinger"
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   620
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   621
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   622
traceIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   623
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   624
     Return the value of the block."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   625
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   626
     ^ self traceIndented:aBlock on:(Processor activeProcess stderr)
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   627
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   628
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   629
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   630
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   631
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   632
    "Modified (comment): / 29-06-2019 / 09:05:21 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   633
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   634
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   635
traceIndented:aBlock on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   636
    "evaluate aBlock sending trace information to aStream.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   637
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   638
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   639
     ^ PrintingMessageTracer new
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   640
        output:aStream;
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   641
        trace:aBlock detail:#indent.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   642
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   643
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   644
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   645
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   646
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   647
    "Modified (comment): / 29-06-2019 / 09:04:47 / Claus Gittinger"
88
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
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   650
!MessageTracer class methodsFor:'method breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   651
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   652
trapClass:aClass selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   653
    "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
   654
     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
   655
     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
   656
     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
   657
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   658
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   659
    self trapMethod:(aClass compiledMethodAt:aSelector)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   660
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   661
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   662
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   663
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   664
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   665
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   666
     MessageTracer untrapClass:Collection
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   667
    "
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   668
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   669
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   670
trapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   671
    "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
   672
     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
   673
     selective breakPoint.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   674
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   675
     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
   676
     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
   677
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   678
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   679
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   680
	      onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   681
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   682
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   683
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   684
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   685
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   686
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   687
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   688
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   689
    "
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   690
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   691
    "Modified: 22.10.1996 / 17:39:58 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   692
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   693
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   694
trapMethod:aMethod after:countInvocations
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   695
    "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
   696
     The trap is enabled for any process.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   697
     Use unwrapMethod or untrapClass to remove this trap.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   698
     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
   699
     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
   700
     entry/leave blocks."
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
    |n|
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   703
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   704
    n := 0.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   705
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   706
	      onEntry:[:con | n := n + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   707
			      n > countInvocations
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   708
			      ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   709
				BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   710
			      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   711
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   712
	       onExit:LeaveBreakBlock.
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   713
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   714
!
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   715
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   716
trapMethod:aMethod forInstancesOf:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   717
    "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
   718
     for an instance of aClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   719
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   720
     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
   721
     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
   722
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   723
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   724
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   725
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   726
			 (con receiver isMemberOf:aClass) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   727
			     BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   728
			 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   729
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   730
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   731
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   732
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   733
     MessageTracer trapMethod:(View compiledMethodAt:#redraw) forInstancesOf:myView.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   734
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   735
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   736
    "Modified: 22.10.1996 / 17:40:03 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   737
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   738
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   739
trapMethod:aMethod if:conditionBlock
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   740
    "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
   741
     evaluates to true.
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   742
     conditionBlock gets context and method as (optional) arguments.
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   743
     The trap is enabled for any process.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   744
     Use unwrapMethod or untrapClass to remove this trap.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   745
     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
   746
     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
   747
     entry/leave blocks."
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   748
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   749
    ^ self
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   750
        wrapMethod:aMethod
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   751
        onEntry:[:con |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   752
            |conditionFires|
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   753
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   754
            Error handle:[:ex |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   755
                'MessageTrace: error in breakpoint condition caught: ' errorPrint.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   756
                ex description errorPrintCR.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   757
            ] do:[
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   758
                conditionFires := conditionBlock value:con optionalArgument:aMethod
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   759
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   760
            conditionFires == true ifTrue:[
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   761
                BreakpointSignal raiseRequestWith:nil errorString:nil in:con
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   762
            ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   763
        ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   764
        onExit:LeaveBreakBlock.
2291
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   765
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   766
    "Created: / 18-08-2000 / 22:09:10 / cg"
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   767
    "Modified: / 20-10-2010 / 09:38:57 / cg"
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   768
    "Modified: / 08-03-2018 / 11:46:08 / stefan"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   769
!
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   770
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   771
trapMethod:aMethod inProcess:aProcess
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   772
    "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
   773
     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
   774
     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
   775
     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
   776
     Use unwrapMethod or untrapClass to remove this trap.
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   777
     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
   778
     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
   779
     entry/leave blocks."
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
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   782
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   783
			(Processor activeProcess processGroupId = aProcess id) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   784
			    BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   785
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   786
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   787
	       onExit:LeaveBreakBlock.
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   788
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   789
    "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
   790
    "Modified: 22.10.1996 / 17:40:06 / cg"
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   791
!
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   792
4498
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   793
trapMethod:aMethod inProcess:aProcess withChildProcesses:withChildProcessesBoolean
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   794
    "arrange for the debugger to be entered when aMethod is about to be executed,
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   795
     but only, if executed by aProcess or one of aProcess's offspring.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   796
     This allows for breakpoints to be set on system-critical code.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   797
     The trap will only fire for selected processes (making browsers etc. still usable).
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   798
     Use unwrapMethod or untrapClass to remove this trap.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   799
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   800
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   801
     entry/leave blocks."
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   802
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   803
    |pid|
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   804
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   805
    pid := aProcess id. "/ fetch here, so the child detection works even when aProcess has died
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   806
    ^ self wrapMethod:aMethod
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   807
              onEntry:[:con |
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   808
                        |active shouldBreak|
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   809
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   810
                        active := Processor activeProcess.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   811
                        withChildProcessesBoolean ifTrue:[
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   812
                            shouldBreak := (active processGroupId = pid) or:[ active creatorId = pid]    
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   813
                        ] ifFalse:[
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   814
                            shouldBreak := active processGroupId = pid.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   815
                        ].
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   816
                        shouldBreak ifTrue:[
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   817
                            BreakpointSignal raiseRequestWith:nil errorString:nil in:con
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   818
                        ]
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   819
                      ]
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   820
               onExit:LeaveBreakBlock.
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   821
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   822
    "Created: 14.10.1996 / 15:38:46 / cg"
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   823
    "Modified: 22.10.1996 / 17:40:06 / cg"
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   824
!
35be3dd8127f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 4494
diff changeset
   825
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   826
trapMethod:aMethod onReturnIf:conditionBlock
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   827
    "arrange for the debugger to be entered when aMethod returns
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   828
     and conditionBlock evaluates to true.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   829
     conditionBlock gets retVal, context and method as (optional) arguments.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   830
     The trap is enabled for any process.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   831
     Use unwrapMethod or untrapClass to remove this trap.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   832
     Be careful, to not place a trap on code needed in the debugger (i.e. on scrollBars etc.);
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   833
     if there is a need to trap those, use the low-level wrap-methods, and put a check into the
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   834
     entry/leave blocks."
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   835
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   836
    ^ self
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   837
        wrapMethod:aMethod
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   838
        onEntry:[:con | ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   839
        onExit:[:con :retVal | 
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   840
            |conditionFires|
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   841
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   842
            Error handle:[:ex |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   843
                'MessageTrace: error in breakpoint condition caught: ' errorPrint.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   844
                ex description errorPrintCR.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   845
            ] do:[
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   846
                conditionFires := conditionBlock valueWithOptionalArgument:retVal and:con and:aMethod
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   847
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   848
            conditionFires == true ifTrue:[
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   849
                BreakpointSignal raiseRequestWith:nil errorString:nil in:con
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   850
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   851
            retVal
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   852
        ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   853
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   854
    "Created: / 18-08-2000 / 22:09:10 / cg"
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   855
    "Modified: / 20-10-2010 / 09:38:57 / cg"
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   856
    "Modified: / 08-03-2018 / 11:47:57 / stefan"
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   857
!
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   858
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   859
untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   860
    "remove any traps on any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   861
970
116aa95d7b97 allBehaviors vs. allClasses
Claus Gittinger <cg@exept.de>
parents: 957
diff changeset
   862
    Smalltalk allClassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   863
	self untrapClass:aClass
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   864
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   865
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   866
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   867
     MessageTracer untrapAllClasses
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
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   870
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   871
untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   872
    "remove any traps on aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   873
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   874
    "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
   875
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   876
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   877
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   878
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   879
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   880
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   881
    orgClass := aClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   882
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   883
    aClass setSuperclass:orgClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   884
    aClass setClassVariableString:orgClass classVariableString.
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   885
    aClass setSharedPoolNames:(orgClass sharedPoolNames).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   886
    aClass setInstanceVariableString:orgClass instanceVariableString.
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
   887
    aClass setCategory:orgClass category.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   888
    aClass methodDictionary:orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   889
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   890
    ObjectMemory flushCaches.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   891
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   892
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   893
     MessageTracer untrapClass:Point
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   894
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   895
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   896
    "Modified: / 05-06-1996 / 13:57:39 / stefan"
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   897
    "Modified: / 18-01-2011 / 20:43:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   898
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   899
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   900
untrapClass:aClass selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   901
    "remove trap of aSelector sent to aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   902
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   903
    |dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   904
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   905
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   906
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   907
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   908
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   909
    dict := aClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   910
    dict at:aSelector ifAbsent:[^ self].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   911
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   912
    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
   913
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   914
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   915
	"the last trapped method"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   916
	^ self untrapClass:aClass
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   917
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   918
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   919
    aClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   920
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   921
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   922
     MessageTracer trapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   923
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   924
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   925
     MessageTracer trapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   926
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   927
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   928
     MessageTracer untrapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   929
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   930
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   931
     MessageTracer untrapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   932
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   933
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   934
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   935
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   936
    "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
   937
    "Modified: 10.9.1996 / 20:06:29 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   938
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   939
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   940
untrapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   941
    "remove break on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   942
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   943
    "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
   944
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   945
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   946
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   947
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   948
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   949
!MessageTracer class methodsFor:'method breakpointing - new'!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   950
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   951
breakMethod: method atLine: line
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   952
    "Installs new breakpoint in given method at given line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   953
     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
   954
     installed"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   955
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   956
    | analyzer map lines i breakpoint table |
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   957
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   958
    (ConfigurableFeatures includesFeature: #VMBreakpointSupport) ifFalse:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   959
        self error: 'Breakpoint support not present'.
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   960
        ^nil.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   961
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   962
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   963
    analyzer := BreakpointAnalyzer parseMethodSilent:(method source) in:(method mclass).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   964
    map := analyzer messageSendMap.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   965
    lines := map keys asSortedCollection.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   966
    i := lines indexForInserting: line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   967
    i > lines size ifTrue:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   968
        ^nil
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   969
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   970
    breakpoint := Breakpoint new line: (lines at: i).
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   971
    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
   972
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   973
    table := method breakpointTable.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   974
    table isNil ifTrue:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   975
        "/old way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   976
        "/table := Array with: (breakpoint line) with: breakpoint.
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   977
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   978
        "/new way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   979
        table := Array with: breakpoint.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   980
    ] ifFalse:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   981
        "/old way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   982
        "/table := table, (Array with: (breakpoint line) with: breakpoint).
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   983
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   984
        "/new way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   985
        table := table copyWith: breakpoint
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   986
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   987
    method breakpointTable: table.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   988
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   989
    ^breakpoint
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   990
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   991
    "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
   992
    "Modified: / 24-04-2013 / 19:40:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   993
    "Modified (format): / 20-02-2019 / 10:51:37 / Claus Gittinger"
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   994
! !
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   995
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   996
!MessageTracer class methodsFor:'method counting'!
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   997
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   998
countMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   999
    "arrange for a aMethod's execution to be counted.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1000
     Use unwrapMethod to remove this."
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1001
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1002
    MethodCounts isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1003
	MethodCounts := IdentityDictionary new.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1004
    ].
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1005
    MethodCounts at:aMethod put:0.
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1006
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1007
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1008
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1009
			|cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1010
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1011
			cnt := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1012
			MethodCounts at:aMethod put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1013
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1014
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1015
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1016
	 onExit:nil
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1017
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1018
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1019
     MessageTracer countMethod:(Integer compiledMethodAt:#factorial).
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1020
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1021
     MessageTracer executionCountOf:(Integer compiledMethodAt:#factorial) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1022
     MessageTracer stopCountingMethod:(Integer compiledMethodAt:#factorial)
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1023
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1024
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1025
    "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
  1026
    "Modified: / 27.7.1998 / 10:47:46 / cg"
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1027
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1028
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1029
countMethodByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1030
    "arrange for a aMethod's execution to be counted and maintain
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1031
     a per-receiver class profile.
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1032
     Use unwrapMethod to remove this."
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1033
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1034
    MethodCountsPerReceiverClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1035
	MethodCountsPerReceiverClass := IdentityDictionary new.
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1036
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1037
    MethodCountsPerReceiverClass at:aMethod put:(IdentityDictionary new).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1038
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1039
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1040
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1041
			|cls perMethodCounts cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1042
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1043
			cls := (con receiver class).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1044
			perMethodCounts := MethodCountsPerReceiverClass at:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1045
			cnt := perMethodCounts at:cls ifAbsentPut:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1046
			perMethodCounts at:cls put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1047
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1048
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1049
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1050
	 onExit:nil
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1051
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1052
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1053
     MessageTracer countMethodWithReceiverStatistic:(Collection compiledMethodAt:#detect:).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1054
     NewSystemBrowser open.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1055
     MessageTracer executionCountsOf:(Collection compiledMethodAt:#detect:) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1056
     MessageTracer stopCountingMethod:(Collection compiledMethodAt:#detect:)
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1057
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1058
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1059
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1060
executionCountOfMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1061
    "return the current count"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1062
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1063
    |count counts|
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1064
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1065
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1066
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1067
	    count := MethodCounts at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1068
	    count notNil ifTrue:[^ count].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1069
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1070
	^ MethodCounts at:aMethod ifAbsent:0
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1071
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1072
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1073
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1074
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1075
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1076
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1077
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1078
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1079
	^ (counts collect:[:eachClassCountAssoc | eachClassCountAssoc value]) sum
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1080
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1081
    ^ 0
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1082
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1083
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1084
executionCountsByReceiverClassOfMethod:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1085
    "return a collection mapping receiver class to call counts"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1086
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1087
    |counts|
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1088
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1089
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1090
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1091
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1092
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1093
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1094
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1095
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1096
	^ counts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1097
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1098
    ^ #()
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1099
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1100
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1101
resetCountOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1102
    "return the current count"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1103
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1104
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1105
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1106
	    MethodCounts at:aMethod originalMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1107
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1108
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1109
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1110
    "Created: / 30.7.1998 / 17:42:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1111
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1112
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1113
stopCountingMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1114
    "remove counting of aMethod"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1115
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1116
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1117
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1118
	    MethodCounts removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1119
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1120
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1121
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1122
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1123
	    MethodCountsPerReceiverClass removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1124
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1125
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1126
    ^ self unwrapMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1127
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1128
    "Modified: 15.12.1995 / 15:43:53 / cg"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1129
! !
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1130
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1131
!MessageTracer class methodsFor:'method memory usage'!
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1132
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1133
countMemoryUsageOfMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1134
    "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
  1135
     Use unwrapMethod to remove this."
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1136
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  1137
    |oldPriority oldScavengeCount oldNewUsed|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1138
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1139
    MethodCounts isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1140
        MethodCounts := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1141
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1142
    MethodMemoryUsage isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1143
        MethodMemoryUsage := IdentityDictionary new.
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
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1146
    MethodCounts at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1147
    MethodMemoryUsage at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1148
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1149
    ^ self wrapMethod:aMethod
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1150
         onEntry:[:con |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1151
                        oldPriority := Processor activeProcess changePriority:(Processor userInterruptPriority).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1152
                        oldNewUsed := ObjectMemory newSpaceUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1153
                        oldScavengeCount := ObjectMemory scavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1154
                 ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1155
         onExit:[:con :retVal |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1156
             |cnt memUse scavenges|
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1157
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1158
             memUse := ObjectMemory newSpaceUsed - oldNewUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1159
             scavenges := ObjectMemory scavengeCount - oldScavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1160
             scavenges ~~ 0 ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1161
                memUse := memUse + (ObjectMemory newSpaceSize * scavenges)
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1162
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1163
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1164
             MethodCounts notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1165
                 cnt := MethodCounts at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1166
                 MethodCounts at:aMethod put:(cnt + 1).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1167
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1168
             MethodMemoryUsage notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1169
                 cnt := MethodMemoryUsage at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1170
                 MethodMemoryUsage at:aMethod put:(cnt + memUse).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1171
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1172
             Processor activeProcess priority:oldPriority.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1173
             MessageTracer changed:#statistics: with:aMethod.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1174
             aMethod changed:#statistics.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1175
             retVal
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1176
         ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1177
         onUnwind:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1178
             oldPriority notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1179
                 Processor activeProcess priority:oldPriority
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1180
             ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1181
         ]
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1182
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1183
    "
2825
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1184
     MessageTracer countMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR).
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1185
     3 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1186
     Transcript showCR:(MessageTracer memoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1187
     MessageTracer stopCountingMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1188
    "
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1189
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1190
    "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
  1191
    "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
  1192
    "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
  1193
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1194
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1195
isCountingMemoryUsage:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1196
    "return true if aMethod is counting memoryUsage"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1197
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1198
    MethodMemoryUsage isNil ifTrue:[^ false].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1199
    (MethodMemoryUsage includesKey:aMethod) ifTrue:[^ true].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1200
    aMethod isWrapped ifTrue:[
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  1201
	^ MethodMemoryUsage includesKey:aMethod originalMethod
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1202
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1203
    ^ false
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1204
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1205
    "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
  1206
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1207
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1208
memoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1209
    "return the current count"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1210
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1211
    |count memUse orgMethod|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1212
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1213
    (MethodCounts isNil or:[MethodMemoryUsage isNil]) ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1214
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1215
	orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1216
	count := MethodCounts at:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1217
	memUse := MethodMemoryUsage at:orgMethod ifAbsent:nil.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1218
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1219
    memUse isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1220
	count := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1221
	memUse := MethodMemoryUsage at:aMethod ifAbsent:0.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1222
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1223
    count = 0 ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1224
    ^ memUse//count
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1225
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1226
    "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
  1227
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1228
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1229
resetMemoryUsageOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1230
    "reset the current usage"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1231
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1232
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1233
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1234
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1235
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1236
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1237
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1238
		MethodCounts at:orgMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1239
		MethodMemoryUsage at:orgMethod put:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1240
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1241
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1242
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1243
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1244
    "Created: / 30.7.1998 / 17:43:07 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1245
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1246
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1247
stopCountingMemoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1248
    "remove counting memory of aMethod"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1249
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1250
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1251
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1252
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1253
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1254
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1255
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1256
		MethodCounts removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1257
		MethodMemoryUsage removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1258
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1259
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1260
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1261
    ^ self unwrapMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1262
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1263
    "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
  1264
! !
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1265
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1266
!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
  1267
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1268
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
  1269
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1270
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1271
    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
  1272
    ^ 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
  1273
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1274
    "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
  1275
    "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
  1276
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1277
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1278
mockMethod: method do: block
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1279
    "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
  1280
     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
  1281
     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
  1282
     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
  1283
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1284
     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
  1285
     and then - optionally - the original method object.
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1286
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1287
     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
  1288
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1289
     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
  1290
             threads along their #creatorId. However, when the parent thread dies, 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1291
             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
  1292
             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
  1293
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1294
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1295
    | 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
  1296
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1297
    CallingLevel := 0.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1298
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1299
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1300
     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
  1301
     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
  1302
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1303
    (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
  1304
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1305
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1306
    method isLazyMethod ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1307
        method makeRealMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1308
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1309
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1310
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1311
     get class/selector
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
    class := method containingClass.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1314
    class isNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1315
        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
  1316
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1317
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1318
    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
  1319
    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1320
    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
  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
     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
  1324
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1325
    xselector := '_x'.
4494
51376091ab9e #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  1326
    method argumentCount timesRepeat:[
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1327
        xselector := xselector , '_:'
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
    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
  1330
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1331
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1332
     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
  1333
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1334
    src := '%(spec)
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
    <context: #return>
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1337
    | 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
  1338
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1339
    context := thisContext.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1340
    currentProcess := Processor activeProcess.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1341
    mock := false.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1342
    marker := #mockedMethodMarker yourself.
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
    [ 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
  1345
        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
  1346
        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
  1347
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1348
    mock ifTrue:[ 
3793
95cb401a7536 Fixes in #mockMethod:do: - correctly pass receiver and original method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3733
diff changeset
  1349
        mockedVal := #replacementBlock yourself valueWithOptionalArguments: (((Array with: context receiver) , (context args)) copyWith: #originalMethod)
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1350
    ] ifFalse:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1351
        mockedVal := #originalMethod yourself
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1352
                        valueWithReceiver:(context receiver)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1353
                        arguments:(context args)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1354
                        selector:(context selector)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1355
                        search:(context searchClass)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1356
                        sender:nil.
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
    ^  mockedVal'.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1359
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1360
    src := src expandPlaceholdersWith:
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1361
        (Dictionary new
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1362
            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
  1363
            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
  1364
            yourself).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1365
        
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1366
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1367
    ParserFlags
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1368
        withSTCCompilation:#never
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1369
        do:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1370
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1371
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1372
                Class withoutUpdatingChangesDo:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1373
                    trapMethod := Compiler
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1374
                                    compile:src
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1375
                                    forClass:UndefinedObject
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1376
                                    inCategory:method category
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1377
                                    notifying:nil
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1378
                                    install:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1379
                                    skipIfSame:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1380
                                    silent:false. "/ true.
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
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1383
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
3609
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
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1387
    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
  1388
    trapMethod changeClassTo:WrappedMethod.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1389
    trapMethod register.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1390
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1391
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1392
     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
  1393
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1394
    block notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1395
        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
  1396
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1397
    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
  1398
    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
  1399
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1400
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1401
     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
  1402
     (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
  1403
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1404
    trapMethod source: src.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1405
"/    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
  1406
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1407
    dict := class methodDictionary.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1408
    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
  1409
    sel == 0 ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1410
        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
  1411
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1412
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1413
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1414
    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
  1415
    class methodDictionary:dict.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1416
    ObjectMemory flushCaches.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1417
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1418
    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
  1419
    MethodTrapChangeNotificationParameter notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1420
        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
  1421
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1422
    ^ trapMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1423
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1424
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1425
     MessageTracer
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1426
                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
  1427
                do: [ :color |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1428
                    Color red
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1429
                ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1430
     Color magenta.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1431
     [ [ Color magenta inspect ] fork. Delay waitForSeconds: 1. ] fork.
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1432
     (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
  1433
     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
  1434
     Color magenta.    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1435
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1436
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1437
    "Created: / 29-07-2014 / 09:44:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3793
95cb401a7536 Fixes in #mockMethod:do: - correctly pass receiver and original method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3733
diff changeset
  1438
    "Modified: / 18-02-2015 / 15:25:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1439
    "Modified: / 23-09-2018 / 01:16:31 / Claus Gittinger"
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1440
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1441
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1442
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
  1443
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1444
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1445
    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
  1446
    ^ self unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1447
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1448
    "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
  1449
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1450
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1451
unmockAllMethods
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1452
    "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
  1453
     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
  1454
     uses method mocking"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1455
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1456
    WrappedMethod allInstancesDo:[:method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1457
        method isMocked ifTrue:[    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1458
            method unregister.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1459
            self unwrapMethod: method.  
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1460
        ]        
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1461
    ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1462
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1463
    "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
  1464
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1465
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1466
unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1467
    "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
  1468
     #mockMethod:do:"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1469
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1470
    method isMocked ifTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1471
        self unwrapMethod: method  
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1472
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1473
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1474
    "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
  1475
! !
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1476
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1477
!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
  1478
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1479
spyMethod:aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1480
    "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
  1481
     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
  1482
     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
  1483
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1484
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1485
    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
  1486
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1487
    "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
  1488
!
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
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
  1491
    "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
  1492
     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
  1493
     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
  1494
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1495
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1496
    |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
  1497
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1498
    CallingLevel := 0.
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
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1501
     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
  1502
     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
  1503
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1504
    (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
  1505
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1506
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1507
    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
  1508
        aMethod makeRealMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1509
    ].
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
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1512
     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
  1513
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1514
    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
  1515
    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
  1516
        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
  1517
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1518
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1519
    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
  1520
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1521
    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
  1522
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1523
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1524
     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
  1525
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1526
    xselector := '_x'.
4494
51376091ab9e #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  1527
    aMethod argumentCount timesRepeat:[
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1528
        xselector := xselector , '_:'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1529
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1530
    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
  1531
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1532
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1533
    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
  1534
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1535
     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
  1536
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  1537
    s := WriteStream on:''.
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1538
    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
  1539
    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
  1540
    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
  1541
    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
  1542
    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
  1543
      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
  1544
      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
  1545
      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
  1546
      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
  1547
      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
  1548
      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
  1549
      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
  1550
      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
  1551
    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
  1552
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1553
    src := s contents.
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1554
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1555
    ParserFlags
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1556
        withSTCCompilation:#never
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1557
        do:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1558
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1559
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1560
                Class withoutUpdatingChangesDo:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1561
                    trapMethod := Compiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1562
                                    compile:src
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1563
                                    forClass:UndefinedObject
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1564
                                    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
  1565
                                    notifying:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1566
                                    install:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1567
                                    skipIfSame:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1568
                                    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
  1569
                ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1570
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1571
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1572
            ].
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
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1575
    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
  1576
    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
  1577
    trapMethod register.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1578
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
     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
  1581
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1582
    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
  1583
    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
  1584
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1585
     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
  1586
     (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
  1587
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1588
"/    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
  1589
    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
  1590
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1591
    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
  1592
    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
  1593
    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
  1594
        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
  1595
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1596
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1597
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1598
    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
  1599
    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
  1600
    ObjectMemory flushCaches.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1601
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1602
    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
  1603
    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
  1604
        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
  1605
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1606
    ^ trapMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1607
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1608
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1609
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1610
                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
  1611
                   onEntry:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1612
                    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
  1613
                               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
  1614
                               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
  1615
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1616
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1617
     (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
  1618
     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
  1619
     (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
  1620
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1621
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1622
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1623
                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
  1624
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1625
                               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
  1626
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1627
                    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
  1628
                               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
  1629
                               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
  1630
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1631
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1632
     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
  1633
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1634
     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
  1635
     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
  1636
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1637
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1638
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1639
     |lvl|
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1640
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1641
     lvl := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1642
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1643
                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
  1644
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1645
                               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
  1646
                               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
  1647
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1648
                    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
  1649
                               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
  1650
                               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
  1651
                               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
  1652
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1653
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1654
     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
  1655
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1656
     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
  1657
     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
  1658
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1659
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1660
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1661
    "Created: / 01-02-2015 / 09:22:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1662
    "Modified: / 23-09-2018 / 01:15:54 / Claus Gittinger"
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1663
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1664
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1665
!MessageTracer class methodsFor:'method timing'!
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1666
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1667
executionTimesOfMethod:aMethod
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1668
    "return the current gathered execution time statistics"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1669
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1670
    |info|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1671
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1672
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1673
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1674
	    info := ( MethodTiming at:(aMethod originalMethod) ifAbsent:nil ) copy.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1675
	].
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
    info isNil ifTrue:[ info := MethodTimingInfo new ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1679
    ^ info
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1680
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1681
    "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
  1682
    "Modified: / 05-03-2007 / 15:46:17 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1683
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1684
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1685
resetExecutionTimesOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1686
    "reset the gathered execution times statistics for aMethod;
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1687
     the method remains wrapped."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1688
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1689
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1690
	MethodTiming removeKey:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1691
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1692
	    MethodTiming removeKey:aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1693
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1694
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1695
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1696
    "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
  1697
    "Modified: / 05-03-2007 / 15:36:59 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1698
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1699
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1700
stopTimingMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1701
    "remove timing of aMethod"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1702
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1703
    ^ self unwrapMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1704
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1705
    "Modified: 15.12.1995 / 15:43:53 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1706
    "Created: 17.6.1996 / 17:04:03 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1707
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1708
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1709
timeMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1710
    "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
  1711
     Use unwrapMethod: or stopTimingMethod: to remove this."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1712
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1713
    |t0|
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1714
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1715
    MethodTiming isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1716
	MethodTiming := IdentityDictionary new.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1717
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1718
    MethodTiming removeKey:aMethod ifAbsent:nil.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1719
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1720
    TimeForWrappers isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1721
	self getTimeForWrappers
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1722
    ].
693
cd020921a251 use microsecond resolution in method timing
Claus Gittinger <cg@exept.de>
parents: 691
diff changeset
  1723
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1724
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1725
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1726
			t0 := OperatingSystem getMicrosecondTime.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1727
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1728
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1729
			|info t cnt minT maxT sumTimes|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1730
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1731
			t := OperatingSystem getMicrosecondTime - t0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1732
			t := t - TimeForWrappers.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1733
			t < 0 ifTrue:[t := 0].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1734
			t := t / 1000.0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1735
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1736
			MethodTiming isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1737
			    MethodTiming := IdentityDictionary new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1738
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1739
			info := MethodTiming at:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1740
			info isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1741
			    MethodTiming at:aMethod put:(info := MethodTimingInfo new)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1742
			] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1743
			    info rememberExecutionTime:t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1744
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1745
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1746
			aMethod changed:#statistics.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1747
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1748
		]
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1749
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1750
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1751
     MessageTracer timeMethod:(Integer compiledMethodAt:#factorial).
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1752
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1753
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1754
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1755
     (MessageTracer executionTimesOfMethod:(Integer compiledMethodAt:#factorial)) printCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1756
     MessageTracer stopTimingMethod:(Integer compiledMethodAt:#factorial)
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1757
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1758
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1759
    "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
  1760
    "Modified: / 05-03-2007 / 15:34:01 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1761
! !
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1762
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1763
!MessageTracer class methodsFor:'method tracing'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1764
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1765
traceClass:aClass selector:aSelector
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1766
    "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
  1767
     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
  1768
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1769
    self traceClass:aClass selector:aSelector on:(Processor activeProcess stderr)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1770
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1771
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1772
     MessageTracer traceClass:Integer selector:#factorial.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1773
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1774
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1775
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1776
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1777
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1778
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1779
     MessageTracer untraceClass:SequenceableCollection
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1780
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1781
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1782
     MessageTracer traceClass:Array selector:#at:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1783
     MessageTracer traceClass:Array selector:#at:put:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1784
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1785
     MessageTracer untraceClass:Array
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1786
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1787
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1788
    "Modified (comment): / 29-06-2019 / 09:06:09 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1789
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1790
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1791
traceClass:aClass selector:aSelector on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1792
    "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
  1793
     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
  1794
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1795
    self traceMethod:(aClass compiledMethodAt:aSelector) on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1796
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1797
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1798
     MessageTracer traceClass:Integer selector:#factorial on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1799
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1800
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1801
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1802
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1803
     MessageTracer traceClass:Integer selector:#factorialR on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1804
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1805
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1806
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1807
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1808
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1809
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1810
traceMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1811
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1812
     when aMethod is executed. Traces both entry and exit.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1813
     Use unwrapMethod to remove this."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1814
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1815
    ^ self traceMethod:aMethod on:(Processor activeProcess stderr)
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1816
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1817
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1818
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1819
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1820
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1821
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1822
    "
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1823
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1824
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1825
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1826
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1827
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1828
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1829
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1830
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1831
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1832
    "
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  1833
     don't do this:
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1834
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1835
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1836
     MessageTracer traceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1837
     MessageTracer traceMethod:(Object compiledMethodAt:#at:put:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1838
     #(6 1 9 66 2 17) copy sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1839
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1840
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:put:).
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1841
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1842
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1843
    "Modified (comment): / 29-06-2019 / 09:06:15 / Claus Gittinger"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1844
!
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1845
4452
48908302f213 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4451
diff changeset
  1846
traceMethod:aMethod inProcess:aProcess on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1847
    "arrange for a trace message to be output on aStream,
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1848
     when aMethod is executed. Traces both entry and exit.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1849
     Use unwrapMethod to remove this."
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1850
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1851
    |lvl inside|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1852
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1853
    ^ self wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1854
         onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1855
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1856
                            inside isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1857
                                inside := true.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1858
                                CallingLevel isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1859
                                    CallingLevel := 0.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1860
                                ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1861
                                lvl notNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1862
                                    lvl := lvl + 1
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1863
                                ] ifFalse:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1864
                                    CallingLevel := lvl := CallingLevel + 1.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1865
                                ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1866
                                MessageTracer printEntryFull:con level:lvl on:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1867
                                inside := nil
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1868
                            ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1869
                        ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1870
                 ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1871
         onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1872
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1873
                            inside isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1874
                                inside := true.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1875
                                MessageTracer printExit:con with:retVal level:lvl on:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1876
                                CallingLevel := lvl := lvl - 1.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1877
                                inside := nil
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1878
                            ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1879
                        ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1880
                        retVal
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1881
                ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1882
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1883
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1884
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1885
     5 factorial.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1886
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1887
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1888
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1889
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1890
     5 factorialR.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1891
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1892
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1893
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1894
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1895
     #(6 1 9 66 2 17) copy sort.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1896
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1897
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1898
4452
48908302f213 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4451
diff changeset
  1899
    "Created: / 29-06-2019 / 09:26:49 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1900
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1901
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1902
traceMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1903
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1904
     when aMethod is executed. Traces both entry and exit.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1905
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1906
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1907
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1908
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1909
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1910
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1911
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1912
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1913
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1914
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1915
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1916
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1917
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1918
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1919
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1920
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1921
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1922
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1923
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1924
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1925
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1926
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1927
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1928
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1929
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1930
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1931
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1932
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1933
		]
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1934
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1935
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1936
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1937
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1938
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1939
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1940
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1941
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1942
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1943
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1944
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1945
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1946
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1947
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1948
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1949
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1950
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1951
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1952
traceMethodAll:aMethod
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1953
    "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
  1954
     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
  1955
     Use untraceMethod to remove this trace.
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1956
     This is for system debugging only;
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1957
     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
  1958
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1959
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1960
	      onEntry:[:con | ObjectMemory flushCaches. ObjectMemory sendTraceOn.]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1961
	      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
  1962
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1963
    "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
  1964
!
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1965
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1966
traceMethodEntry:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1967
    "arrange for a trace message to be output on stdErr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1968
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1969
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1970
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1971
    ^ self traceMethodEntry:aMethod on:(Processor activeProcess stderr)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1972
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1973
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1974
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1975
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1976
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1977
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1978
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1979
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1980
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1981
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1982
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1983
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1984
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1985
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1986
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1987
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1988
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1989
    "Modified (comment): / 29-06-2019 / 09:06:32 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1990
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1991
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1992
traceMethodEntry:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1993
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1994
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1995
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1996
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1997
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1998
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1999
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2000
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2001
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2002
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2003
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2004
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2005
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2006
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2007
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2008
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2009
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2010
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2011
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2012
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2013
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2014
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2015
	 onExit:nil
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2016
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2017
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2018
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2019
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2020
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2021
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2022
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2023
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2024
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2025
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2026
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2027
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2028
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2029
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2030
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2031
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2032
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2033
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2034
traceMethodFull:aMethod
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2035
    "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
  2036
     Only the sender is traced on entry.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2037
     Use untraceMethod to remove this trace."
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2038
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2039
    ^ self traceMethodFull:aMethod on:(Processor activeProcess stderr)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2040
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2041
    "Created: / 15-12-1995 / 18:19:31 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2042
    "Modified: / 22-10-1996 / 17:39:28 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2043
    "Modified (format): / 29-06-2019 / 09:06:38 / Claus Gittinger"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2044
!
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2045
4452
48908302f213 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4451
diff changeset
  2046
traceMethodFull:aMethod inProcess:aProcess on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2047
    "arrange for a full trace message to be output on aStream, when aMethod is executed.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2048
     Only the sender is traced on entry.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2049
     Use untraceMethod to remove this trace."
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2050
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2051
    |onEntry onExit|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2052
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2053
    onEntry := (self traceFullBlockFor:aStream).
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2054
    onExit := LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2055
    
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2056
    ^ self
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2057
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2058
        onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2059
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2060
                            onEntry value:con
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2061
                        ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2062
                ]        
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2063
        onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2064
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2065
                            LeaveTraceBlock value:con value:retVal
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2066
                        ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2067
                        retVal
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2068
               ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2069
4452
48908302f213 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4451
diff changeset
  2070
    "Created: / 29-06-2019 / 09:26:37 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2071
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2072
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2073
traceMethodFull:aMethod on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2074
    "arrange for a full trace message to be output on aStream, when aMethod is executed.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2075
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2076
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2077
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2078
    ^ self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2079
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2080
        onEntry:(self traceFullBlockFor:aStream)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2081
        onExit:LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2082
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2083
    "Created: / 15-12-1995 / 18:19:31 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2084
    "Modified: / 22-10-1996 / 17:39:28 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2085
    "Modified (comment): / 29-06-2019 / 09:06:47 / Claus Gittinger"
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2086
!
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2087
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2088
traceMethodSender:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2089
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2090
     when amethod is executed.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2091
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2092
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2093
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2094
    ^ self traceMethodSender:aMethod on:(Processor activeProcess stderr)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2095
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2096
    "Modified (format): / 29-06-2019 / 09:06:51 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2097
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2098
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2099
traceMethodSender:aMethod on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2100
    "arrange for a trace message to be output on aStream, when amethod is executed.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2101
     Only the sender is traced on entry.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2102
     Use untraceMethod to remove this trace."
35
claus
parents: 31
diff changeset
  2103
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2104
    ^ self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2105
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2106
        onEntry:(self traceSenderBlockFor:aStream)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2107
        onExit:LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2108
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2109
    "Modified: / 22-10-1996 / 17:39:33 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2110
    "Modified (comment): / 29-06-2019 / 09:06:56 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2111
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2112
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2113
traceUpdateMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2114
    "arrange for a trace message to be output on aStream,
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2115
     when aMethod is executed.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2116
     Traces both entry and exit.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2117
     Use unwrapMethod to remove this.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2118
     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
  2119
     back to the origial change message."
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2120
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2121
    |lvl inside|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2122
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2123
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2124
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2125
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2126
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2127
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2128
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2129
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2130
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2131
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2132
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2133
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2134
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2135
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2136
			    MessageTracer printUpdateEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2137
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2138
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2139
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2140
	onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2141
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2142
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2143
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2144
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2145
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2146
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2147
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2148
		]
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2149
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2150
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2151
tracelogMethod:aMethod
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2152
    "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
  2153
     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
  2154
     Use unwrapMethod to remove this."
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2155
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2156
    |lvl inside|
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2157
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2158
    ^ self wrapMethod:aMethod
3627
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2159
         onEntry:[:con |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2160
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2161
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2162
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2163
                            CallingLevel isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2164
                                CallingLevel := 0.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2165
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2166
                            lvl notNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2167
                                lvl := lvl + 1
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2168
                            ] ifFalse:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2169
                                CallingLevel := lvl := CallingLevel + 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2170
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2171
                            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
  2172
                            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
  2173
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2174
                        ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2175
                 ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2176
         onExit:[:con :retVal |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2177
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2178
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2179
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2180
                            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
  2181
                            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
  2182
                            CallingLevel := lvl := lvl - 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2183
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2184
                        ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2185
                        retVal
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2186
                ]
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2187
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2188
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2189
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2190
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2191
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2192
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2193
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2194
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2195
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2196
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2197
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2198
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2199
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2200
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2201
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2202
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2203
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2204
    "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
  2205
    "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
  2206
!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2207
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2208
untraceMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2209
    "remove tracing of aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2210
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2211
    "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
  2212
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2213
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2214
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2215
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2216
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2217
!MessageTracer class methodsFor:'method wrapping'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2218
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2219
unwrapAllMethods
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2220
    "just in case you don't know what methods have break/trace-points
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2221
     on them; this removes them all"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2222
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2223
    WrappedMethod allInstancesDo:[:aWrapperMethod |
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2224
        aWrapperMethod unregister.
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2225
        self unwrapMethod:aWrapperMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2226
    ]
1145
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2227
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2228
    "
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2229
     MessageTracer unwrapAllMethods
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2230
    "
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2231
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2232
    "Modified: / 01-07-2011 / 10:02:47 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2233
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2234
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2235
unwrapMethod:aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2236
    "remove any wrapper on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2237
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2238
    |wasWrapped selector class originalMethod dict mthd|
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2239
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2240
    (aMethod isNil) ifTrue:[^ self].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2241
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2242
    (wasWrapped := aMethod isWrapped) ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2243
        originalMethod := aMethod originalMethod.
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2244
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2245
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2246
    MethodCounts notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2247
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2248
            MethodCounts removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2249
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2250
        MethodCounts removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2251
        MethodCounts := MethodCounts asNilIfEmpty.
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2252
    ].
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2253
    MethodMemoryUsage notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2254
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2255
            MethodMemoryUsage removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2256
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2257
        MethodMemoryUsage removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2258
        MethodMemoryUsage := MethodMemoryUsage asNilIfEmpty.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2259
    ].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2260
    MethodTiming notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2261
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2262
            MethodTiming removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2263
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2264
        MethodTiming removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2265
        MethodTiming := MethodTiming asNilIfEmpty.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2266
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2267
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2268
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2269
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2270
    wasWrapped ifFalse:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2271
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2272
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2273
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2274
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2275
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2276
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2277
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2278
    class isNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2279
        'MessageTracer [info]: no containing class for method found' infoPrintCR.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2280
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2281
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2282
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2283
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2284
    originalMethod isNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2285
        self error:'oops, could not find original method' mayProceed:true.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2286
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2287
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2288
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2289
    dict := class methodDictionary.
506
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2290
    mthd := dict at:selector ifAbsent:nil.
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2291
    mthd notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2292
        dict at:selector put:originalMethod.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2293
        class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2294
    ] ifFalse:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2295
        'MessageTracer [info]: no containing class for method found' infoPrintCR.
667
62df9b9b7664 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 666
diff changeset
  2296
"/        self halt:'oops, unexpected error - cannot remove wrap'.
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2297
        aMethod becomeSameAs:originalMethod.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2298
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2299
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2300
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2301
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2302
584
2da6bb2c8017 send out change notifications when a trap is removed
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
  2303
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2304
    MethodTrapChangeNotificationParameter notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2305
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2306
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2307
    ^ originalMethod
265
f3fb9bec2d4a printNL -> printCR
Claus Gittinger <cg@exept.de>
parents: 258
diff changeset
  2308
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  2309
    "Modified: / 05-06-1996 / 14:08:08 / stefan"
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2310
    "Modified: / 04-10-2007 / 16:41:01 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2311
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2312
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2313
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2314
    ^ 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
  2315
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2316
    "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
  2317
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2318
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2319
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock onUnwind:unwindBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2320
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2321
     aMethod is evaluated.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2322
     EntryBlock will be called on entry, and gets the current context passed as argument.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2323
     ExitBlock will be called, when the method is left, and gets the context and
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  2324
     the method's return value as arguments.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2325
     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
  2326
     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
  2327
     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
  2328
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2329
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2330
    |selector class trapMethod s spec src dict sel saveUS xselector|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2331
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2332
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2333
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2334
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2335
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2336
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2337
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2338
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2339
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2340
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2341
    aMethod isLazyMethod ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2342
        aMethod makeRealMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2343
    ].
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2344
    
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2345
    "methods annotated as <<hidden>< cannot be breakpointed in deployed apps"
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2346
    (aMethod hasAnnotation:'hidden') ifTrue:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2347
        Smalltalk isSmalltalkDevelopmentSystem ifFalse:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2348
            ^ aMethod
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2349
        ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2350
    ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2351
    
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2352
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2353
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2354
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2355
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2356
    class isNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2357
        self error:'cannot place trap (no containing class found)' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2358
        ^ aMethod
88
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
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2361
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2362
    WrappedMethod autoload. "/ for small systems
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2363
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
     get a new method-spec
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2366
    "
730
635af002b783 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 729
diff changeset
  2367
    xselector := '_x'.
4494
51376091ab9e #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2368
    aMethod argumentCount timesRepeat:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2369
        xselector := xselector , '_:'
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2370
    ].
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2371
    spec := Parser methodSpecificationForSelector:xselector.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2372
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2373
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2374
     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
  2375
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2376
    s := WriteStream on:''.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2377
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  2378
    s nextPutAll:' <context: #return>'.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2379
    s nextPutAll:' |retVal context| '.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2380
    s nextPutAll:' context := thisContext.'.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2381
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2382
        s nextPutAll:'['.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2383
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2384
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2385
        s nextPutAll:'#entryBlock yourself value:context. '.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2386
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2387
    s nextPutAll:'retVal := #originalMethod yourself';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2388
      nextPutAll:             ' valueWithReceiver:(context receiver)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2389
      nextPutAll:             ' arguments:(context args)';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2390
      nextPutAll:             ' selector:(context selector)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2391
      nextPutAll:             ' search:(context searchClass)';
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2392
      nextPutAll:             ' sender:nil. '.
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
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2395
        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
  2396
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2397
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2398
        s nextPutAll:'] ifCurtailed:#unwindBlock yourself.'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2399
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2400
    s nextPutAll:'^ retVal'; cr.
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
    src := s contents.
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2403
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2404
    ParserFlags
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2405
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2406
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2407
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2408
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2409
                Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2410
                    trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2411
                                    compile:src
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2412
                                    forClass:UndefinedObject
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2413
                                    inCategory:aMethod category
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2414
                                    notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2415
                                    install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2416
                                    skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2417
                                    silent:false. "/ true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2418
                ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2419
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2420
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2421
            ].
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2422
        ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2423
955
0516771efa2a preserve a methods packageID when wrapping
Claus Gittinger <cg@exept.de>
parents: 950
diff changeset
  2424
    trapMethod setPackage:aMethod package.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2425
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2426
    trapMethod register.
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2427
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2428
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2429
     raising our eyebrows here ...
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2430
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2431
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2432
        trapMethod changeLiteral:#entryBlock to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2433
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
  2434
    trapMethod changeLiteral:#originalMethod to:aMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2435
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2436
        trapMethod changeLiteral:#exitBlock to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2437
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2438
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2439
        trapMethod changeLiteral:#unwindBlock to:unwindBlock.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2440
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2441
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2442
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2443
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2444
    "
840
5ec82d6c2e55 care for the wrappers source info (to allow source access in browser)
Claus Gittinger <cg@exept.de>
parents: 825
diff changeset
  2445
"/    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
  2446
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2447
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2448
    dict := class methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2449
    sel := dict at:selector ifAbsent:[0].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2450
    sel == 0 ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2451
        self error:'oops, unexpected error' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2452
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2453
    ].
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 at:selector put:trapMethod.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2456
    class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2457
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2458
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2459
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2460
    MethodTrapChangeNotificationParameter notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2461
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2462
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2463
    ^ trapMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2464
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2465
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2466
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2467
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2468
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2469
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2470
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2471
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2472
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2473
                           ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2474
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2475
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2476
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2477
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2478
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2479
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2480
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2481
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2482
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2483
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2484
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2485
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2486
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2487
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2488
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2489
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2490
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2491
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2492
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2493
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2494
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2495
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2496
     |lvl|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2497
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2498
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2499
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2500
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2501
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2502
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2503
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2504
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2505
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2506
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2507
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2508
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2509
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2510
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2511
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2512
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2513
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2514
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2515
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2516
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  2517
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2518
    "Modified: / 25-06-1996 / 22:04:51 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2519
    "Modified: / 01-07-2011 / 10:01:48 / cg"
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  2520
    "Modified (comment): / 21-11-2017 / 13:03:29 / cg"
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2521
    "Modified: / 15-01-2019 / 14:15:48 / Claus Gittinger"
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2522
!
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2523
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2524
wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2525
    ^ self wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode onUnwindCode:nil
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2526
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2527
    "Created: / 09-11-2017 / 09:45:38 / cg"
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2528
!
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2529
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2530
wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode onUnwindCode:unwindCode
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2531
    "arrange for the entryCode and exitCode to be evaluated whenever
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2532
     aMethod is evaluated.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2533
     EntryCode will be executed on entry, exitCode when the method is left.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2534
     UnwindCode will be executed when the context of aMethod is unwound.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2535
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2536
     Because the code is sliced in, it may return.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2537
     Useful to wrap existing methods with before and after code.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2538
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2539
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2540
    |selector class trapMethod s spec src dict sel saveUS xselector|
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2541
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2542
    CallingLevel := 0.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2543
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2544
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2545
     create a new method, which calls the original one,
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2546
     but only if not already being trapped.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2547
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2548
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2549
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2550
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2551
    aMethod isLazyMethod ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2552
        aMethod makeRealMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2553
    ].
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2554
    "methods annotated as <<hidden>< cannot be breakpointed in deployed apps"
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2555
    (aMethod hasAnnotation:'hidden') ifTrue:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2556
        Smalltalk isSmalltalkDevelopmentSystem ifFalse:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2557
            ^ aMethod
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2558
        ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2559
    ].
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2560
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2561
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2562
     get class/selector
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2563
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2564
    class := aMethod containingClass.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2565
    class isNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2566
        self error:'cannot place trap (no containing class found)' mayProceed:true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2567
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2568
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2569
    selector := class selectorAtMethod:aMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2570
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2571
    WrappedMethod autoload. "/ for small systems
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2572
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2573
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2574
     get a new method-spec
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2575
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2576
    xselector := '_x'.
4494
51376091ab9e #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2577
    aMethod argumentCount timesRepeat:[
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2578
        xselector := xselector , '_:'
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2579
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2580
    spec := Parser methodSpecificationForSelector:xselector.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2581
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2582
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2583
     create a method, executing the trap-blocks and the original method via a direct call
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2584
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2585
    s := WriteStream on:''.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2586
    s nextPutAll:spec.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2587
    s nextPutAll:' <context: #return>'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2588
    s nextPutAll:' |retVal context| '.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2589
    s nextPutAll:' context := thisContext.'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2590
    unwindCode notEmptyOrNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2591
        s nextPutAll:'['.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2592
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2593
    entryCode notEmptyOrNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2594
        s nextPutAll:('[ ',entryCode,'] value. ').
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2595
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2596
    s nextPutAll:'retVal := #originalMethod yourself';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2597
      nextPutAll:             ' valueWithReceiver:(context receiver)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2598
      nextPutAll:             ' arguments:(context args)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2599
      nextPutAll:             ' selector:(context selector)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2600
      nextPutAll:             ' search:(context searchClass)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2601
      nextPutAll:             ' sender:nil. '.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2602
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2603
    exitCode notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2604
        s nextPutAll:('[ ',exitCode,'] value. ').
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2605
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2606
    unwindCode notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2607
        s nextPutAll:'] ifCurtailed:[',unwindCode,'].'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2608
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2609
    s nextPutAll:'^ retVal'; cr.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2610
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2611
    src := s contents.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2612
    
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2613
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2614
    ParserFlags
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2615
        withSTCCompilation:#never
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2616
        do:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2617
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2618
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2619
                Class withoutUpdatingChangesDo:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2620
                    trapMethod := Compiler
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2621
                                    compile:src
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2622
                                    forClass:UndefinedObject
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2623
                                    inCategory:aMethod category
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2624
                                    notifying:nil
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2625
                                    install:false
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2626
                                    skipIfSame:false
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2627
                                    silent:false. "/ true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2628
                ]
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2629
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2630
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2631
            ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2632
        ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2633
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2634
    trapMethod setPackage:aMethod package.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2635
    trapMethod changeClassTo:WrappedMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2636
    trapMethod register.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2637
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2638
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2639
     raising our eyebrows here ...
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2640
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2641
    trapMethod changeLiteral:#originalMethod to:aMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2642
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2643
     change the source of this new method
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2644
     (to avoid confusion in the debugger ...)
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2645
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2646
"/    trapMethod source:'this is a wrapper method - not the real one'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2647
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2648
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2649
    dict := class methodDictionary.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2650
    sel := dict at:selector ifAbsent:[0].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2651
    sel == 0 ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2652
        self error:'oops, unexpected error' mayProceed:true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2653
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2654
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2655
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2656
    dict at:selector put:trapMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2657
    class methodDictionary:dict.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2658
    ObjectMemory flushCaches.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2659
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2660
    class changed:#methodTrap with:selector. "/ tell browsers
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2661
    MethodTrapChangeNotificationParameter notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2662
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2663
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2664
    ^ trapMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2665
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2666
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2667
     MessageTracer
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2668
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2669
                onEntryCode:'Transcript showCR:''hello'' '
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2670
                onExitCode:'Transcript showCR:''good bye'' '.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2671
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2672
     (1@2) scaleBy:5.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2673
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2674
     (1@2) scaleBy:5.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2675
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2676
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2677
    "Created: / 09-11-2017 / 09:45:20 / cg"
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2678
    "Modified: / 15-01-2019 / 14:16:08 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2679
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2680
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2681
!MessageTracer class methodsFor:'object breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2682
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2683
objectHasWraps:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2684
    "return true, if anObject has any wraps"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2685
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2686
    ^ anObject class category == #'* trapping *'
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2687
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2688
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2689
realClassOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2690
    "return anObjects real class"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2691
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2692
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2693
	^ anObject class
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2694
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2695
    ^ anObject class superclass
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2696
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2697
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2698
trap:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2699
    "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
  2700
     sent to anObject. Use untrap to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2701
     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
  2702
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2703
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2704
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2705
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2706
	 onExit:LeaveBreakBlock.
88
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
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2709
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2710
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2711
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2712
     MessageTracer trap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2713
     p x:5
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2714
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2715
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2716
    "Modified: 22.10.1996 / 17:39:41 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2717
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2718
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2719
trap:anObject selectors:aCollection
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2720
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2721
	 selectors:aCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2722
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2723
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2724
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2725
    "Modified: 22.10.1996 / 17:39:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2726
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2727
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2728
trapAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2729
    "trap on all messages which are understood by anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2730
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2731
    self wrapAll:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2732
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2733
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2734
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2735
    "Modified: 22.10.1996 / 17:39:54 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2736
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2737
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2738
trapAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2739
    "trap on all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2740
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2741
    self trap:anObject selectors:aClass selectors
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2742
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2743
    "Modified: 5.6.1996 / 13:46:06 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2744
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2745
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2746
untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2747
    "remove any traps on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2748
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2749
    "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
  2750
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2751
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2752
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2753
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2754
    orgClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2755
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2756
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2757
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2758
    anObject changeClassTo:orgClass superclass.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2759
    ObjectCopyHolders notNil ifTrue:[
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2760
	ObjectCopyHolders removeKey:anObject ifAbsent:nil.
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2761
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2762
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2763
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2764
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2765
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2766
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2767
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2768
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2769
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2770
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2771
     MessageTracer untrap:p
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2772
     p y:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2773
     p x:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2774
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2775
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2776
    "Modified: / 21.4.1998 / 15:43:33 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2777
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2778
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2779
untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2780
    "remove trap on aSelector from anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2781
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  2782
    |orgClass dict|
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
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2785
    orgClass category == #'* trapping *' ifFalse:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2786
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2787
    dict := orgClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2788
    dict at:aSelector ifAbsent:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2789
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2790
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2791
	"the last trap got removed"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2792
	anObject changeClassTo:orgClass superclass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2793
	ObjectCopyHolders notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2794
	    ObjectCopyHolders removeKey:anObject ifAbsent:nil.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2795
	].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2796
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2797
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2798
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2799
    orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2800
    ObjectMemory flushCaches. "avoid calling the old trap method"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2801
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2802
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2803
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2804
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2805
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2806
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2807
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2808
     'trace both ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2809
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2810
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2811
     'trace only y ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2812
     MessageTracer untrap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2813
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2814
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2815
     'trace none ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2816
     MessageTracer untrap:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2817
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2818
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2819
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2820
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2821
    "Modified: / 5.6.1996 / 13:56:08 / stefan"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2822
    "Modified: / 21.4.1998 / 15:43:55 / cg"
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2823
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2824
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2825
wrappedSelectorsOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2826
    "return the set of wrapped selectors (if any)"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2827
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2828
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2829
	^ #()
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2830
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2831
    ^ anObject class selectors
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2832
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2833
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2834
!MessageTracer class methodsFor:'object modification traps'!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2835
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2836
trapModificationsIn:anObject
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2837
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2838
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2839
    self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2840
	trapModificationsIn:anObject filter:[:old :new | true]
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2841
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2842
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2843
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2844
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2845
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2846
     MessageTracer trapModificationsIn:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2847
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2848
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2849
     a at:1.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2850
     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
  2851
     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
  2852
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2853
     a at:3.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2854
     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
  2855
     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
  2856
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2857
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2858
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2859
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2860
    "Created: / 21.4.1998 / 14:32:34 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2861
    "Modified: / 21.4.1998 / 14:58:24 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2862
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2863
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2864
trapModificationsIn:anObject filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2865
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2866
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2867
    |allSelectors|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2868
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2869
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2870
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2871
	aClass methodDictionary keys addAllTo:allSelectors
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2872
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2873
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2874
    self trapModificationsIn:anObject selectors:allSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2875
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2876
    "trap if arrays 5th slot is modified:
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2877
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2878
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2879
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2880
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2881
     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
  2882
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2883
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2884
     a at:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2885
     a at:2 put:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2886
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2887
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2888
     a at:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2889
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2890
     a at:2 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2891
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2892
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2893
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2894
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2895
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2896
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2897
    "Modified: / 21.4.1998 / 15:53:38 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2898
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2899
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2900
trapModificationsIn:anObject selector:aSelector filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2901
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2902
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2903
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2904
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2905
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2906
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2907
	trapModificationsIn:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2908
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2909
	filter:aFilterBlock
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2910
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2911
    "Modified: / 21.4.1998 / 15:34:44 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2912
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2913
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2914
trapModificationsIn:anObject selectors:aCollectionOfSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2915
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2916
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2917
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2918
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2919
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2920
    |copyHolder sels checkBlock|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2921
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2922
    (anObject isNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2923
	or:[anObject isSymbol
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2924
	or:[anObject class == SmallInteger
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2925
	or:[anObject == true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2926
	or:[anObject == false]]]])
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2927
    ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2928
	self error:'cannot place trap on this object' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2929
	^ self.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2930
    ].
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2931
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2932
    ObjectCopyHolders isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2933
	ObjectCopyHolders := WeakIdentityDictionary new.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2934
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2935
    copyHolder := ObjectCopyHolders at:anObject ifAbsent:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2936
    copyHolder isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2937
	ObjectCopyHolders at:anObject put:(copyHolder := ValueHolder new).
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2938
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2939
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2940
    copyHolder value:(anObject shallowCopy).
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2941
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2942
    "/ 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
  2943
    "/ do no harm to the object ... consider this a kludge
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2944
    sels := aCollectionOfSelectors copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2945
    sels removeAll:#(#class #species #yourself #'sameContentsAs:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2946
		     #'instVarAt:' #'at:' #'basicAt:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2947
		     #'shallowCopy' #'copy'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2948
		     #'=' #'==' #'~=' #'~~'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2949
		     #'size'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2950
		    ).
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2951
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2952
    checkBlock :=
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2953
		   [:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2954
			|oldValue|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2955
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2956
			oldValue :=  copyHolder value.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2957
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2958
			"/ compare with copy ...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2959
			(anObject sameContentsAs:oldValue) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2960
			    "/ see oldValue vs. anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2961
			    (aFilterBlock value:oldValue value:anObject) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2962
				copyHolder value:(anObject shallowCopy).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2963
				ObjectWrittenBreakpointSignal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2964
				    raiseRequestWith:(oldValue -> anObject)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2965
				    errorString:('object was modififed in: ' , con sender selector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2966
				    in:con sender
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2967
			    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2968
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2969
		   ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2970
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2971
    sels do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2972
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2973
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2974
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2975
	    onEntry:[:con | ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2976
	    onExit:checkBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2977
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2978
	    flushCaches:false.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2979
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2980
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2981
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2982
    "Created: / 21.4.1998 / 15:34:05 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2983
    "Modified: / 21.4.1998 / 16:00:39 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2984
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2985
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2986
trapModificationsOf:anInstVarOrOffset in:anObject
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2987
    "trap modifications in anObject"
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2988
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2989
    |idx selectors definingClass|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2990
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2991
    anInstVarOrOffset isInteger ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2992
	"/ indexed slot
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2993
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2994
	    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
  2995
   ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2996
	"/ instVar by name
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2997
	selectors := IdentitySet new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2998
	definingClass := anObject class whichClassDefinesInstVar:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2999
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3000
	definingClass withAllSuperclassesDo:[:aClass |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3001
	    aClass methodDictionary keys addAllTo:selectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3002
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3003
	idx := anObject class instVarIndexFor:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3004
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3005
	    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
  3006
   ]
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3007
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3008
    "
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3009
     |a|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3010
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3011
     a := Array new:10.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3012
     MessageTracer trapModificationsOf:2 in:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3013
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3014
     a size.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3015
     a at:1.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3016
     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
  3017
     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
  3018
     a at:2.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3019
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3020
     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
  3021
     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
  3022
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3023
     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
  3024
     MessageTracer untrace:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3025
     a at:3 put:5.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3026
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3027
! !
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3028
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3029
!MessageTracer class methodsFor:'object tracing'!
88
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
trace:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3032
    "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
  3033
     aSelector is sent to anObject. Both entry and exit are traced.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3034
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3035
     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
  3036
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3037
    self trace:anObject selector:aSelector on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3038
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
     |p|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3041
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3042
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3043
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3044
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3045
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3046
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3047
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3048
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3049
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3050
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3051
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3052
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3053
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3054
     MessageTracer trace:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3055
     MessageTracer trace:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3056
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3057
    "
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3058
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3059
    "Modified: / 21-04-1998 / 15:37:05 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3060
    "Modified (comment): / 29-06-2019 / 09:07:12 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3061
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3062
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3063
trace:anObject selector:aSelector on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3064
    "arrange for a trace message to be output on aStream, when a message with
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3065
     aSelector is sent to anObject. Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3066
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3067
     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
  3068
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3069
    self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3070
        trace:anObject
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3071
        selectors:(Array with:aSelector)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3072
        on:aStream
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3073
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3074
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3075
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3076
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3077
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3078
     MessageTracer trace:p selector:#x: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3079
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3080
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3081
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3082
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3083
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3084
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3085
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3086
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3087
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3088
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3089
     MessageTracer trace:a selector:#at:put: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3090
     MessageTracer trace:a selector:#at:.    on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3091
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3092
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3093
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3094
    "Modified: / 21-04-1998 / 15:37:05 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3095
    "Modified (comment): / 29-06-2019 / 09:07:17 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3096
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3097
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3098
trace:anObject selectors:aCollectionOfSelectors
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3099
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3100
     from aCollectionOfSelectors is sent to anObject.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3101
     Both entry and exit are traced.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3102
     Use untrap:/untrace: to remove this trace.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3103
     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
  3104
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3105
    self trace:anObject selectors:aCollectionOfSelectors on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3106
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3107
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3108
     |p|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3109
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3110
     p := Point new.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3111
     MessageTracer trace:p selector:#x:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3112
     p x:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3113
     p y:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3114
     p x:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3115
     MessageTracer untrap:p.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3116
     p x:7
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3117
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3118
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3119
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3120
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3121
     a := #(6 1 9 66 2 17) copy.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3122
     MessageTracer trace:a selector:#at:put:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3123
     MessageTracer trace:a selector:#at:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3124
     a sort.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3125
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3126
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3127
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3128
    "Modified (comment): / 29-06-2019 / 09:07:24 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3129
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3130
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3131
trace:anObject selectors:aCollectionOfSelectors on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3132
    "arrange for a trace message to be output on aStream, when any message
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3133
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3134
     Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3135
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3136
     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
  3137
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3138
    aCollectionOfSelectors do:[:aSelector |
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3139
        |methodName|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3140
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3141
        methodName := anObject class name , '>>' , aSelector.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3142
        self
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3143
            wrap:anObject
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3144
            selector:aSelector
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3145
            onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3146
                        aStream nextPutAll:'enter '; nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3147
                        aStream nextPutAll:' receiver='.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3148
                        con receiver printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3149
                        aStream nextPutAll:' args='. (con args) printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3150
                        aStream nextPutAll:' from:'. con sender printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3151
                        aStream cr; flush
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3152
                    ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3153
            onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3154
                        aStream nextPutAll:'leave '; nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3155
                        aStream nextPutAll:' receiver='. con receiver printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3156
                        aStream nextPutAll:' returning:'. retVal printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3157
                        aStream cr; flush
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3158
                   ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3159
            withOriginalClass:true
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3160
            flushCaches:false
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3161
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3162
    ObjectMemory flushCaches
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3163
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3164
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3165
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3166
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3167
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3168
     MessageTracer trace:p selectors:#(x:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3169
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3170
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3171
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3172
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3173
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3174
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3175
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3176
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3177
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3178
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3179
     MessageTracer trace:a selectors:#( at:put: at:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3180
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3181
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3182
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3183
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3184
    "Modified (comment): / 29-06-2019 / 09:07:28 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3185
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3186
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3187
traceAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3188
    "trace all messages which are understood by anObject"
27
claus
parents: 26
diff changeset
  3189
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3190
    self traceAll:anObject on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3191
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3192
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3193
     trace all (implemented) messages sent to Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3194
     (other messages lead to an error, anyway)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3195
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3196
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3197
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3198
     MessageTracer traceAll:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3199
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3200
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3201
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3202
    "Modified: / 05-06-1996 / 13:43:51 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3203
    "Modified (comment): / 29-06-2019 / 09:07:32 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3204
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3205
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3206
traceAll:anObject from:aClass
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3207
    "trace all messages, which are defined in aClass, sent to an anObject on stderr"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3208
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3209
    self traceAll:anObject from:aClass on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3210
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3211
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3212
     trace all methods in Display, which are implemented
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3213
     in the DisplayWorkstation class.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3214
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3215
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3216
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3217
     MessageTracer traceAll:Display from:XWorkstation
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3218
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3219
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3220
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3221
    "Modified: / 05-06-1996 / 13:45:37 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3222
    "Modified (comment): / 29-06-2019 / 09:08:26 / Claus Gittinger"
27
claus
parents: 26
diff changeset
  3223
!
claus
parents: 26
diff changeset
  3224
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3225
traceAll:anObject from:aClass on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3226
    "trace all messages, which are defined in aClass, sent to anObject"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3227
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3228
    self trace:anObject selectors:aClass selectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3229
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3230
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3231
     trace all methods in Display, which are implemented
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3232
     in the DisplayWorkstation class.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3233
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3234
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3235
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3236
     MessageTracer traceAll:Display from:XWorkstation on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3237
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3238
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3239
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3240
    "Modified: / 05-06-1996 / 13:45:37 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3241
    "Modified (comment): / 29-06-2019 / 09:08:38 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3242
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3243
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3244
traceAll:anObject on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3245
    "trace all messages which are understood by anObject"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3246
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3247
    |allSelectors|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3248
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3249
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3250
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3251
	aClass methodDictionary keys addAllTo:allSelectors
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3252
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3253
    self trace:anObject selectors:allSelectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3254
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3255
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3256
     trace all (implemented) messages sent to Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3257
     (other messages lead to an error, anyway)
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3258
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3259
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3260
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3261
     MessageTracer traceAll:Display on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3262
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3263
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3264
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3265
    "Modified: 5.6.1996 / 13:43:51 / stefan"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3266
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3267
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3268
traceEntry:anObject selectors:aCollectionOfSelectors on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3269
    "arrange for a trace message to be output on aStream, when any message
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3270
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3271
     Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3272
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3273
     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
  3274
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3275
    self
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3276
        traceEntry:anObject selectors:aCollectionOfSelectors on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3277
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3278
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3279
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3280
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3281
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3282
     MessageTracer traceEntry:p selectors:#(x:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3283
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3284
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3285
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3286
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3287
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3288
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3289
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3290
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3291
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3292
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3293
     MessageTracer traceEntry:a selectors:#( at:put: at:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3294
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3295
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3296
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3297
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3298
    "Modified (comment): / 29-06-2019 / 09:08:46 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3299
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3300
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3301
traceSender:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3302
    "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
  3303
     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
  3304
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3305
     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
  3306
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3307
    ^ self traceSender:anObject selector:aSelector on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3308
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3309
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3310
     |p|
27
claus
parents: 26
diff changeset
  3311
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3312
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3313
     MessageTracer traceSender:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3314
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3315
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3316
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3317
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3318
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3319
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3320
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3321
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3322
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3323
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3324
     MessageTracer traceSender:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3325
     MessageTracer traceSender:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3326
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3327
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3328
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3329
    "Modified: / 10-01-1997 / 17:54:53 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3330
    "Modified (comment): / 29-06-2019 / 09:08:51 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3331
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3332
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3333
traceSender:anObject selector:aSelector on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3334
    "arrange for a trace message to be output on aStream, when a message with
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3335
     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
  3336
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3337
     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
  3338
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3339
    |methodName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3340
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3341
    methodName := anObject class name , '>>' , aSelector.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3342
    self wrap:anObject
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3343
         selector:aSelector
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3344
         onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3345
                     aStream nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3346
                     aStream nextPutAll:' from '.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3347
                     con sender printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3348
                     aStream cr; flush.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3349
                 ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3350
         onExit:LeaveTraceBlock.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3351
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3352
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3353
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3354
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3355
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3356
     MessageTracer traceSender:p selector:#x: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3357
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3358
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3359
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3360
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3361
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3362
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3363
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3364
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3365
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3366
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3367
     MessageTracer traceSender:a selector:#at:put: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3368
     MessageTracer traceSender:a selector:#at:.    on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3369
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3370
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3371
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3372
    "Modified: / 10-01-1997 / 17:54:53 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3373
    "Modified (comment): / 29-06-2019 / 09:08:56 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3374
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3375
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3376
untrace:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3377
    "remove any traces on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3378
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3379
    "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
  3380
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3381
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3382
    ^ self untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3383
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3384
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3385
untrace:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3386
    "remove traces of aSelector sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3387
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3388
    "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
  3389
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3390
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3391
    ^ self untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3392
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3393
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3394
!MessageTracer class methodsFor:'object wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3395
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3396
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3397
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3398
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3399
     entry, and get the current context passed as argument. ExitBlock will be called,
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3400
     when the method is left, and get the context and the method's return value as arguments.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3401
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3402
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3403
    "I have not yet enough experience, if the wrapped original method should
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3404
     run as an instance of the original, or of the catching class;
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3405
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3406
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3407
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3408
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3409
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3410
    ^ self
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3411
        wrap:anObject
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3412
        selector:aSelector
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3413
        onEntry:entryBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3414
        onExit:exitBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3415
        withOriginalClass:true
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3416
        flushCaches:true
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3417
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3418
    "Modified: / 21-04-1998 / 15:29:50 / cg"
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3419
    "Modified (comment): / 21-11-2017 / 13:03:04 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3420
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3421
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3422
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
  3423
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3424
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3425
     entry, and get the current context passed as argument. ExitBlock will be called,
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3426
     when the method is left, and get the current context and the method's return value as argument.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3427
     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
  3428
     before the wrapped method will be called.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3429
     NOTICE: The current implementation does not allow integers or nil to be wrapped."
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3430
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3431
    |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
  3432
     originalMethod|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3433
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3434
    "
27
claus
parents: 26
diff changeset
  3435
     some are not allowed (otherwise we get into trouble ...)
claus
parents: 26
diff changeset
  3436
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3437
    (aSelector == #class
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3438
    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
  3439
        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
  3440
        ^ self
27
claus
parents: 26
diff changeset
  3441
    ].
claus
parents: 26
diff changeset
  3442
claus
parents: 26
diff changeset
  3443
    WrappedMethod autoload.     "/ just to make sure ...
claus
parents: 26
diff changeset
  3444
claus
parents: 26
diff changeset
  3445
    "
3393
943250332a24 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3347
diff changeset
  3446
     create a new (anonymous) subclass of the receiver's class
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3447
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3448
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3449
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  3450
    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
  3451
        newClass := orgClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3452
    ] 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
  3453
        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
  3454
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3455
        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
  3456
        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
  3457
        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
  3458
        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
  3459
        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
  3460
        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
  3461
        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
  3462
        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
  3463
        newClass methodDictionary:MethodDictionary new.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3464
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3465
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3466
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3467
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3468
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3469
    spec := Parser methodSpecificationForSelector:aSelector.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  3470
    s := WriteStream on:''.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3471
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  3472
    s nextPutAll:' <context: #return>'.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3473
    s nextPutAll:' |retVal stubClass '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3474
    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
  3475
        s nextPutAll:additionalVariables.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3476
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3477
    s nextPutAll:'| '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3478
    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
  3479
        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
  3480
        s nextPutAll:'self changeClassTo:(stubClass superclass). '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3481
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3482
    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
  3483
        s nextPutAll:additionalEntryCode.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3484
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3485
    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
  3486
        s nextPutAll:'#literal1 yourself value:thisContext. '.               "/ #literal1 will be replaced by the entryBlock
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3487
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3488
    s nextPutAll:('retVal := #originalMethod. ').                            "/ just to get a place for the originalMethod
27
claus
parents: 26
diff changeset
  3489
    s nextPutAll:('retVal := super ' , spec , '. ').
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3490
    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
  3491
        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
  3492
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3493
    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
  3494
        s nextPutAll:additionalExitCode.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3495
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3496
    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
  3497
        s nextPutAll:'self changeClassTo:stubClass. '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3498
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3499
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3500
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3501
    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
  3502
        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
  3503
        do:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3504
            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
  3505
                [
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3506
                    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
  3507
                                    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
  3508
                                    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
  3509
                                    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
  3510
                                    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
  3511
                                    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
  3512
                                    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
  3513
                                    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
  3514
                ] 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
  3515
                    "/ 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
  3516
                    "/ 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
  3517
                    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
  3518
                ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3519
            ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3520
        ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3521
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3522
    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
  3523
        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
  3524
        ^ self
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3525
    ].
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3526
29
claus
parents: 27
diff changeset
  3527
    implClass := orgClass whichClassIncludesSelector:aSelector.
claus
parents: 27
diff changeset
  3528
    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
  3529
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
29
claus
parents: 27
diff changeset
  3530
    ] 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
  3531
        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
  3532
        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
  3533
            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
  3534
        ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3535
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3536
        trapMethod changeLiteral:#originalMethod to:originalMethod.
29
claus
parents: 27
diff changeset
  3537
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3538
    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
  3539
        trapMethod changeLiteral:#literal1 to:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3540
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3541
    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
  3542
        trapMethod changeLiteral:#literal2 to:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3543
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3544
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3545
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3546
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3547
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3548
    trapMethod source:'this is a wrapper method - not the real one'.
27
claus
parents: 26
diff changeset
  3549
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3550
    trapMethod register.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3551
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3552
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3553
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3554
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3555
    dict := newClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3556
    dict := dict at:aSelector putOrAppend:trapMethod.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3557
    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
  3558
        newClass methodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3559
    ] 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
  3560
        newClass setMethodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3561
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3562
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3563
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3564
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3565
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3566
    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
  3567
        anObject changeClassTo:newClass
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3568
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3569
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3570
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3571
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3572
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3573
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3574
     p := Point new copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3575
     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
  3576
                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
  3577
            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
  3578
             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
  3579
              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
  3580
                         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
  3581
                         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
  3582
                         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
  3583
                     ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3584
               withOriginalClass:true.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3585
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3586
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3587
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3588
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3589
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3590
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3591
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3592
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3593
     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
  3594
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3595
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3596
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3597
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3598
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3599
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3600
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3601
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3602
     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
  3603
               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
  3604
                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
  3605
                 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
  3606
                  withOriginalClass:false.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3607
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3608
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3609
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3610
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3611
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3612
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3613
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3614
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3615
     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
  3616
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3617
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  3618
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3619
    "Modified: / 25-06-1996 / 22:11:21 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3620
    "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
  3621
    "Modified: / 29-07-2014 / 11:58:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3622
    "Modified (comment): / 21-11-2017 / 13:03:09 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3623
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3624
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3625
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
  3626
    "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
  3627
     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
  3628
     entry, and get the current context passed as argument. ExitBlock will be called,
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3629
     when the method is left, and get the current context and the method's return value as argument.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3630
     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
  3631
     before the wrapped method will be called.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3632
     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
  3633
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3634
    ^ self
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3635
        wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3636
        additionalEntryCode:nil additionalExitCode:nil  additionalVariables:nil
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3637
        withOriginalClass:withOriginalClass flushCaches:flushCaches
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3638
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3639
    "Modified (comment): / 21-11-2017 / 13:03:16 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3640
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3641
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3642
wrap:anObject selectors:aCollection onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3643
    "install wrappers for anObject on all selectors from aCollection"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3644
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3645
    aCollection do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3646
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3647
	    wrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3648
	    onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3649
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3650
	    flushCaches:false
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3651
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3652
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3653
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3654
    "Modified: / 21.4.1998 / 15:40:28 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3655
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3656
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3657
wrapAll:anObject onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3658
    "install wrappers for anObject on all implemented selectors"
27
claus
parents: 26
diff changeset
  3659
claus
parents: 26
diff changeset
  3660
    |allSelectors|
claus
parents: 26
diff changeset
  3661
claus
parents: 26
diff changeset
  3662
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3663
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3664
	aClass methodDictionary keys addAllTo:allSelectors
27
claus
parents: 26
diff changeset
  3665
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3666
    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
  3667
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3668
    "Modified: 5.6.1996 / 14:50:07 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3669
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3670
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3671
!MessageTracer class methodsFor:'queries'!
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3672
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3673
allWrappedMethods
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3674
    ^ WrappedMethod allWrappedMethods. 
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3675
    "/ ^ Smalltalk allMethodsForWhich:[:mthd | mthd isWrapped]
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3676
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3677
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3678
areAnyMethodsWrapped
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3679
    ^ WrappedMethod allWrappedMethods notEmpty.
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3680
"/    Smalltalk allMethodsDo:[:mthd |
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3681
"/        mthd isWrapped ifTrue:[ ^ true ]
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3682
"/    ].
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3683
"/    ^ false
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3684
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3685
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3686
isCounting:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3687
    "return true if aMethod is counted"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3688
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3689
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3690
	(MethodCounts includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3691
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3692
	    (MethodCounts includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3693
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3694
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3695
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3696
	(MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3697
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3698
	    (MethodCountsPerReceiverClass includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3699
	].
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3700
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3701
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3702
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3703
    "Created: 15.12.1995 / 11:07:58 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3704
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3705
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3706
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3707
isCountingByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3708
    "return true if aMethod is counted with per receiver class statistics"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3709
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3710
    MethodCountsPerReceiverClass isNil ifTrue:[^ false].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3711
    (MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3712
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3713
	^ MethodCountsPerReceiverClass includesKey:aMethod originalMethod
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3714
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3715
    ^ false
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3716
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3717
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3718
isMocking:aMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3719
    "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
  3720
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3721
    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
  3722
    ^ false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3723
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3724
    "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
  3725
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3726
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3727
isTiming:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3728
    "return true if aMethod is timed"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3729
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3730
    MethodTiming isNil ifTrue:[^ false].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3731
    (MethodTiming includesKey:aMethod) ifTrue:[^ true].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3732
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3733
	^ MethodTiming includesKey:aMethod originalMethod
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3734
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3735
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3736
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3737
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3738
    "Created: 17.6.1996 / 17:04:29 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3739
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3740
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3741
isTrapped:aMethod
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3742
    "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
  3743
     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
  3744
     this returns false)"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3745
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3746
    aMethod isWrapped ifFalse:[^ false].
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3747
    ^ aMethod basicLiterals includesIdentical:LeaveBreakBlock
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3748
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3749
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3750
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3751
     Transcript showCR:(Collection compiledMethodAt:#select:) isWrapped.
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3752
     Transcript showCR:(MessageTracer isTrapped:(Collection compiledMethodAt:#select:)).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3753
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3754
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3755
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3756
    "Modified: 22.10.1996 / 17:40:37 / cg"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3757
! !
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3758
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3759
!MessageTracer class methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3760
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3761
dummyEmptyMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3762
    "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
  3763
     a dummy method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3764
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3765
    "Created: / 30.7.1998 / 16:58:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3766
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3767
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3768
getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3769
    "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
  3770
     a timed method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3771
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3772
    |m times|
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3773
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3774
    TimeForWrappers := 0.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3775
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3776
    "/ wrap the dummy method ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3777
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3778
    m := self class compiledMethodAt:#dummyEmptyMethod.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3779
    m := self timeMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3780
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3781
    "/ invoke it a few times ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3782
    "/ (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
  3783
    "/  depends on whether there is already some statistic data)
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3784
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3785
    10 timesRepeat:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3786
	self dummyEmptyMethod.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3787
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3788
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3789
    "/ fetch min time & unwrap
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3790
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3791
    times := self executionTimesOfMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3792
    self stopTimingMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3793
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3794
    ^ (TimeForWrappers := times avgTime)
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3795
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3796
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3797
     self getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3798
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3799
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3800
    "Modified: / 05-03-2007 / 15:44:24 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3801
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3802
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3803
printEntryFull:aContext
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3804
    self printEntryFull:aContext level:0 on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3805
!
27
claus
parents: 26
diff changeset
  3806
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3807
printEntryFull:aContext level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3808
    self printEntryFull:aContext level:lvl on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3809
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3810
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3811
printEntryFull:aContext level:lvl on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3812
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3813
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3814
	nextPutAll:'enter '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3815
    self printFull:aContext on:aStream withSender:true.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3816
!
27
claus
parents: 26
diff changeset
  3817
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3818
printEntryFull:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3819
    self printEntryFull:aContext level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3820
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3821
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3822
printEntrySender:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3823
    |sender mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3824
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3825
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3826
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3827
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3828
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3829
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3830
    ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3831
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3832
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3833
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3834
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3835
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3836
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3837
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3838
	nextPutAll:' from '.
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3839
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3840
    sender := aContext sender.
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3841
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3842
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3843
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3844
	].
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3845
    ].
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3846
    sender printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3847
    aStream cr; flush.
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3848
695
88a741b6008f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 694
diff changeset
  3849
    "Modified: / 30.7.1998 / 20:40:14 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3850
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3851
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3852
printExit:aContext with:retVal
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3853
    self printExit:aContext with:retVal level:0 on:Processor activeProcess stderr
27
claus
parents: 26
diff changeset
  3854
!
claus
parents: 26
diff changeset
  3855
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3856
printExit:aContext with:retVal level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3857
    self printExit:aContext with:retVal level:lvl on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3858
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3859
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3860
printExit:aContext with:retVal level:lvl on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3861
    |mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3862
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3863
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3864
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3865
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3866
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3867
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3868
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3869
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3870
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3871
	nextPutAll:'leave ';
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3872
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3873
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3874
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3875
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3876
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3877
	nextPutAll:' rec=['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3878
1486
d7ae9a86ea38 print same receiver on entry and exit
Stefan Vogel <sv@exept.de>
parents: 1472
diff changeset
  3879
    self printObject:aContext receiver on:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3880
    aStream nextPutAll:'] return: ['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3881
    retVal printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3882
    aStream nextPutAll:']'; cr; flush.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3883
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3884
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3885
printExit:aContext with:retVal on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3886
    self printExit:aContext with:retVal level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3887
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3888
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3889
printFull:aContext on:aStream withSender:withSender
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3890
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3891
	printFull:aContext on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3892
	withSenderContext:(withSender ifTrue:[aContext sender]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3893
				      ifFalse:[nil])
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3894
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3895
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3896
printFull:aContext on:aStream withSenderContext:aSenderContextOrNil
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3897
    |mClass mClassName|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3898
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3899
    mClass := aContext methodClass.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3900
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3901
	mClassName := '???'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3902
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3903
	mClassName := mClass name
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3904
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3905
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3906
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3907
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3908
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3909
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3910
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3911
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3912
	nextPutAll:' rec=['.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3913
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3914
    self printObject:aContext receiver on:aStream.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3915
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3916
    aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3917
    (aContext args) keysAndValuesDo:[:idx :arg |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3918
	aStream nextPutAll:'arg'. idx printOn:aStream. aStream nextPutAll:'=['.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3919
	self printObject:arg on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3920
	aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3921
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3922
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3923
    aSenderContextOrNil notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3924
	self printSender:aSenderContextOrNil on:aStream.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3925
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3926
    aStream cr; flush.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3927
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3928
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3929
printObject:anObject on:aStream
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3930
    |s|
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3931
4165
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3932
    anObject isProtoObject ifTrue:[
4533
d75502a4c955 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4498
diff changeset
  3933
        s := anObject class nameWithArticle
4165
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3934
    ] ifFalse:[
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3935
        s := anObject printString.
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3936
        s size > 40 ifTrue:[
4172
96c1701f5490 #UI_ENHANCEMENT by sr
sr
parents: 4165
diff changeset
  3937
            s := s contractTo:40.
4165
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3938
        ].
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3939
    ].
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3940
    aStream nextPutAll:s
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3941
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3942
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3943
printSender:aSenderContext on:aStream
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3944
    |sender|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3945
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3946
    sender := aSenderContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3947
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3948
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3949
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3950
	].
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3951
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3952
    aStream nextPutAll:'from:'.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3953
    aStream bold.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3954
    sender printOn:aStream.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3955
    aStream normal.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3956
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3957
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3958
printUpdateEntryFull:aContext level:lvl on:aStream
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3959
    "called when tracing changed-update sequences.
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3960
     Searches for the sender of the changed message and prints its context"
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3961
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3962
    |con|
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3963
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3964
    con := aContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3965
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3966
    [con notNil
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3967
     and:[con selector ~~ #'changed:with:']
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3968
    ] whileTrue:[
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3969
        con := con sender.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3970
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3971
    "/ con is #'changed:with:'
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3972
    con isNil ifTrue:[
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3973
        ^ self printEntryFull:aContext level:lvl on:aStream.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3974
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3975
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3976
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3977
    and:[ con sender selector == #'changed:']) ifTrue:[
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3978
        con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3979
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3980
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3981
    and:[ con sender selector == #'changed']) ifTrue:[
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3982
        con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3983
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3984
    (con sender notNil) ifTrue:[
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3985
        con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3986
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3987
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3988
    aStream spaces:lvl; nextPutAll:'enter '.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3989
    self
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3990
        printFull:aContext
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3991
        on:aStream
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3992
        withSenderContext:con
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3993
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3994
697
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3995
traceEntryFull:aContext on:aStream
4468
f19b16167969 #UI_ENHANCEMENT by exept
Claus Gittinger <cg@exept.de>
parents: 4452
diff changeset
  3996
    aStream nextPutLine:'------------------Message Trace-----------------------'.
697
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3997
    aContext fullPrintAllOn:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3998
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3999
    "Created: / 30.7.1998 / 20:39:57 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  4000
    "Modified: / 30.7.1998 / 20:42:23 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  4001
!
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  4002
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4003
traceFullBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4004
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4005
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4006
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4007
	^ TraceFullBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4008
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4009
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4010
	^ TraceFullBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4011
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4012
    ^ [:con | con fullPrintAllOn:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4013
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4014
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4015
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4016
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4017
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4018
traceSenderBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4019
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4020
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4021
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4022
	^ TraceSenderBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4023
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4024
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4025
	^ TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4026
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4027
    ^ [:con | MessageTracer printEntrySender:con on:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4028
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4029
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  4030
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4031
! !
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  4032
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  4033
!MessageTracer methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4034
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4035
trace:aBlock detail:fullDetail
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4036
    "trace execution of aBlock."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4037
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4038
    traceDetail := fullDetail.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4039
    tracedBlock := aBlock.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4040
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4041
    ObjectMemory stepInterruptHandler:self.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4042
    ^ [
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4043
	ObjectMemory flushInlineCaches.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4044
	StepInterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4045
	InterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4046
	aBlock value
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
  4047
    ] ensure:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4048
	tracedBlock := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4049
	StepInterruptPending := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4050
	ObjectMemory stepInterruptHandler:nil.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4051
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4052
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4053
    "
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4054
     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
  4055
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4056
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4057
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4058
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4059
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4060
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  4061
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  4062
! !
27
claus
parents: 26
diff changeset
  4063
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  4064
!MessageTracer::InteractionCollector methodsFor:'trace helpers'!
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4065
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4066
stepInterrupt
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4067
    StepInterruptPending := nil.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4068
    ObjectMemory flushInlineCaches.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4069
    StepInterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4070
    InterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4071
! !
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4072
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4073
!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
  4074
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4075
profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4076
    ^ profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4077
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4078
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4079
profiler:aMessageTally
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4080
    profiler := aMessageTally.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4081
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4082
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4083
!MessageTracer::MethodTimingInfo methodsFor:'accessing'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4084
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4085
avgTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4086
    sumTimes notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4087
	^ sumTimes / count
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4088
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4089
    ^ nil
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4090
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4091
    "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
  4092
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4093
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4094
avgTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4095
    |avg|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4096
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4097
    avg := self avgTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4098
    avg > 100 ifTrue:[ ^ avg roundTo:1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4099
    avg > 10 ifTrue:[ ^ avg roundTo:0.1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4100
    avg > 1 ifTrue:[ ^ avg roundTo:0.01 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4101
    ^ avg roundTo:0.001
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4102
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4103
    "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
  4104
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4105
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4106
count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4107
    ^ count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4108
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4109
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4110
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
  4111
    count := countArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4112
    minTime := minTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4113
    maxTime := maxTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4114
    sumTimes := sumTimesArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4115
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4116
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4117
maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4118
    ^ maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4119
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4120
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4121
maxTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4122
    |max|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4123
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4124
    max := self maxTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4125
    ^ 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
  4126
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4127
    "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
  4128
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4129
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4130
minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4131
    ^ minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4132
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4133
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4134
minTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4135
    |min|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4136
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4137
    min := self minTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4138
    ^ 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
  4139
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4140
    "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
  4141
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4142
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4143
sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4144
    ^ sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4145
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4146
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4147
!MessageTracer::MethodTimingInfo methodsFor:'initialization'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4148
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4149
rememberExecutionTime:t
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4150
    (count isNil or:[count == 0]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4151
	minTime := maxTime := sumTimes := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4152
	count := 1.
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4153
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4154
	t < minTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4155
	    minTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4156
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4157
	    t > maxTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4158
		maxTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4159
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4160
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4161
	sumTimes := (sumTimes + t).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4162
	count := count + 1
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4163
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4164
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4165
    "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
  4166
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4167
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4168
!MessageTracer::PrintingMessageTracer methodsFor:'accessing'!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4169
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4170
output:something
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4171
    output := something.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4172
! !
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4173
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  4174
!MessageTracer::PrintingMessageTracer methodsFor:'trace helpers'!
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4175
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4176
stepInterrupt
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4177
    "called for every send while tracing"
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4178
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  4179
    |ignore sel con r outStream senderContext|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4180
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4181
    StepInterruptPending := nil.
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  4182
    con := senderContext := thisContext sender.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4183
    ignore := false.
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4184
    outStream := output notNil ifTrue:[output] ifFalse:[Processor activeProcess stderr].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4185
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4186
    con receiver == Processor ifTrue:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4187
        (sel := con selector) == #threadSwitch: ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4188
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4189
        ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4190
        sel == #timerInterrupt ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4191
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4192
        ]
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4193
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4194
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4195
    con lineNumber == 1 ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4196
        ignore := true
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4197
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4198
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4199
    ignore ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4200
        con markForInterruptOnUnwind.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4201
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4202
        ((r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4203
        and:[r ~~ tracedBlock]) ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4204
            traceDetail == #fullIndent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4205
                [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4206
                and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4207
                and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4208
                    '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4209
                    con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4210
                ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4211
                con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4212
                self class printFull:con on:outStream withSender:false.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4213
            ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4214
                traceDetail == #indent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4215
                    [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4216
                    and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4217
                    and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4218
                        '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4219
                        con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4220
                    ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4221
                    con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4222
                    con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4223
                    outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4224
                ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4225
                    traceDetail == true ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4226
                        self class printFull:con on:outStream withSender:true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4227
                    ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4228
                        con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4229
                        outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4230
                    ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4231
                ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4232
            ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4233
        ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4234
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4235
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4236
    ObjectMemory flushInlineCaches.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4237
    StepInterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4238
    InterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4239
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4240
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4241
     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
  4242
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4243
     self new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4244
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4245
     self new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4246
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4247
     self new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4248
     self new trace:[ View new ] detail:#fullIndent
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4249
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4250
! !
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4251
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  4252
!MessageTracer class methodsFor:'documentation'!
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  4253
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
  4254
version_CVS
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  4255
    ^ '$Header$'
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  4256
! !
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
  4257
3130
cf77484583b8 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2972
diff changeset
  4258
27
claus
parents: 26
diff changeset
  4259
MessageTracer initialize!