MessageTracer.st
author Claus Gittinger <cg@exept.de>
Sat, 29 Jun 2019 09:22:41 +0200
changeset 4451 8fcca6fa38f7
parent 4403 f3d3c97042ea
child 4452 48908302f213
permissions -rw-r--r--
#FEATURE by cg class: MessageTracer class added: #traceMethod:in:on: #traceMethodFull:in:on: comment/format in:23 methods
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
     1
"{ Encoding: utf8 }"
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
     2
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     3
"
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
     5
	      All Rights Reserved
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     6
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    13
"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    14
"{ Package: 'stx:libbasic3' }"
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
    15
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    16
"{ NameSpace: Smalltalk }"
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    17
120
950e4628d657 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    18
Object subclass:#MessageTracer
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    19
	instanceVariableNames:'traceDetail tracedBlock'
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    20
	classVariableNames:'BreakpointSignal CallingLevel BreakBlock TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
    21
		TraceSenderBlock2 LeaveBreakBlock LeaveTraceBlock MethodCounts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    22
		MethodCountsPerReceiverClass MethodMemoryUsage MethodTiming
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
    23
		TraceFullBlock TraceFullBlock2 ObjectWrittenBreakpointSignal
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
    24
		ObjectCopyHolders TimeForWrappers MockedMethodMarker'
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    25
	poolDictionaries:''
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
    26
	category:'System-Debugging-Support'
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    27
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    28
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    29
MessageTracer subclass:#InteractionCollector
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    30
	instanceVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    31
	classVariableNames:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    32
	poolDictionaries:''
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    33
	privateIn:MessageTracer
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    34
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
    35
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    36
Object subclass:#MethodSpyInfo
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    37
	instanceVariableNames:'profiler'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    38
	classVariableNames:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    39
	poolDictionaries:''
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    40
	privateIn:MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    41
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
    42
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    43
Object subclass:#MethodTimingInfo
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    44
	instanceVariableNames:'count minTime maxTime sumTimes avgTime'
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    45
	classVariableNames:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    46
	poolDictionaries:''
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    47
	privateIn:MessageTracer
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    48
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
    49
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
    50
MessageTracer subclass:#PrintingMessageTracer
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    51
	instanceVariableNames:'output'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    52
	classVariableNames:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    53
	poolDictionaries:''
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    54
	privateIn:MessageTracer
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    55
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
    56
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
    57
!MessageTracer class methodsFor:'documentation'!
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    58
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    59
copyright
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    60
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    61
 COPYRIGHT (c) 1994 by Claus Gittinger
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    62
	      All Rights Reserved
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    63
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    64
 This software is furnished under a license and may be used
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    65
 only in accordance with the terms of that license and with the
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    66
 inclusion of the above copyright notice.   This software may not
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    67
 be provided or otherwise made available to, or used by, any
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    68
 other person.  No title to or ownership of the software is
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    69
 hereby transferred.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    70
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    71
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 8
diff changeset
    72
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    73
documentation
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    74
"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    75
    This class provides a common home for the tracing
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    76
    facilities (originally, they where in Object, but have been moved to
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
    77
    allow easier separation of development vs. runtime configurations).
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    78
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    79
    tracing execution of a block:
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    80
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    81
	MessageTracer trace:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    82
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    83
	MessageTracer traceFull:[ ... ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    84
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    85
	(for system developer only:)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    86
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    87
	MessageTracer debugTrace:[ ... ]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    88
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    89
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    90
    trapping sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    91
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    92
	MessageTracer trap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    93
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    94
	MessageTracer untrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    95
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
    96
	MessageTracer untrap:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
    97
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    98
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
    99
27
claus
parents: 26
diff changeset
   100
    trapping some messages sent to a specific object:
claus
parents: 26
diff changeset
   101
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   102
	MessageTracer trap:anObject selectors:aCollectionOfSelectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   103
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   104
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   105
claus
parents: 26
diff changeset
   106
claus
parents: 26
diff changeset
   107
claus
parents: 26
diff changeset
   108
    trapping any message sent to a specific object:
claus
parents: 26
diff changeset
   109
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   110
	MessageTracer trapAll:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   111
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   112
	MessageTracer untrap:anObject
27
claus
parents: 26
diff changeset
   113
claus
parents: 26
diff changeset
   114
claus
parents: 26
diff changeset
   115
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   116
    trapping evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   117
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   118
	MessageTracer trapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   119
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   120
	MessageTracer unwrapMethod:aMethod
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   121
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   122
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   123
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   124
    trapping evaluation of a specific method with
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   125
    receiver being an instance of some class:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   126
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   127
	MessageTracer trapMethod:aMethod forInstancesOf:aClass
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   128
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   129
	MessageTracer unwrapMethod:aMethod
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   130
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   131
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   132
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   133
    tracing sends to a specific object:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   134
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   135
	MessageTracer trace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   136
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   137
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   138
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   139
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   140
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   141
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   142
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   143
    tracing sender only:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   144
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   145
	MessageTracer traceSender:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   146
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   147
	MessageTracer untrace:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   148
	or:
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   149
	MessageTracer untrace:anObject
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   150
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   151
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   152
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   153
    tracing evaluation of a specific method:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   154
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   155
	MessageTracer traceMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   156
	...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   157
	MessageTracer unwrapmethod:aMethod
18
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   158
3212d3164f28 *** empty log message ***
claus
parents: 17
diff changeset
   159
  see more in examples and in method comments.
236
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   160
7f570e0a0a75 documentation
Claus Gittinger <cg@exept.de>
parents: 196
diff changeset
   161
    [author:]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   162
	Claus Gittinger
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   163
"
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   164
!
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   165
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   166
examples
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   167
"
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   168
  For the common cases, you will find a menu entry in the SystemBrowser.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   169
  Howeever, more special cases (especially with condition checks) can be
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   170
  set up by evaluating the lower level entries.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   171
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   172
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   173
  trapping specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   174
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   175
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   176
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   177
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   178
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   179
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   180
     MessageTracer untrapClass:Collection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   181
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   182
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   183
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   184
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   185
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   186
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   187
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   188
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   189
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   190
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   191
27
claus
parents: 26
diff changeset
   192
  (by method & instance class):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   193
									[exBegin]
27
claus
parents: 26
diff changeset
   194
     MessageTracer trapMethod:(SequenceableCollection compiledMethodAt:#select:)
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   195
		   forInstancesOf:SortedCollection.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   196
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   197
     (Array new:10) select:[:e | ].       'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   198
     OrderedCollection new select:[:e | ]. 'not caught - not a SortedCollection'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   199
     SortedCollection new select:[:e | ].  'caught - Set inherits this from Collection'.
27
claus
parents: 26
diff changeset
   200
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#select:).
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   201
									[exEnd]
27
claus
parents: 26
diff changeset
   202
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   203
  tracing specific methods:
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   204
  (by class/selector):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   205
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   206
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   207
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   208
     MessageTracer untraceClass:SequenceableCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   209
									[exEnd]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   210
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   211
  (by method):
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   212
									[exBegin]
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   213
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   214
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   215
     MessageTracer unwrapMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   216
									[exEnd]
27
claus
parents: 26
diff changeset
   217
claus
parents: 26
diff changeset
   218
  object trapping:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   219
									[exBegin]
27
claus
parents: 26
diff changeset
   220
     |o|
claus
parents: 26
diff changeset
   221
claus
parents: 26
diff changeset
   222
     o := OrderedCollection new.
claus
parents: 26
diff changeset
   223
     MessageTracer trapAll:o.
claus
parents: 26
diff changeset
   224
     o collect:[:el | el].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   225
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   226
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   227
  trapping modifications to an objects instVars:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   228
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   229
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   230
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   231
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   232
     MessageTracer trapModificationsIn:o.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   233
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   234
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   235
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   236
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   237
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   238
									[exEnd]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   239
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   240
  trapping modifications of a particular instVar:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   241
									[exBegin]
661
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   242
     |o|
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   243
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   244
     o := Point new.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   245
     MessageTracer trapModificationsIn:o filter:[:old :new | old x ~~ new x].
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   246
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   247
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   248
     o x:1.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   249
     o y:2.
57786f56e433 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 660
diff changeset
   250
     MessageTracer untrap:o
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   251
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   252
  tracing during block execution:
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   253
									[exBegin]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   254
     MessageTracer trace:[ 10 factorialR ]
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   255
									[exEnd]
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   256
12
2bfc13a2b95a added conditional wrap
claus
parents: 11
diff changeset
   257
"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   258
! !
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
   259
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   260
!MessageTracer class methodsFor:'Signal constants'!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   261
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   262
breakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   263
    ^ BreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   264
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   265
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   266
objectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   267
    ^ ObjectWrittenBreakpointSignal
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   268
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   269
    "Created: / 21.4.1998 / 14:38:49 / cg"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   270
! !
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   271
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
   272
!MessageTracer class methodsFor:'class initialization'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   273
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   274
initialize
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   275
    BreakpointSignal isNil ifTrue:[
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   276
        "/ BreakpointSignal := HaltSignal newSignalMayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   277
        "/ BreakpointSignal nameClass:self message:#breakpointSignal.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   278
        BreakpointSignal := BreakPointInterrupt.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   279
        BreakpointSignal notifierString:'breakpoint encountered'.
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   280
    ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   281
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   282
    ObjectWrittenBreakpointSignal isNil ifTrue:[
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   283
        ObjectWrittenBreakpointSignal := BreakpointSignal newSignalMayProceed:true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   284
        ObjectWrittenBreakpointSignal nameClass:self message:#objectWrittenBreakpointSignal.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   285
        ObjectWrittenBreakpointSignal notifierString:'object modified'.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   286
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   287
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   288
    "/ the following have been written as cheapBlocks (by purpose)
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   289
    BreakBlock       := [:con | BreakpointSignal raiseRequestWith:nil errorString:nil in:con].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   290
    TraceSenderBlock  := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Stderr)     ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   291
    TraceSenderBlock2 := [:con | MessageTracer printEntrySender:con on:(Smalltalk at:#Transcript) ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   292
    TraceFullBlock    := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Stderr)       ].
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   293
    TraceFullBlock2   := [:con | MessageTracer traceEntryFull:con on:(Smalltalk at:#Transcript)   ].
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   294
    LeaveBreakBlock  := [:con :retVal | retVal ].
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   295
    LeaveTraceBlock  := [:con :retVal | retVal ].
1072
be2dc8ccd3d7 more class based exceptions
Claus Gittinger <cg@exept.de>
parents: 1071
diff changeset
   296
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   297
    ObjectMemory addDependent:self.
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   298
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   299
    MockedMethodMarker := Object new.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   300
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   301
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   302
     BreakpointSignal := nil.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   303
     MessageTracer initialize
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   304
    "
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
   305
2523
1792565ea2f2 changed: #initialize
Claus Gittinger <cg@exept.de>
parents: 2396
diff changeset
   306
    "Modified: / 15-09-2011 / 19:02:13 / cg"
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
   307
    "Modified: / 29-07-2014 / 09:16:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   308
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   309
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   310
update:something with:parameter from:changedObject
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   311
    "sent when restarted after a snapIn"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   312
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   313
    (something == #restarted) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   314
	TimeForWrappers := nil
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   315
    ]
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   316
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
   317
    "Created: / 30.7.1998 / 17:00:09 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   318
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   319
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   320
!MessageTracer class methodsFor:'class tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   321
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   322
untraceAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   323
    "remove all traces of messages sent to any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   324
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   325
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   326
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   327
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   328
    ^ self untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   329
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   330
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   331
untraceClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   332
    "remove all traces of messages sent to instances of aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   333
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   334
    "just a rename for your convenience - the same basic mechanism is used for all of these
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   335
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   336
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   337
    ^ self untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   338
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   339
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   340
!MessageTracer class methodsFor:'class wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   341
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   342
wrapClass:orgClass selector:aSelector onEntry:entryBlock onExit:exitBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   343
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   344
     aSelector is sent to instances of orgClass or subclasses.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   345
     EntryBlock will be called on entry, and get the current context passed as argument.
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
   346
     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
   347
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   348
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
   349
    |myMetaclass trapMethod s spec implClass newClass dict|
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   350
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   351
    WrappedMethod autoload.     "/ just to make sure ...
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   352
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   353
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   354
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   355
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   356
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   357
    spec := Parser methodSpecificationForSelector:aSelector.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   358
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   359
    s := WriteStream on:''.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   360
    s nextPutAll:spec.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   361
    s cr.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
   362
    s nextPutAll:'<context: #return>'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   363
    s nextPutAll:'|retVal stubClass|'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   364
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   365
        s nextPutAll:'#literal1 yourself value:thisContext.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   366
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   367
    s nextPutAll:('retVal := #originalMethod. ').    "/ just to get a literal to be replaced by theoriginal method
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   368
    s nextPutAll:('retVal := super ' , spec , '.'); cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   369
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   370
        s nextPutAll:'#literal2 yourself value:thisContext value:retVal.'; cr.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   371
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   372
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   373
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   374
    ParserFlags
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   375
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   376
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   377
            Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   378
                trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   379
                                compile:s contents
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   380
                                forClass:orgClass
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   381
                                inCategory:'trapping'
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   382
                                notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   383
                                install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   384
                                skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   385
                                silent:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   386
            ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   387
        ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   388
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   389
    implClass := orgClass whichClassIncludesSelector:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   390
    implClass isNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   391
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   392
    ] ifFalse:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   393
        trapMethod changeLiteral:#originalMethod to:(implClass compiledMethodAt:aSelector).
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   394
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   395
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   396
        trapMethod changeLiteral:#literal1 to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   397
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   398
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   399
        trapMethod changeLiteral:#literal2 to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   400
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   401
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   402
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   403
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   404
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   405
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   406
    trapMethod source:'this is a wrapper method - not the real one'.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   407
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   408
    trapMethod register.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   409
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   410
    dict := orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   411
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   412
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   413
     if not already trapping, create a new class
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   414
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   415
    orgClass category == #'* trapping *' ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   416
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   417
        orgClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   418
        newClass := orgClass superclass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   419
    ] ifFalse:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   420
        myMetaclass := orgClass class.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   421
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   422
        newClass := myMetaclass copy new.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   423
        newClass setSuperclass:orgClass superclass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   424
        newClass instSize:orgClass instSize.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   425
        newClass flags:orgClass flags.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   426
        newClass setClassVariableString:orgClass classVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   427
        newClass setSharedPoolNames:(orgClass sharedPoolNames).
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   428
        newClass setInstanceVariableString:orgClass instanceVariableString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   429
        newClass setName:orgClass name.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   430
        newClass setCategory:orgClass category.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   431
        newClass methodDictionary:dict.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   432
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   433
        orgClass setSuperclass:newClass.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   434
        orgClass setClassVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   435
        orgClass setInstanceVariableString:''.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   436
        orgClass setCategory:#'* trapping *'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   437
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   438
        dict := MethodDictionary new:1.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   439
        dict at:aSelector put:trapMethod.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   440
        orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   441
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
   442
    trapMethod changeLiteral:(newClass superclass) to:newClass.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   443
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   444
    ObjectMemory flushCaches.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   445
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   446
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   447
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   448
                wrapClass:Point
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   449
                 selector:#scaleBy:
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   450
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   451
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   452
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   453
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   454
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   455
                           ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   456
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   457
     MessageTracer untrapClass:Point selector:#scaleBy:.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   458
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   459
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   460
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   461
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   462
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   463
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   464
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   465
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   466
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   467
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   468
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   469
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   470
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   471
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   472
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   473
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   474
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   475
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   476
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   477
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   478
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   479
     |lvl|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   480
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   481
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   482
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   483
                wrapClass:Integer
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   484
                 selector:#factorial
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   485
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   486
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   487
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   488
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   489
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   490
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   491
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   492
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   493
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
   494
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   495
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   496
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   497
     MessageTracer untrapClass:Integer selector:#factorial.
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
   498
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   499
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   500
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
   501
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   502
    "Modified: / 25-06-1996 / 22:01:05 / stefan"
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
   503
    "Modified: / 01-07-2011 / 10:01:59 / cg"
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
   504
    "Modified (comment): / 21-11-2017 / 13:03:22 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   505
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   506
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   507
!MessageTracer class methodsFor:'cleanup'!
27
claus
parents: 26
diff changeset
   508
claus
parents: 26
diff changeset
   509
cleanup
claus
parents: 26
diff changeset
   510
    "if you forgot which classes/methods where wrapped and/or trapped,
claus
parents: 26
diff changeset
   511
     this cleans up everything ..."
claus
parents: 26
diff changeset
   512
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   513
    ObjectCopyHolders := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   514
    MethodCounts := MethodMemoryUsage := MethodTiming := TimeForWrappers := nil.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   515
27
claus
parents: 26
diff changeset
   516
    self untrapAllClasses.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
   517
    self unwrapAllMethods.
27
claus
parents: 26
diff changeset
   518
claus
parents: 26
diff changeset
   519
    "
claus
parents: 26
diff changeset
   520
     MessageTracer cleanup
claus
parents: 26
diff changeset
   521
    "
claus
parents: 26
diff changeset
   522
! !
claus
parents: 26
diff changeset
   523
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
   524
!MessageTracer class methodsFor:'execution trace'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   525
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   526
debugTrace:aBlock
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   527
    "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
   528
     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
   529
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   530
    ObjectMemory sendTraceOn.
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
   531
    ^ aBlock ensure:[ObjectMemory sendTraceOff]
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   532
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   533
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   534
     MessageTracer debugTrace:[#(6 5 4 3 2 1) sort]
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   535
    "
196
330cc5c849de debugOn/Off is now called sendTraceOn/Off
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   536
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
   537
    "Modified: / 31.7.1998 / 16:39:43 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   538
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   539
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   540
trace:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   541
    "evaluate aBlock sending trace information to stdout.
27
claus
parents: 26
diff changeset
   542
     Return the value of the block."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   543
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   544
     ^ self trace:aBlock on:(Processor activeProcess stderr)
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   545
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   546
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   547
     MessageTracer trace:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   548
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   549
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   550
    "Modified (comment): / 29-06-2019 / 09:05:58 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   551
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   552
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   553
trace:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   554
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   555
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   556
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   557
    ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   558
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   559
	trace:aBlock detail:false.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   560
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   561
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   562
     MessageTracer trace:[#(6 5 4 3 2 1) sort] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   563
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   564
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   565
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   566
traceFull:aBlock
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   567
    "evaluate aBlock sending trace information to stdout.
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   568
     Return the value of the block.
27
claus
parents: 26
diff changeset
   569
     The trace information is more detailed."
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   570
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   571
     ^ self traceFull:aBlock on:(Processor activeProcess stderr)
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   572
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   573
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   574
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   575
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   576
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   577
    "Modified (comment): / 29-06-2019 / 09:05:54 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   578
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   579
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   580
traceFull:aBlock on:aStream
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   581
    "evaluate aBlock sending trace information to stdout.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   582
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   583
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   584
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   585
     ^ PrintingMessageTracer new
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   586
	output:aStream;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   587
	trace:aBlock detail:true.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   588
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   589
    "
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   590
     MessageTracer traceFull:[#(6 5 4 3 2 1) sort]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   591
    "
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   592
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   593
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   594
traceFullIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   595
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   596
     Return the value of the block.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   597
     The trace information is more detailed."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   598
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   599
     ^ self traceFullIndented:aBlock on:(Processor activeProcess stderr)
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   600
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   601
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   602
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   603
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   604
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   605
    "Modified (comment): / 29-06-2019 / 09:05:51 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   606
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   607
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   608
traceFullIndented:aBlock on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   609
    "evaluate aBlock sending trace information to aStream.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   610
     Return the value of the block.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   611
     The trace information is more detailed."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   612
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   613
     ^ PrintingMessageTracer new
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   614
        output:aStream;
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   615
        trace:aBlock detail:#fullIndent.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   616
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   617
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   618
     MessageTracer traceFullIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   619
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   620
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   621
    "Modified (comment): / 29-06-2019 / 09:04:56 / Claus Gittinger"
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   622
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   623
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   624
traceIndented:aBlock
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   625
    "evaluate aBlock sending trace information to stdout.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   626
     Return the value of the block."
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   627
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   628
     ^ self traceIndented:aBlock on:(Processor activeProcess stderr)
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   629
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   630
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   631
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ]
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
   632
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   633
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   634
    "Modified (comment): / 29-06-2019 / 09:05:21 / Claus Gittinger"
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   635
!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   636
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   637
traceIndented:aBlock on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   638
    "evaluate aBlock sending trace information to aStream.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   639
     Return the value of the block."
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   640
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   641
     ^ PrintingMessageTracer new
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   642
        output:aStream;
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   643
        trace:aBlock detail:#indent.
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   644
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   645
    "
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   646
     MessageTracer traceIndented:[ #(6 5 4 3 2 1) sort ] on:Transcript
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   647
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   648
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
   649
    "Modified (comment): / 29-06-2019 / 09:04:47 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   650
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   651
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   652
!MessageTracer class methodsFor:'method breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   653
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   654
trapClass:aClass selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   655
    "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
   656
     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
   657
     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
   658
     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
   659
     entry/leave blocks."
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
    self trapMethod:(aClass compiledMethodAt:aSelector)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   662
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   663
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   664
     MessageTracer trapClass:Collection selector:#select:.
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   665
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   666
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   667
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   668
     MessageTracer untrapClass:Collection
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   669
    "
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   670
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   671
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   672
trapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   673
    "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
   674
     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
   675
     selective breakPoint.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   676
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   677
     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
   678
     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
   679
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   680
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   681
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   682
	      onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   683
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   684
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   685
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   686
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
591
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   687
     Dictionary new select:[:e | ].       'not caught - Dictionary has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   688
     (Array new:10) select:[:e | ].       'not caught - SeqColl has its own select'.
Claus Gittinger <cg@exept.de>
parents: 584
diff changeset
   689
     Set new select:[:e | ].              'caught - Set inherits this from Collection'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   690
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   691
    "
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   692
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   693
    "Modified: 22.10.1996 / 17:39:58 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   694
!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   695
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   696
trapMethod:aMethod after:countInvocations
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   697
    "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
   698
     The trap is enabled for any process.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   699
     Use unwrapMethod or untrapClass to remove this trap.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   700
     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
   701
     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
   702
     entry/leave blocks."
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|
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   705
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   706
    n := 0.
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   707
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   708
	      onEntry:[:con | n := n + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   709
			      n > countInvocations
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   710
			      ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   711
				BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   712
			      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   713
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   714
	       onExit:LeaveBreakBlock.
908
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   715
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   716
!
a18a76722a8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 840
diff changeset
   717
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   718
trapMethod:aMethod forInstancesOf:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   719
    "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
   720
     for an instance of aClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   721
     Use unwrapMethod or untrapClass to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   722
     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
   723
     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
   724
     entry/leave blocks."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   725
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   726
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   727
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   728
			 (con receiver isMemberOf:aClass) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   729
			     BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   730
			 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   731
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   732
	       onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   733
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   734
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   735
     MessageTracer trapMethod:(View compiledMethodAt:#redraw) forInstancesOf:myView.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   736
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   737
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   738
    "Modified: 22.10.1996 / 17:40:03 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   739
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   740
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   741
trapMethod:aMethod if:conditionBlock
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   742
    "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
   743
     evaluates to true.
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   744
     conditionBlock gets context and method as (optional) arguments.
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   745
     The trap is enabled for any process.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   746
     Use unwrapMethod or untrapClass to remove this trap.
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   747
     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
   748
     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
   749
     entry/leave blocks."
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   750
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   751
    ^ self
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   752
        wrapMethod:aMethod
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   753
        onEntry:[:con |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   754
            |conditionFires|
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   755
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   756
            Error handle:[:ex |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   757
                'MessageTrace: error in breakpoint condition caught: ' errorPrint.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   758
                ex description errorPrintCR.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   759
            ] do:[
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   760
                conditionFires := conditionBlock value:con optionalArgument:aMethod
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   761
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   762
            conditionFires == true ifTrue:[
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   763
                BreakpointSignal raiseRequestWith:nil errorString:nil in:con
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   764
            ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   765
        ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   766
        onExit:LeaveBreakBlock.
2291
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   767
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   768
    "Created: / 18-08-2000 / 22:09:10 / cg"
61f0ad740fac changed: #trapMethod:if:
Claus Gittinger <cg@exept.de>
parents: 2278
diff changeset
   769
    "Modified: / 20-10-2010 / 09:38:57 / cg"
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   770
    "Modified: / 08-03-2018 / 11:46:08 / stefan"
950
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   771
!
36a030c8f949 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 908
diff changeset
   772
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   773
trapMethod:aMethod inProcess:aProcess
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   774
    "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
   775
     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
   776
     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
   777
     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
   778
     Use unwrapMethod or untrapClass to remove this trap.
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   779
     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
   780
     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
   781
     entry/leave blocks."
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   782
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   783
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   784
	      onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   785
			(Processor activeProcess processGroupId = aProcess id) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   786
			    BreakpointSignal raiseRequestWith:nil errorString:nil in:con
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   787
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   788
		      ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   789
	       onExit:LeaveBreakBlock.
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   790
496
4efe08df0038 selective breakpoints
Claus Gittinger <cg@exept.de>
parents: 495
diff changeset
   791
    "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
   792
    "Modified: 22.10.1996 / 17:40:06 / cg"
495
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   793
!
786f6375d6ed checkin from browser
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   794
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   795
trapMethod:aMethod onReturnIf:conditionBlock
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   796
    "arrange for the debugger to be entered when aMethod returns
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   797
     and conditionBlock evaluates to true.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   798
     conditionBlock gets retVal, context and method as (optional) arguments.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   799
     The trap is enabled for any process.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   800
     Use unwrapMethod or untrapClass to remove this trap.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   801
     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
   802
     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
   803
     entry/leave blocks."
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   804
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   805
    ^ self
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   806
        wrapMethod:aMethod
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   807
        onEntry:[:con | ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   808
        onExit:[:con :retVal | 
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   809
            |conditionFires|
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   810
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   811
            Error handle:[:ex |
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   812
                'MessageTrace: error in breakpoint condition caught: ' errorPrint.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   813
                ex description errorPrintCR.
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   814
            ] do:[
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   815
                conditionFires := conditionBlock valueWithOptionalArgument:retVal and:con and:aMethod
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   816
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   817
            conditionFires == true ifTrue:[
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   818
                BreakpointSignal raiseRequestWith:nil errorString:nil in:con
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   819
            ].
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   820
            retVal
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   821
        ]
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   822
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   823
    "Created: / 18-08-2000 / 22:09:10 / cg"
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   824
    "Modified: / 20-10-2010 / 09:38:57 / cg"
4307
71f98f68ab1e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4296
diff changeset
   825
    "Modified: / 08-03-2018 / 11:47:57 / stefan"
4296
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   826
!
b9632c3b76c2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4265
diff changeset
   827
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   828
untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   829
    "remove any traps on any class"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   830
970
116aa95d7b97 allBehaviors vs. allClasses
Claus Gittinger <cg@exept.de>
parents: 957
diff changeset
   831
    Smalltalk allClassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   832
	self untrapClass:aClass
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   833
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   834
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   835
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   836
     MessageTracer untrapAllClasses
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   837
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   838
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   839
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   840
untrapClass:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   841
    "remove any traps on aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   842
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   843
    "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
   844
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   845
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   846
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   847
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   848
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   849
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   850
    orgClass := aClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   851
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   852
    aClass setSuperclass:orgClass superclass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   853
    aClass setClassVariableString:orgClass classVariableString.
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   854
    aClass setSharedPoolNames:(orgClass sharedPoolNames).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   855
    aClass setInstanceVariableString:orgClass instanceVariableString.
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
   856
    aClass setCategory:orgClass category.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   857
    aClass methodDictionary:orgClass methodDictionary.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   858
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   859
    ObjectMemory flushCaches.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   860
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   861
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   862
     MessageTracer untrapClass:Point
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   863
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   864
2310
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   865
    "Modified: / 05-06-1996 / 13:57:39 / stefan"
b191ef82774c changed:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
   866
    "Modified: / 18-01-2011 / 20:43:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   867
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   868
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   869
untrapClass:aClass selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   870
    "remove trap of aSelector sent to aClass"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   871
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   872
    |dict|
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   873
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
   874
    aClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   875
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   876
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   877
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   878
    dict := aClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   879
    dict at:aSelector ifAbsent:[^ self].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   880
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   881
    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
   882
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   883
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   884
	"the last trapped method"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   885
	^ self untrapClass:aClass
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   886
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   887
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   888
    aClass methodDictionary:dict.
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
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   891
     MessageTracer trapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   892
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   893
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   894
     MessageTracer trapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   895
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   896
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   897
     MessageTracer untrapClass:Point selector:#copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   898
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   899
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   900
     MessageTracer untrapClass:Point selector:#deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   901
     (1@2) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   902
     (1@2) deepCopy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   903
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   904
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
   905
    "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
   906
    "Modified: 10.9.1996 / 20:06:29 / cg"
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
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   909
untrapMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   910
    "remove break on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   911
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   912
    "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
   913
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   914
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   915
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   916
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
   917
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   918
!MessageTracer class methodsFor:'method breakpointing - new'!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   919
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   920
breakMethod: method atLine: line
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   921
    "Installs new breakpoint in given method at given line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   922
     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
   923
     installed"
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   924
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   925
    | analyzer map lines i breakpoint table |
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   926
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   927
    (ConfigurableFeatures includesFeature: #VMBreakpointSupport) ifFalse:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   928
        self error: 'Breakpoint support not present'.
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   929
        ^nil.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   930
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   931
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   932
    analyzer := BreakpointAnalyzer parseMethodSilent:(method source) in:(method mclass).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   933
    map := analyzer messageSendMap.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   934
    lines := map keys asSortedCollection.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   935
    i := lines indexForInserting: line.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   936
    i > lines size ifTrue:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   937
        ^nil
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   938
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   939
    breakpoint := Breakpoint new line: (lines at: i).
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   940
    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
   941
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   942
    table := method breakpointTable.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   943
    table isNil ifTrue:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   944
        "/old way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   945
        "/table := Array with: (breakpoint line) with: breakpoint.
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   946
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   947
        "/new way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   948
        table := Array with: breakpoint.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   949
    ] ifFalse:[
4403
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   950
        "/old way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   951
        "/table := table, (Array with: (breakpoint line) with: breakpoint).
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   952
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   953
        "/new way:
f3d3c97042ea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4390
diff changeset
   954
        table := table copyWith: breakpoint
3465
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
    method breakpointTable: 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
    ^breakpoint
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   959
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   960
    "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
   961
    "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
   962
    "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
   963
! !
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
   964
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
   965
!MessageTracer class methodsFor:'method counting'!
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   966
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   967
countMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
   968
    "arrange for a aMethod's execution to be counted.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   969
     Use unwrapMethod to remove this."
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   970
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   971
    MethodCounts isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   972
	MethodCounts := IdentityDictionary new.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   973
    ].
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   974
    MethodCounts at:aMethod put:0.
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   975
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   976
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   977
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   978
			|cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   979
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   980
			cnt := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   981
			MethodCounts at:aMethod put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   982
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   983
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   984
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   985
	 onExit:nil
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   986
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   987
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   988
     MessageTracer countMethod:(Integer compiledMethodAt:#factorial).
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   989
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   990
     MessageTracer executionCountOf:(Integer compiledMethodAt:#factorial) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
   991
     MessageTracer stopCountingMethod:(Integer compiledMethodAt:#factorial)
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   992
    "
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   993
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   994
    "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
   995
    "Modified: / 27.7.1998 / 10:47:46 / cg"
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   996
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
   997
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   998
countMethodByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
   999
    "arrange for a aMethod's execution to be counted and maintain
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1000
     a per-receiver class profile.
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1001
     Use unwrapMethod to remove this."
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1002
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1003
    MethodCountsPerReceiverClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1004
	MethodCountsPerReceiverClass := IdentityDictionary new.
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1005
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1006
    MethodCountsPerReceiverClass at:aMethod put:(IdentityDictionary new).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1007
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1008
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1009
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1010
			|cls perMethodCounts cnt|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1011
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1012
			cls := (con receiver class).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1013
			perMethodCounts := MethodCountsPerReceiverClass at:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1014
			cnt := perMethodCounts at:cls ifAbsentPut:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1015
			perMethodCounts at:cls put:(cnt + 1).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1016
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1017
			aMethod changed:#statistics
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1018
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1019
	 onExit:nil
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1020
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1021
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1022
     MessageTracer countMethodWithReceiverStatistic:(Collection compiledMethodAt:#detect:).
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1023
     NewSystemBrowser open.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1024
     MessageTracer executionCountsOf:(Collection compiledMethodAt:#detect:) printNL.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1025
     MessageTracer stopCountingMethod:(Collection compiledMethodAt:#detect:)
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1026
    "
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1027
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1028
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1029
executionCountOfMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1030
    "return the current count"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1031
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1032
    |count counts|
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
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1035
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1036
	    count := MethodCounts at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1037
	    count notNil ifTrue:[^ count].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1038
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1039
	^ MethodCounts at:aMethod ifAbsent:0
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1040
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1041
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1042
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1043
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1044
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1045
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1046
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1047
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1048
	^ (counts collect:[:eachClassCountAssoc | eachClassCountAssoc value]) sum
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1049
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1050
    ^ 0
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
executionCountsByReceiverClassOfMethod:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1054
    "return a collection mapping receiver class to call counts"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1055
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1056
    |counts|
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
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1059
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1060
	    counts := MethodCountsPerReceiverClass at:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1061
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1062
	counts isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1063
	    counts := MethodCounts at:aMethod ifAbsent:#().
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1064
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1065
	^ counts
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1066
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1067
    ^ #()
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1068
!
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1069
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1070
resetCountOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1071
    "return the current count"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1072
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1073
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1074
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1075
	    MethodCounts at:aMethod originalMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1076
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1077
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1078
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1079
    "Created: / 30.7.1998 / 17:42:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1080
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1081
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1082
stopCountingMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1083
    "remove counting of aMethod"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1084
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1085
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1086
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1087
	    MethodCounts removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1088
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1089
    ].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1090
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1091
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1092
	    MethodCountsPerReceiverClass removeKey:aMethod originalMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1093
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  1094
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1095
    ^ self unwrapMethod:aMethod
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1096
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1097
    "Modified: 15.12.1995 / 15:43:53 / cg"
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1098
! !
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  1099
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1100
!MessageTracer class methodsFor:'method memory usage'!
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1101
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1102
countMemoryUsageOfMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1103
    "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
  1104
     Use unwrapMethod to remove this."
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1105
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  1106
    |oldPriority oldScavengeCount oldNewUsed|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1107
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1108
    MethodCounts isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1109
        MethodCounts := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1110
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1111
    MethodMemoryUsage isNil ifTrue:[
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1112
        MethodMemoryUsage := IdentityDictionary new.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1113
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1114
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1115
    MethodCounts at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1116
    MethodMemoryUsage at:aMethod put:0.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1117
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1118
    ^ self wrapMethod:aMethod
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1119
         onEntry:[:con |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1120
                        oldPriority := Processor activeProcess changePriority:(Processor userInterruptPriority).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1121
                        oldNewUsed := ObjectMemory newSpaceUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1122
                        oldScavengeCount := ObjectMemory scavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1123
                 ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1124
         onExit:[:con :retVal |
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1125
             |cnt memUse scavenges|
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1126
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1127
             memUse := ObjectMemory newSpaceUsed - oldNewUsed.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1128
             scavenges := ObjectMemory scavengeCount - oldScavengeCount.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1129
             scavenges ~~ 0 ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1130
                memUse := memUse + (ObjectMemory newSpaceSize * scavenges)
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1131
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1132
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1133
             MethodCounts notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1134
                 cnt := MethodCounts at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1135
                 MethodCounts at:aMethod put:(cnt + 1).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1136
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1137
             MethodMemoryUsage notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1138
                 cnt := MethodMemoryUsage at:aMethod ifAbsent:0.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1139
                 MethodMemoryUsage at:aMethod put:(cnt + memUse).
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1140
             ].
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1141
             Processor activeProcess priority:oldPriority.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1142
             MessageTracer changed:#statistics: with:aMethod.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1143
             aMethod changed:#statistics.
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1144
             retVal
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1145
         ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1146
         onUnwind:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1147
             oldPriority notNil ifTrue:[
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1148
                 Processor activeProcess priority:oldPriority
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1149
             ]
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  1150
         ]
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1151
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1152
    "
2825
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1153
     MessageTracer countMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR).
e8266b38d38c comment/format in: #countMemoryUsageOfMethod:
Stefan Vogel <sv@exept.de>
parents: 2523
diff changeset
  1154
     3 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1155
     Transcript showCR:(MessageTracer memoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1156
     MessageTracer stopCountingMemoryUsageOfMethod:(Integer compiledMethodAt:#factorialR)
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1157
    "
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1158
691
17c3c522f1dc send change notifications when a counted methods count
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
  1159
    "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
  1160
    "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
  1161
    "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
  1162
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1163
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1164
isCountingMemoryUsage:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1165
    "return true if aMethod is counting memoryUsage"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1166
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1167
    MethodMemoryUsage isNil ifTrue:[^ false].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1168
    (MethodMemoryUsage includesKey:aMethod) ifTrue:[^ true].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1169
    aMethod isWrapped ifTrue:[
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  1170
	^ MethodMemoryUsage includesKey:aMethod originalMethod
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1171
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1172
    ^ false
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1173
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1174
    "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
  1175
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1176
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1177
memoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1178
    "return the current count"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1179
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1180
    |count memUse orgMethod|
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1181
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1182
    (MethodCounts isNil or:[MethodMemoryUsage isNil]) ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1183
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1184
	orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1185
	count := MethodCounts at:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1186
	memUse := MethodMemoryUsage at:orgMethod ifAbsent:nil.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1187
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1188
    memUse isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1189
	count := MethodCounts at:aMethod ifAbsent:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1190
	memUse := MethodMemoryUsage at:aMethod ifAbsent:0.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1191
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1192
    count = 0 ifTrue:[^ 0].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1193
    ^ memUse//count
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
    "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
  1196
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1197
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1198
resetMemoryUsageOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1199
    "reset the current usage"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1200
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1201
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1202
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1203
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1204
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1205
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1206
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1207
		MethodCounts at:orgMethod put:0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1208
		MethodMemoryUsage at:orgMethod put:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1209
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1210
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1211
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1212
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1213
    "Created: / 30.7.1998 / 17:43:07 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1214
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1215
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1216
stopCountingMemoryUsageOfMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1217
    "remove counting memory of aMethod"
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1218
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1219
    |orgMethod|
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1220
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1221
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1222
	MethodMemoryUsage notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1223
	    aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1224
		orgMethod := aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1225
		MethodCounts removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1226
		MethodMemoryUsage removeKey:orgMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1227
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1228
	].
764
883a5f35113c fixed reset count & reset memCount
Claus Gittinger <cg@exept.de>
parents: 736
diff changeset
  1229
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1230
    ^ self unwrapMethod:aMethod
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1231
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1232
    "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
  1233
! !
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  1234
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1235
!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
  1236
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1237
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
  1238
    | method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1239
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1240
    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
  1241
    ^ 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
  1242
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1243
    "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
  1244
    "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
  1245
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1246
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1247
mockMethod: method do: block
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1248
    "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
  1249
     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
  1250
     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
  1251
     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
  1252
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1253
     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
  1254
     and then - optionally - the original method object.
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1255
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1256
     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
  1257
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1258
     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
  1259
             threads along their #creatorId. However, when the parent thread dies, 
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1260
             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
  1261
             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
  1262
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1263
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1264
    | 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
  1265
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1266
    CallingLevel := 0.
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
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1269
     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
  1270
     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
  1271
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1272
    (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
  1273
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1274
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1275
    method isLazyMethod ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1276
        method makeRealMethod
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
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1279
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1280
     get class/selector
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1281
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1282
    class := method containingClass.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1283
    class isNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1284
        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
  1285
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1286
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1287
    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
  1288
    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1289
    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
  1290
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1291
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1292
     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
  1293
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1294
    xselector := '_x'.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1295
    method numArgs timesRepeat:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1296
        xselector := xselector , '_:'
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1297
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1298
    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
  1299
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1300
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1301
     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
  1302
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1303
    src := '%(spec)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1304
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1305
    <context: #return>
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1306
    | 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
  1307
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1308
    context := thisContext.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1309
    currentProcess := Processor activeProcess.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1310
    mock := false.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1311
    marker := #mockedMethodMarker yourself.
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
    [ 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
  1314
        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
  1315
        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
  1316
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1317
    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
  1318
        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
  1319
    ] ifFalse:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1320
        mockedVal := #originalMethod yourself
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1321
                        valueWithReceiver:(context receiver)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1322
                        arguments:(context args)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1323
                        selector:(context selector)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1324
                        search:(context searchClass)
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1325
                        sender:nil.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1326
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1327
    ^  mockedVal'.
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
    src := src expandPlaceholdersWith:
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1330
        (Dictionary new
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1331
            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
  1332
            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
  1333
            yourself).
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1334
        
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1335
    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
  1336
    ParserFlags
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1337
        withSTCCompilation:#never
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1338
        do:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1339
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1340
                "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
  1341
                Class withoutUpdatingChangesDo:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1342
                    trapMethod := Compiler
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1343
                                    compile:src
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1344
                                    forClass:UndefinedObject
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1345
                                    inCategory:method category
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1346
                                    notifying:nil
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1347
                                    install:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1348
                                    skipIfSame:false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1349
                                    silent:false. "/ true.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1350
                ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1351
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1352
                "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
  1353
            ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1354
        ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1355
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1356
    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
  1357
    trapMethod changeClassTo:WrappedMethod.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1358
    trapMethod register.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1359
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1360
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1361
     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
  1362
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1363
    block notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1364
        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
  1365
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1366
    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
  1367
    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
  1368
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1369
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1370
     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
  1371
     (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
  1372
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1373
    trapMethod source: src.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1374
"/    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
  1375
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1376
    dict := class methodDictionary.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1377
    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
  1378
    sel == 0 ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1379
        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
  1380
        ^ method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1381
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1382
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1383
    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
  1384
    class methodDictionary:dict.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1385
    ObjectMemory flushCaches.
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
    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
  1388
    MethodTrapChangeNotificationParameter notNil ifTrue:[
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1389
        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
  1390
    ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1391
    ^ trapMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1392
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1393
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1394
     MessageTracer
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1395
                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
  1396
                do: [ :color |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1397
                    Color red
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1398
                ].
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1399
     Color magenta.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1400
     [ [ Color magenta inspect ] fork. Delay waitForSeconds: 1. ] fork.
3680
499ea3cafd70 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3627
diff changeset
  1401
     (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
  1402
     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
  1403
     Color magenta.    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1404
    "
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1405
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1406
    "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
  1407
    "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
  1408
    "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
  1409
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1410
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1411
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
  1412
    | method |
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
    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
  1415
    ^ self unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1416
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1417
    "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
  1418
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1419
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1420
unmockAllMethods
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1421
    "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
  1422
     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
  1423
     uses method mocking"
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
    WrappedMethod allInstancesDo:[:method |
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1426
        method isMocked ifTrue:[    
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1427
            method unregister.
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1428
            self unwrapMethod: method.  
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
    ]
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1431
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1432
    "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
  1433
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1434
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1435
unmockMethod: method
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1436
    "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
  1437
     #mockMethod:do:"
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1438
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1439
    method isMocked ifTrue:[ 
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1440
        self unwrapMethod: method  
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
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1443
    "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
  1444
! !
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  1445
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1446
!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
  1447
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1448
spyMethod:aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1449
    "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
  1450
     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
  1451
     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
  1452
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1453
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1454
    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
  1455
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1456
    "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
  1457
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1458
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1459
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
  1460
    "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
  1461
     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
  1462
     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
  1463
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1464
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1465
    |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
  1466
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1467
    CallingLevel := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1468
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1469
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1470
     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
  1471
     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
  1472
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1473
    (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
  1474
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1475
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1476
    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
  1477
        aMethod makeRealMethod
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
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1480
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1481
     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
  1482
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1483
    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
  1484
    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
  1485
        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
  1486
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1487
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1488
    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
  1489
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1490
    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
  1491
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1492
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1493
     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
  1494
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1495
    xselector := '_x'.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1496
    aMethod numArgs timesRepeat:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1497
        xselector := xselector , '_:'
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1498
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1499
    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
  1500
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1501
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1502
    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
  1503
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1504
     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
  1505
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  1506
    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
  1507
    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
  1508
    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
  1509
    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
  1510
    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
  1511
    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
  1512
      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
  1513
      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
  1514
      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
  1515
      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
  1516
      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
  1517
      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
  1518
      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
  1519
      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
  1520
    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
  1521
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1522
    src := s contents.
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1523
    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
  1524
    ParserFlags
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1525
        withSTCCompilation:#never
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1526
        do:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1527
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1528
                "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
  1529
                Class withoutUpdatingChangesDo:[
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1530
                    trapMethod := Compiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1531
                                    compile:src
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1532
                                    forClass:UndefinedObject
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1533
                                    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
  1534
                                    notifying:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1535
                                    install:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1536
                                    skipIfSame:false
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1537
                                    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
  1538
                ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1539
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  1540
                "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
  1541
            ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1542
        ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1543
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1544
    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
  1545
    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
  1546
    trapMethod register.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1547
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1548
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1549
     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
  1550
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1551
    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
  1552
    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
  1553
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1554
     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
  1555
     (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
  1556
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1557
"/    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
  1558
    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
  1559
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1560
    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
  1561
    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
  1562
    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
  1563
        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
  1564
        ^ aMethod
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1565
    ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1566
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1567
    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
  1568
    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
  1569
    ObjectMemory flushCaches.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1570
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1571
    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
  1572
    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
  1573
        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
  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
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1576
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1577
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1578
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1579
                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
  1580
                   onEntry:nil
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1581
                    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
  1582
                               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
  1583
                               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
  1584
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1585
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1586
     (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
  1587
     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
  1588
     (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
  1589
    "
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
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1592
                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
  1593
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1594
                               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
  1595
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1596
                    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
  1597
                               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
  1598
                               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
  1599
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1600
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1601
     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
  1602
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1603
     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
  1604
     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
  1605
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1606
    "
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
     |lvl|
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1609
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1610
     lvl := 0.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1611
     MessageTracer
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1612
                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
  1613
                   onEntry:[:con |
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1614
                               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
  1615
                               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
  1616
                           ]
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1617
                    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
  1618
                               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
  1619
                               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
  1620
                               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
  1621
                               Transcript endEntry
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1622
                           ].
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1623
     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
  1624
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1625
     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
  1626
     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
  1627
     5 factorial.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1628
    "
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1629
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1630
    "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
  1631
    "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
  1632
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  1633
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1634
!MessageTracer class methodsFor:'method timing'!
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1635
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1636
executionTimesOfMethod:aMethod
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1637
    "return the current gathered execution time statistics"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1638
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1639
    |info|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1640
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1641
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1642
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1643
	    info := ( MethodTiming at:(aMethod originalMethod) ifAbsent:nil ) copy.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1644
	].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1645
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1646
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1647
    info isNil ifTrue:[ info := MethodTimingInfo new ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1648
    ^ info
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1649
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1650
    "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
  1651
    "Modified: / 05-03-2007 / 15:46:17 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1652
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1653
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1654
resetExecutionTimesOfMethod:aMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1655
    "reset the gathered execution times statistics for aMethod;
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1656
     the method remains wrapped."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1657
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1658
    MethodTiming notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1659
	MethodTiming removeKey:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1660
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1661
	    MethodTiming removeKey:aMethod originalMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1662
	].
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1663
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1664
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1665
    "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
  1666
    "Modified: / 05-03-2007 / 15:36:59 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1667
!
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1668
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1669
stopTimingMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1670
    "remove timing of aMethod"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1671
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1672
    ^ self unwrapMethod:aMethod
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1673
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1674
    "Modified: 15.12.1995 / 15:43:53 / cg"
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1675
    "Created: 17.6.1996 / 17:04:03 / cg"
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
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1678
timeMethod:aMethod
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  1679
    "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
  1680
     Use unwrapMethod: or stopTimingMethod: to remove this."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1681
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1682
    |t0|
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1683
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1684
    MethodTiming isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1685
	MethodTiming := IdentityDictionary new.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1686
    ].
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1687
    MethodTiming removeKey:aMethod ifAbsent:nil.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1688
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1689
    TimeForWrappers isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1690
	self getTimeForWrappers
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  1691
    ].
693
cd020921a251 use microsecond resolution in method timing
Claus Gittinger <cg@exept.de>
parents: 691
diff changeset
  1692
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1693
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1694
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1695
			t0 := OperatingSystem getMicrosecondTime.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1696
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1697
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1698
			|info t cnt minT maxT sumTimes|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1699
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1700
			t := OperatingSystem getMicrosecondTime - t0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1701
			t := t - TimeForWrappers.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1702
			t < 0 ifTrue:[t := 0].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1703
			t := t / 1000.0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1704
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1705
			MethodTiming isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1706
			    MethodTiming := IdentityDictionary new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1707
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1708
			info := MethodTiming at:aMethod ifAbsent:nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1709
			info isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1710
			    MethodTiming at:aMethod put:(info := MethodTimingInfo new)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1711
			] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1712
			    info rememberExecutionTime:t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1713
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1714
			MessageTracer changed:#statistics: with:aMethod.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1715
			aMethod changed:#statistics.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1716
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1717
		]
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1718
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1719
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1720
     MessageTracer timeMethod:(Integer compiledMethodAt:#factorial).
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1721
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1722
     5 factorial.
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1723
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1724
     (MessageTracer executionTimesOfMethod:(Integer compiledMethodAt:#factorial)) printCR.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1725
     MessageTracer stopTimingMethod:(Integer compiledMethodAt:#factorial)
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1726
    "
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1727
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  1728
    "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
  1729
    "Modified: / 05-03-2007 / 15:34:01 / cg"
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1730
! !
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  1731
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  1732
!MessageTracer class methodsFor:'method tracing'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1733
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1734
traceClass:aClass selector:aSelector
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1735
    "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
  1736
     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
  1737
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1738
    self traceClass:aClass selector:aSelector on:(Processor activeProcess stderr)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1739
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1740
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1741
     MessageTracer traceClass:Integer selector:#factorial.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1742
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1743
     MessageTracer untraceClass:Integer
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1744
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1745
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1746
     MessageTracer traceClass:SequenceableCollection selector:#quickSortFrom:to:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1747
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1748
     MessageTracer untraceClass:SequenceableCollection
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1749
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1750
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1751
     MessageTracer traceClass:Array selector:#at:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1752
     MessageTracer traceClass:Array selector:#at:put:.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1753
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1754
     MessageTracer untraceClass:Array
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1755
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1756
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1757
    "Modified (comment): / 29-06-2019 / 09:06:09 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1758
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1759
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1760
traceClass:aClass selector:aSelector on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1761
    "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
  1762
     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
  1763
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1764
    self traceMethod:(aClass compiledMethodAt:aSelector) on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1765
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1766
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1767
     MessageTracer traceClass:Integer selector:#factorial on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1768
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1769
     MessageTracer untraceClass:Integer
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:#factorialR on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1773
     5 factorialR.
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
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1778
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1779
traceMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1780
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1781
     when aMethod is executed. Traces both entry and exit.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1782
     Use unwrapMethod to remove this."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1783
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1784
    ^ self traceMethod:aMethod on:(Processor activeProcess stderr)
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1785
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1786
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1787
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1788
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1789
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1790
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1791
    "
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1792
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1793
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1794
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1795
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1796
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1797
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1798
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1799
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1800
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1801
    "
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  1802
     don't do this:
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1803
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1804
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1805
     MessageTracer traceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1806
     MessageTracer traceMethod:(Object compiledMethodAt:#at:put:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1807
     #(6 1 9 66 2 17) copy sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1808
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:).
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  1809
     MessageTracer untraceMethod:(Object compiledMethodAt:#at:put:).
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1810
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1811
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1812
    "Modified (comment): / 29-06-2019 / 09:06:15 / Claus Gittinger"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1813
!
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1814
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1815
traceMethod:aMethod in:aProcess on:aStream
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1816
    "arrange for a trace message to be output on aStream,
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1817
     when aMethod is executed. Traces both entry and exit.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1818
     Use unwrapMethod to remove this."
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1819
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1820
    |lvl inside|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1821
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1822
    ^ self wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1823
         onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1824
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1825
                            inside isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1826
                                inside := true.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1827
                                CallingLevel isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1828
                                    CallingLevel := 0.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1829
                                ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1830
                                lvl notNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1831
                                    lvl := lvl + 1
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1832
                                ] ifFalse:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1833
                                    CallingLevel := lvl := CallingLevel + 1.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1834
                                ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1835
                                MessageTracer printEntryFull:con level:lvl on:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1836
                                inside := nil
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1837
                            ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1838
                        ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1839
                 ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1840
         onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1841
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1842
                            inside isNil ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1843
                                inside := true.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1844
                                MessageTracer printExit:con with:retVal level:lvl on:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1845
                                CallingLevel := lvl := lvl - 1.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1846
                                inside := nil
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1847
                            ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1848
                        ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1849
                        retVal
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
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
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1854
     5 factorial.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1855
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1856
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1857
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1858
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1859
     5 factorialR.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1860
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1861
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1862
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1863
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1864
     #(6 1 9 66 2 17) copy sort.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1865
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1866
    "
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1867
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1868
    "Created: / 29-06-2019 / 09:13:48 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1869
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  1870
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1871
traceMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1872
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1873
     when aMethod is executed. Traces both entry and exit.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1874
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1875
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1876
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1877
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1878
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1879
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1880
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1881
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1882
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1883
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1884
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1885
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1886
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1887
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1888
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1889
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1890
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1891
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1892
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1893
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1894
	 onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1895
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1896
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1897
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1898
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1899
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1900
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1901
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1902
		]
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1903
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1904
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1905
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1906
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1907
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
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
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1910
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1911
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1912
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1913
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1914
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1915
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1916
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1917
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1918
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1919
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1920
162
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1921
traceMethodAll:aMethod
699
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1922
    "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
  1923
     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
  1924
     Use untraceMethod to remove this trace.
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1925
     This is for system debugging only;
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1926
     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
  1927
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1928
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1929
	      onEntry:[:con | ObjectMemory flushCaches. ObjectMemory sendTraceOn.]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1930
	      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
  1931
52a632386cef some debugging methods moved from Smalltalk to ObjectMemory
Claus Gittinger <cg@exept.de>
parents: 698
diff changeset
  1932
    "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
  1933
!
ed6f37d2cc33 added traceAll (full trace - longish output)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1934
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1935
traceMethodEntry:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1936
    "arrange for a trace message to be output on stdErr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1937
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1938
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1939
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1940
    ^ self traceMethodEntry:aMethod on:(Processor activeProcess stderr)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1941
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1942
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1943
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1944
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1945
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1946
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1947
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1948
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1949
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1950
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1951
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1952
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1953
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1954
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1955
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1956
    "
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1957
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  1958
    "Modified (comment): / 29-06-2019 / 09:06:32 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1959
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1960
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1961
traceMethodEntry:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1962
    "arrange for a trace message to be output on aStream,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1963
     when aMethod is executed. Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1964
     Use unwrapMethod to remove this."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1965
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1966
    |lvl inside|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1967
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1968
    ^ self wrapMethod:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1969
	 onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1970
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1971
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1972
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1973
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1974
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1975
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1976
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1977
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1978
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1979
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1980
			    MessageTracer printEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1981
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1982
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1983
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1984
	 onExit:nil
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1985
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1986
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1987
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorial) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1988
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1989
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
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
     MessageTracer traceMethodEntry:(Integer compiledMethodAt:#factorialR) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1993
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1994
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1995
    "
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
     MessageTracer traceMethodEntry:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  1998
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  1999
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2000
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2001
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2002
156
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2003
traceMethodFull:aMethod
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2004
    "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
  2005
     Only the sender is traced on entry.
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2006
     Use untraceMethod to remove this trace."
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2007
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2008
    ^ self traceMethodFull:aMethod on:(Processor activeProcess stderr)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2009
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2010
    "Created: / 15-12-1995 / 18:19:31 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2011
    "Modified: / 22-10-1996 / 17:39:28 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2012
    "Modified (format): / 29-06-2019 / 09:06:38 / Claus Gittinger"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2013
!
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2014
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2015
traceMethodFull:aMethod in:aProcess on:aStream
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2016
    "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
  2017
     Only the sender is traced on entry.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2018
     Use untraceMethod to remove this trace."
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2019
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2020
    |onEntry onExit|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2021
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2022
    onEntry := (self traceFullBlockFor:aStream).
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2023
    onExit := LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2024
    
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2025
    ^ self
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2026
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2027
        onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2028
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2029
                            onEntry value:con
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2030
                        ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2031
                ]        
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2032
        onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2033
                        (Processor activeProcess processGroupId = aProcess id) ifTrue:[
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2034
                            LeaveTraceBlock value:con value:retVal
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2035
                        ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2036
                        retVal
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2037
               ].
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2038
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2039
    "Created: / 29-06-2019 / 09:20:22 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2040
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2041
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2042
traceMethodFull:aMethod on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2043
    "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
  2044
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2045
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2046
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2047
    ^ self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2048
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2049
        onEntry:(self traceFullBlockFor:aStream)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2050
        onExit:LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2051
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2052
    "Created: / 15-12-1995 / 18:19:31 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2053
    "Modified: / 22-10-1996 / 17:39:28 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2054
    "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
  2055
!
bb53b47392fa full walkback tracing added
Claus Gittinger <cg@exept.de>
parents: 155
diff changeset
  2056
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2057
traceMethodSender:aMethod
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2058
    "arrange for a trace message to be output on Stderr,
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2059
     when amethod is executed.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2060
     Only the sender is traced on entry.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2061
     Use untraceMethod to remove this trace."
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2062
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2063
    ^ self traceMethodSender:aMethod on:(Processor activeProcess stderr)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2064
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2065
    "Modified (format): / 29-06-2019 / 09:06:51 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2066
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2067
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  2068
traceMethodSender:aMethod on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2069
    "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
  2070
     Only the sender is traced on entry.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2071
     Use untraceMethod to remove this trace."
35
claus
parents: 31
diff changeset
  2072
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2073
    ^ self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2074
        wrapMethod:aMethod
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2075
        onEntry:(self traceSenderBlockFor:aStream)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2076
        onExit:LeaveTraceBlock.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2077
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2078
    "Modified: / 22-10-1996 / 17:39:33 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  2079
    "Modified (comment): / 29-06-2019 / 09:06:56 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2080
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2081
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2082
traceUpdateMethod:aMethod on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2083
    "arrange for a trace message to be output on aStream,
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2084
     when aMethod is executed.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2085
     Traces both entry and exit.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2086
     Use unwrapMethod to remove this.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2087
     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
  2088
     back to the origial change message."
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2089
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2090
    |lvl inside|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2091
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2092
    ^ self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2093
	wrapMethod:aMethod
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2094
	onEntry:[:con |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2095
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2096
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2097
			    CallingLevel isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2098
				CallingLevel := 0.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2099
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2100
			    lvl notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2101
				lvl := lvl + 1
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2102
			    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2103
				CallingLevel := lvl := CallingLevel + 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2104
			    ].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2105
			    MessageTracer printUpdateEntryFull:con level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2106
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2107
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2108
		 ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2109
	onExit:[:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2110
			inside isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2111
			    inside := true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2112
			    MessageTracer printExit:con with:retVal level:lvl on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2113
			    CallingLevel := lvl := lvl - 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2114
			    inside := nil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2115
			].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2116
			retVal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2117
		]
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2118
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  2119
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2120
tracelogMethod:aMethod
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2121
    "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
  2122
     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
  2123
     Use unwrapMethod to remove this."
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2124
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2125
    |lvl inside|
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2126
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2127
    ^ self wrapMethod:aMethod
3627
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2128
         onEntry:[:con |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2129
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2130
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2131
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2132
                            CallingLevel isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2133
                                CallingLevel := 0.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2134
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2135
                            lvl notNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2136
                                lvl := lvl + 1
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2137
                            ] ifFalse:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2138
                                CallingLevel := lvl := CallingLevel + 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2139
                            ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2140
                            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
  2141
                            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
  2142
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2143
                        ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2144
                 ]
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2145
         onExit:[:con :retVal |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2146
                        | msg |
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2147
                        inside isNil ifTrue:[
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2148
                            inside := true.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2149
                            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
  2150
                            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
  2151
                            CallingLevel := lvl := lvl - 1.
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2152
                            inside := nil
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2153
                        ].
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2154
                        retVal
de79ab1fc184 Use new severityENTER / severityLEAVE when trace-logging methods.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3617
diff changeset
  2155
                ]
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2156
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
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorial) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2159
     5 factorial.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2160
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorial)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2161
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2162
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2163
     MessageTracer traceMethod:(Integer compiledMethodAt:#factorialR) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2164
     5 factorialR.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2165
     MessageTracer untraceMethod:(Integer compiledMethodAt:#factorialR)
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2166
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2167
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2168
     MessageTracer traceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:) on:Transcript.
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2169
     #(6 1 9 66 2 17) copy sort.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2170
     MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2171
    "
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2172
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2173
    "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
  2174
    "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
  2175
!
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  2176
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2177
untraceMethod:aMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2178
    "remove tracing of aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2179
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2180
    "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
  2181
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2182
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2183
    ^ self unwrapMethod:aMethod
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2184
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2185
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2186
!MessageTracer class methodsFor:'method wrapping'!
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2187
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2188
unwrapAllMethods
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2189
    "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
  2190
     on them; this removes them all"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2191
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2192
    WrappedMethod allInstancesDo:[:aWrapperMethod |
4128
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2193
        aWrapperMethod unregister.
cb91f1919e6f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4098
diff changeset
  2194
        self unwrapMethod:aWrapperMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2195
    ]
1145
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2196
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2197
    "
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2198
     MessageTracer unwrapAllMethods
7b664ba0e505 comment
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
  2199
    "
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2200
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2201
    "Modified: / 01-07-2011 / 10:02:47 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2202
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2203
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2204
unwrapMethod:aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2205
    "remove any wrapper on aMethod"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2206
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2207
    |wasWrapped selector class originalMethod dict mthd|
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2208
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2209
    (aMethod isNil) ifTrue:[^ self].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2210
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2211
    (wasWrapped := aMethod isWrapped) ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2212
        originalMethod := aMethod originalMethod.
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2213
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2214
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2215
    MethodCounts notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2216
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2217
            MethodCounts removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2218
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2219
        MethodCounts removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2220
        MethodCounts := MethodCounts asNilIfEmpty.
172
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2221
    ].
cf44aece60d4 clear memoryUsage when unwrapping
Claus Gittinger <cg@exept.de>
parents: 164
diff changeset
  2222
    MethodMemoryUsage notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2223
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2224
            MethodMemoryUsage removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2225
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2226
        MethodMemoryUsage removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2227
        MethodMemoryUsage := MethodMemoryUsage asNilIfEmpty.
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2228
    ].
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2229
    MethodTiming notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2230
        originalMethod notNil ifTrue:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2231
            MethodTiming removeKey:originalMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2232
        ].
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2233
        MethodTiming removeKey:aMethod ifAbsent:nil.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2234
        MethodTiming := MethodTiming asNilIfEmpty.
327
551f090d9107 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 326
diff changeset
  2235
    ].
155
bdab8de89abd method counting added
Claus Gittinger <cg@exept.de>
parents: 150
diff changeset
  2236
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2237
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2238
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2239
    wasWrapped ifFalse:[
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2240
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2241
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2242
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2243
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2244
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2245
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2246
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2247
    class isNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2248
        'MessageTracer [info]: no containing class for method found' infoPrintCR.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2249
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2250
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2251
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2252
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2253
    originalMethod isNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2254
        self error:'oops, could not find original method' mayProceed:true.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2255
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2256
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2257
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2258
    dict := class methodDictionary.
506
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2259
    mthd := dict at:selector ifAbsent:nil.
02c057d1ce1a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 503
diff changeset
  2260
    mthd notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2261
        dict at:selector put:originalMethod.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2262
        class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2263
    ] ifFalse:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2264
        'MessageTracer [info]: no containing class for method found' infoPrintCR.
667
62df9b9b7664 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 666
diff changeset
  2265
"/        self halt:'oops, unexpected error - cannot remove wrap'.
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2266
        aMethod becomeSameAs:originalMethod.
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2267
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2268
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2269
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2270
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2271
584
2da6bb2c8017 send out change notifications when a trap is removed
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
  2272
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2273
    MethodTrapChangeNotificationParameter notNil ifTrue:[
4314
4d0fb5563a49 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4307
diff changeset
  2274
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2275
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2276
    ^ originalMethod
265
f3fb9bec2d4a printNL -> printCR
Claus Gittinger <cg@exept.de>
parents: 258
diff changeset
  2277
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  2278
    "Modified: / 05-06-1996 / 14:08:08 / stefan"
1970
e4412b37c257 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1957
diff changeset
  2279
    "Modified: / 04-10-2007 / 16:41:01 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2280
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2281
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2282
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2283
    ^ 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
  2284
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2285
    "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
  2286
!
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2287
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2288
wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock onUnwind:unwindBlock
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2289
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2290
     aMethod is evaluated.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2291
     EntryBlock will be called on entry, and gets the current context passed as argument.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2292
     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
  2293
     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
  2294
     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
  2295
     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
  2296
     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
  2297
    "
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2298
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  2299
    |selector class trapMethod s spec src dict sel saveUS xselector|
88
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
    CallingLevel := 0.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2302
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2303
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2304
     create a new method, which calls the original one,
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2305
     but only if not already being trapped.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2306
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2307
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2308
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2309
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2310
    aMethod isLazyMethod ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2311
        aMethod makeRealMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2312
    ].
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2313
    
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2314
    "methods annotated as <<hidden>< cannot be breakpointed in deployed apps"
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2315
    (aMethod hasAnnotation:'hidden') ifTrue:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2316
        Smalltalk isSmalltalkDevelopmentSystem ifFalse:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2317
            ^ aMethod
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2318
        ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2319
    ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2320
    
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2321
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2322
     get class/selector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2323
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2324
    class := aMethod containingClass.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2325
    class isNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2326
        self error:'cannot place trap (no containing class found)' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2327
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2328
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2329
    selector := class selectorAtMethod:aMethod.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2330
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2331
    WrappedMethod autoload. "/ for small systems
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2332
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
     get a new method-spec
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2335
    "
730
635af002b783 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 729
diff changeset
  2336
    xselector := '_x'.
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2337
    aMethod numArgs timesRepeat:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2338
        xselector := xselector , '_:'
729
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2339
    ].
65df4874f0a6 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
  2340
    spec := Parser methodSpecificationForSelector:xselector.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2341
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2342
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2343
     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
  2344
    "
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2345
    s := WriteStream on:''.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2346
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  2347
    s nextPutAll:' <context: #return>'.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2348
    s nextPutAll:' |retVal context| '.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2349
    s nextPutAll:' context := thisContext.'.
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2350
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2351
        s nextPutAll:'['.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2352
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2353
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2354
        s nextPutAll:'#entryBlock yourself value:context. '.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2355
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2356
    s nextPutAll:'retVal := #originalMethod yourself';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2357
      nextPutAll:             ' valueWithReceiver:(context receiver)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2358
      nextPutAll:             ' arguments:(context args)';
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2359
      nextPutAll:             ' selector:(context selector)';
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2360
      nextPutAll:             ' search:(context searchClass)';
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2361
      nextPutAll:             ' sender:nil. '.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2362
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2363
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2364
        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
  2365
    ].
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2366
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2367
        s nextPutAll:'] ifCurtailed:#unwindBlock yourself.'.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2368
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2369
    s nextPutAll:'^ retVal'; cr.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2370
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2371
    src := s contents.
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2372
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2373
    ParserFlags
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2374
        withSTCCompilation:#never
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2375
        do:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2376
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2377
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2378
                Class withoutUpdatingChangesDo:[
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2379
                    trapMethod := Compiler
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2380
                                    compile:src
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2381
                                    forClass:UndefinedObject
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2382
                                    inCategory:aMethod category
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2383
                                    notifying:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2384
                                    install:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2385
                                    skipIfSame:false
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2386
                                    silent:false. "/ true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2387
                ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2388
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2389
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2390
            ].
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2391
        ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2392
955
0516771efa2a preserve a methods packageID when wrapping
Claus Gittinger <cg@exept.de>
parents: 950
diff changeset
  2393
    trapMethod setPackage:aMethod package.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2394
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2395
    trapMethod register.
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2396
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2397
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2398
     raising our eyebrows here ...
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
    entryBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2401
        trapMethod changeLiteral:#entryBlock to:entryBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2402
    ].
352
ac12b5bc2754 Move method's literals form literalArray to indexed instvars.
Stefan Vogel <sv@exept.de>
parents: 327
diff changeset
  2403
    trapMethod changeLiteral:#originalMethod to:aMethod.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2404
    exitBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2405
        trapMethod changeLiteral:#exitBlock to:exitBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2406
    ].
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2407
    unwindBlock notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2408
        trapMethod changeLiteral:#unwindBlock to:unwindBlock.
164
ea53c919343f New method to wrap with unwind-actions.
Stefan Vogel <sv@exept.de>
parents: 162
diff changeset
  2409
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2410
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2411
     change the source of this new method
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2412
     (to avoid confusion in the debugger ...)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2413
    "
840
5ec82d6c2e55 care for the wrappers source info (to allow source access in browser)
Claus Gittinger <cg@exept.de>
parents: 825
diff changeset
  2414
"/    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
  2415
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2416
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2417
    dict := class methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2418
    sel := dict at:selector ifAbsent:[0].
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2419
    sel == 0 ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2420
        self error:'oops, unexpected error' mayProceed:true.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2421
        ^ aMethod
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2422
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2423
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2424
    dict at:selector put:trapMethod.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2425
    class methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2426
    ObjectMemory flushCaches.
1144
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2427
001b374a2431 change notification when traps are added/removed
Claus Gittinger <cg@exept.de>
parents: 1139
diff changeset
  2428
    class changed:#methodTrap with:selector. "/ tell browsers
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2429
    MethodTrapChangeNotificationParameter notNil ifTrue:[
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2430
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
2278
a4294d327802 changed:
Claus Gittinger <cg@exept.de>
parents: 2243
diff changeset
  2431
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2432
    ^ trapMethod
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2433
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2434
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2435
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2436
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2437
                   onEntry:nil
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2438
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2439
                               Transcript show:'leave Point>>scaleBy:; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2440
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2441
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2442
                           ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2443
     (1@2) scaleBy:5.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2444
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2445
     (1@2) scaleBy:5.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2446
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2447
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2448
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2449
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2450
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2451
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2452
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2453
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2454
                               Transcript show:'leave Integer>>factorial; returning:'.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2455
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2456
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2457
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2458
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2459
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2460
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2461
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2462
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2463
    "
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
     |lvl|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2466
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2467
     lvl := 0.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2468
     MessageTracer
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2469
                wrapMethod:(Integer compiledMethodAt:#factorial)
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2470
                   onEntry:[:con |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2471
                               Transcript spaces:lvl. lvl := lvl + 2.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2472
                               Transcript showCR:('entering ' , con receiver printString , '>>factorial').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2473
                           ]
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2474
                    onExit:[:con :retVal |
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2475
                               lvl := lvl - 2. Transcript spaces:lvl.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2476
                               Transcript show:('leave ' , con receiver printString , '>>factorial; returning:').
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2477
                               Transcript showCR:retVal printString.
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2478
                               Transcript endEntry
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  2479
                           ].
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2480
     Transcript showCR:'5 factorial traced'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2481
     5 factorial.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2482
     MessageTracer unwrapMethod:(Integer compiledMethodAt:#factorial).
258
bf9fd9ad4687 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 256
diff changeset
  2483
     Transcript showCR:'5 factorial normal'.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2484
     5 factorial.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2485
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  2486
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2487
    "Modified: / 25-06-1996 / 22:04:51 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  2488
    "Modified: / 01-07-2011 / 10:01:48 / cg"
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  2489
    "Modified (comment): / 21-11-2017 / 13:03:29 / cg"
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2490
    "Modified: / 15-01-2019 / 14:15:48 / Claus Gittinger"
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2491
!
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2492
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2493
wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2494
    ^ self wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode onUnwindCode:nil
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2495
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2496
    "Created: / 09-11-2017 / 09:45:38 / cg"
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2497
!
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2498
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2499
wrapMethod:aMethod onEntryCode:entryCode onExitCode:exitCode onUnwindCode:unwindCode
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2500
    "arrange for the entryCode and exitCode to be evaluated whenever
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2501
     aMethod is evaluated.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2502
     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
  2503
     UnwindCode will be executed when the context of aMethod is unwound.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2504
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2505
     Because the code is sliced in, it may return.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2506
     Useful to wrap existing methods with before and after code.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2507
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2508
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2509
    |selector class trapMethod s spec src dict sel saveUS xselector|
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2510
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2511
    CallingLevel := 0.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2512
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2513
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2514
     create a new method, which calls the original one,
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2515
     but only if not already being trapped.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2516
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2517
    (aMethod isNil or:[aMethod isWrapped]) ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2518
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2519
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2520
    aMethod isLazyMethod ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2521
        aMethod makeRealMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2522
    ].
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2523
    "methods annotated as <<hidden>< cannot be breakpointed in deployed apps"
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2524
    (aMethod hasAnnotation:'hidden') ifTrue:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2525
        Smalltalk isSmalltalkDevelopmentSystem ifFalse:[
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2526
            ^ aMethod
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2527
        ].
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2528
    ].
4261
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
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2531
     get class/selector
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2532
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2533
    class := aMethod containingClass.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2534
    class isNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2535
        self error:'cannot place trap (no containing class found)' mayProceed:true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2536
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2537
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2538
    selector := class selectorAtMethod:aMethod.
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
    WrappedMethod autoload. "/ for small systems
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
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2543
     get a new method-spec
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
    xselector := '_x'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2546
    aMethod numArgs timesRepeat:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2547
        xselector := xselector , '_:'
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2548
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2549
    spec := Parser methodSpecificationForSelector:xselector.
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
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2552
     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
  2553
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2554
    s := WriteStream on:''.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2555
    s nextPutAll:spec.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2556
    s nextPutAll:' <context: #return>'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2557
    s nextPutAll:' |retVal context| '.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2558
    s nextPutAll:' context := thisContext.'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2559
    unwindCode notEmptyOrNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2560
        s nextPutAll:'['.
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
    entryCode notEmptyOrNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2563
        s nextPutAll:('[ ',entryCode,'] value. ').
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2564
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2565
    s nextPutAll:'retVal := #originalMethod yourself';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2566
      nextPutAll:             ' valueWithReceiver:(context receiver)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2567
      nextPutAll:             ' arguments:(context args)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2568
      nextPutAll:             ' selector:(context selector)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2569
      nextPutAll:             ' search:(context searchClass)';
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2570
      nextPutAll:             ' sender:nil. '.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2571
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2572
    exitCode notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2573
        s nextPutAll:('[ ',exitCode,'] value. ').
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2574
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2575
    unwindCode notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2576
        s nextPutAll:'] ifCurtailed:[',unwindCode,'].'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2577
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2578
    s nextPutAll:'^ retVal'; cr.
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
    src := s contents.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2581
    
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2582
    saveUS := "Compiler" ParserFlags allowUnderscoreInIdentifier.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2583
    ParserFlags
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2584
        withSTCCompilation:#never
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2585
        do:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2586
            [
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2587
                "Compiler" ParserFlags allowUnderscoreInIdentifier:true.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2588
                Class withoutUpdatingChangesDo:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2589
                    trapMethod := Compiler
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2590
                                    compile:src
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2591
                                    forClass:UndefinedObject
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2592
                                    inCategory:aMethod category
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2593
                                    notifying:nil
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2594
                                    install:false
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2595
                                    skipIfSame:false
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2596
                                    silent:false. "/ true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2597
                ]
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2598
            ] ensure:[
4351
66e0cbfadee4 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4314
diff changeset
  2599
                "Compiler" ParserFlags allowUnderscoreInIdentifier:saveUS.
4261
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2600
            ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2601
        ].
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
    trapMethod setPackage:aMethod package.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2604
    trapMethod changeClassTo:WrappedMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2605
    trapMethod register.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2606
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2607
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2608
     raising our eyebrows here ...
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2609
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2610
    trapMethod changeLiteral:#originalMethod to:aMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2611
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2612
     change the source of this new method
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2613
     (to avoid confusion in the debugger ...)
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2614
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2615
"/    trapMethod source:'this is a wrapper method - not the real one'.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2616
    trapMethod sourceFilename:(aMethod getSource) position:(aMethod getSourcePosition).
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2617
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2618
    dict := class methodDictionary.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2619
    sel := dict at:selector ifAbsent:[0].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2620
    sel == 0 ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2621
        self error:'oops, unexpected error' mayProceed:true.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2622
        ^ aMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2623
    ].
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2624
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2625
    dict at:selector put:trapMethod.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2626
    class methodDictionary:dict.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2627
    ObjectMemory flushCaches.
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
    class changed:#methodTrap with:selector. "/ tell browsers
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2630
    MethodTrapChangeNotificationParameter notNil ifTrue:[
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2631
        Smalltalk changed:#methodTrap with:(MethodTrapChangeNotificationParameter changeClass:class changeSelector:selector).
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
    ^ trapMethod
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2634
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2635
    "
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2636
     MessageTracer
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2637
                wrapMethod:(Point compiledMethodAt:#scaleBy:)
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2638
                onEntryCode:'Transcript showCR:''hello'' '
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2639
                onExitCode:'Transcript showCR:''good bye'' '.
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
     (1@2) scaleBy:5.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2642
     MessageTracer unwrapMethod:(Point compiledMethodAt:#scaleBy:).
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2643
     (1@2) scaleBy:5.
ef817a93c802 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4172
diff changeset
  2644
    "
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
    "Created: / 09-11-2017 / 09:45:20 / cg"
4390
17b6ee1e1570 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4351
diff changeset
  2647
    "Modified: / 15-01-2019 / 14:16:08 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2648
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2649
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2650
!MessageTracer class methodsFor:'object breakpointing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2651
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2652
objectHasWraps:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2653
    "return true, if anObject has any wraps"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2654
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2655
    ^ anObject class category == #'* trapping *'
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2656
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2657
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2658
realClassOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2659
    "return anObjects real class"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2660
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2661
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2662
	^ anObject class
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2663
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2664
    ^ anObject class superclass
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2665
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2666
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2667
trap:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2668
    "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
  2669
     sent to anObject. Use untrap to remove this trap.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2670
     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
  2671
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2672
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2673
	 selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2674
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2675
	 onExit:LeaveBreakBlock.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2676
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2677
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2678
     |p|
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
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2681
     MessageTracer trap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2682
     p x:5
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2683
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2684
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2685
    "Modified: 22.10.1996 / 17:39:41 / cg"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2686
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2687
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2688
trap:anObject selectors:aCollection
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2689
    self wrap:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2690
	 selectors:aCollection
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2691
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2692
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2693
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2694
    "Modified: 22.10.1996 / 17:39:50 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2695
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2696
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2697
trapAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2698
    "trap on all messages which are understood by anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2699
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2700
    self wrapAll:anObject
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2701
	 onEntry:BreakBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2702
	 onExit:LeaveBreakBlock.
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2703
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2704
    "Modified: 22.10.1996 / 17:39:54 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2705
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2706
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2707
trapAll:anObject from:aClass
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2708
    "trap on all messages defined in aClass sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2709
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2710
    self trap:anObject selectors:aClass selectors
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2711
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2712
    "Modified: 5.6.1996 / 13:46:06 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2713
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2714
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2715
untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2716
    "remove any traps on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2717
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2718
    "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
  2719
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2720
    |orgClass|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2721
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2722
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2723
    orgClass category == #'* trapping *' ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2724
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2725
    ].
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2726
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2727
    anObject changeClassTo:orgClass superclass.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2728
    ObjectCopyHolders notNil ifTrue:[
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2729
	ObjectCopyHolders removeKey:anObject ifAbsent:nil.
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2730
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2731
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2732
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2733
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2734
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2735
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2736
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2737
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2738
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2739
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2740
     MessageTracer untrap:p
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2741
     p y:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2742
     p x:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2743
    "
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  2744
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2745
    "Modified: / 21.4.1998 / 15:43:33 / cg"
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2746
!
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  2747
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2748
untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2749
    "remove trap on aSelector from anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2750
501
c3ccbea7930c removed unused vars
Claus Gittinger <cg@exept.de>
parents: 496
diff changeset
  2751
    |orgClass dict|
88
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:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2755
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2756
    dict := orgClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2757
    dict at:aSelector ifAbsent:[^ self].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2758
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2759
    dict size == 1 ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2760
	"the last trap got removed"
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2761
	anObject changeClassTo:orgClass superclass.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2762
	ObjectCopyHolders notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2763
	    ObjectCopyHolders removeKey:anObject ifAbsent:nil.
662
31b0122e8fe4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 661
diff changeset
  2764
	].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2765
	^ self
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2766
    ].
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2767
    dict removeKey:aSelector.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2768
    orgClass methodDictionary:dict.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2769
    ObjectMemory flushCaches. "avoid calling the old trap method"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2770
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2771
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2772
     |p|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2773
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2774
     p := Point new copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2775
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2776
     MessageTracer trace:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2777
     'trace both ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2778
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2779
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2780
     'trace only y ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2781
     MessageTracer untrap:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2782
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2783
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2784
     'trace none ...' errorPrintNL.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2785
     MessageTracer untrap:p selector:#y:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2786
     p x:2.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2787
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2788
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  2789
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2790
    "Modified: / 5.6.1996 / 13:56:08 / stefan"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2791
    "Modified: / 21.4.1998 / 15:43:55 / cg"
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2792
!
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2793
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2794
wrappedSelectorsOf:anObject
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2795
    "return the set of wrapped selectors (if any)"
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2796
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2797
    (anObject class category == #'* trapping *') ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2798
	^ #()
525
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2799
    ].
8ad917c8c6e9 added more queryMethods for objectWrapper
ca
parents: 506
diff changeset
  2800
    ^ anObject class selectors
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2801
! !
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  2802
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2803
!MessageTracer class methodsFor:'object modification traps'!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2804
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2805
trapModificationsIn:anObject
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2806
    "trap modifications in anObject"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2807
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2808
    self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2809
	trapModificationsIn:anObject filter:[:old :new | true]
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2810
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2811
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2812
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2813
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2814
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2815
     MessageTracer trapModificationsIn:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2816
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2817
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2818
     a at:1.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2819
     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
  2820
     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
  2821
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2822
     a at:3.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2823
     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
  2824
     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
  2825
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2826
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2827
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2828
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2829
    "Created: / 21.4.1998 / 14:32:34 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2830
    "Modified: / 21.4.1998 / 14:58:24 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2831
!
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2832
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2833
trapModificationsIn:anObject filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2834
    "trap modifications in anObject"
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
    |allSelectors|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2837
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2838
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  2839
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2840
	aClass methodDictionary keys addAllTo:allSelectors
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
    self trapModificationsIn:anObject selectors:allSelectors filter:aFilterBlock
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
    "trap if arrays 5th slot is modified:
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2846
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2847
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2848
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2849
     a := Array new:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2850
     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
  2851
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2852
     a size.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2853
     a at:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2854
     a at:2 put:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2855
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2856
     a at:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2857
     a at:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2858
     a at:2 put:2.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2859
     a at:2 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2860
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2861
     a at:5 put:3.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2862
     MessageTracer untrace:a.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2863
     a at:3 put:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2864
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2865
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2866
    "Modified: / 21.4.1998 / 15:53:38 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2867
!
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
trapModificationsIn:anObject selector:aSelector filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2870
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2871
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2872
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2873
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2874
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2875
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2876
	trapModificationsIn:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2877
	selectors:(Array with:aSelector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2878
	filter:aFilterBlock
660
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
    "Modified: / 21.4.1998 / 15:34:44 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2881
!
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
trapModificationsIn:anObject selectors:aCollectionOfSelectors filter:aFilterBlock
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2884
    "install a trap for modifications in anObject by aSelector-messages.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2885
     the filterBlock will be invoked (after a modification) with the old and
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2886
     new values as arguments and should return true,
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2887
     if the debugger is really wanted."
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2888
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2889
    |copyHolder sels checkBlock|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2890
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2891
    (anObject isNil
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2892
	or:[anObject isSymbol
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2893
	or:[anObject class == SmallInteger
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2894
	or:[anObject == true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2895
	or:[anObject == false]]]])
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2896
    ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2897
	self error:'cannot place trap on this object' mayProceed:true.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2898
	^ self.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2899
    ].
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2900
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2901
    ObjectCopyHolders isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2902
	ObjectCopyHolders := WeakIdentityDictionary new.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2903
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2904
    copyHolder := ObjectCopyHolders at:anObject ifAbsent:nil.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2905
    copyHolder isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2906
	ObjectCopyHolders at:anObject put:(copyHolder := ValueHolder new).
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2907
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2908
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2909
    copyHolder value:(anObject shallowCopy).
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2910
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2911
    "/ 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
  2912
    "/ do no harm to the object ... consider this a kludge
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2913
    sels := aCollectionOfSelectors copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2914
    sels removeAll:#(#class #species #yourself #'sameContentsAs:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2915
		     #'instVarAt:' #'at:' #'basicAt:'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2916
		     #'shallowCopy' #'copy'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2917
		     #'=' #'==' #'~=' #'~~'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2918
		     #'size'
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2919
		    ).
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2920
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2921
    checkBlock :=
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2922
		   [:con :retVal |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2923
			|oldValue|
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2924
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2925
			oldValue :=  copyHolder value.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2926
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2927
			"/ compare with copy ...
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2928
			(anObject sameContentsAs:oldValue) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2929
			    "/ see oldValue vs. anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2930
			    (aFilterBlock value:oldValue value:anObject) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2931
				copyHolder value:(anObject shallowCopy).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2932
				ObjectWrittenBreakpointSignal
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2933
				    raiseRequestWith:(oldValue -> anObject)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2934
				    errorString:('object was modififed in: ' , con sender selector)
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2935
				    in:con sender
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2936
			    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2937
			]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2938
		   ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2939
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2940
    sels do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2941
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2942
	    wrap:anObject
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2943
	    selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2944
	    onEntry:[:con | ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2945
	    onExit:checkBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2946
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2947
	    flushCaches:false.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2948
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2949
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2950
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2951
    "Created: / 21.4.1998 / 15:34:05 / cg"
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2952
    "Modified: / 21.4.1998 / 16:00:39 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2953
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2954
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2955
trapModificationsOf:anInstVarOrOffset in:anObject
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2956
    "trap modifications in anObject"
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2957
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2958
    |idx selectors definingClass|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2959
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2960
    anInstVarOrOffset isInteger ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2961
	"/ indexed slot
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2962
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2963
	    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
  2964
   ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2965
	"/ instVar by name
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2966
	selectors := IdentitySet new.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2967
	definingClass := anObject class whichClassDefinesInstVar:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2968
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2969
	definingClass withAllSuperclassesDo:[:aClass |
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2970
	    aClass methodDictionary keys addAllTo:selectors
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2971
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2972
	idx := anObject class instVarIndexFor:anInstVarOrOffset.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2973
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  2974
	    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
  2975
   ]
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2976
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2977
    "
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2978
     |a|
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2979
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2980
     a := Array new:10.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2981
     MessageTracer trapModificationsOf:2 in:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2982
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2983
     a size.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2984
     a at:1.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2985
     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
  2986
     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
  2987
     a at:2.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2988
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2989
     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
  2990
     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
  2991
     a at:3.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2992
     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
  2993
     MessageTracer untrace:a.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2994
     a at:3 put:5.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  2995
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2996
! !
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  2997
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  2998
!MessageTracer class methodsFor:'object tracing'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  2999
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3000
trace:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3001
    "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
  3002
     aSelector is sent to anObject. Both entry and exit are traced.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3003
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3004
     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
  3005
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3006
    self trace:anObject selector:aSelector on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3007
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3008
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3009
     |p|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3010
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3011
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3012
     MessageTracer trace:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3013
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3014
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3015
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3016
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3017
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3018
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3019
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3020
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3021
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3022
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3023
     MessageTracer trace:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3024
     MessageTracer trace:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3025
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3026
    "
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3027
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3028
    "Modified: / 21-04-1998 / 15:37:05 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3029
    "Modified (comment): / 29-06-2019 / 09:07:12 / Claus Gittinger"
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
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3032
trace:anObject selector:aSelector on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3033
    "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
  3034
     aSelector is sent to anObject. Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3035
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3036
     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
  3037
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3038
    self
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3039
        trace:anObject
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3040
        selectors:(Array with:aSelector)
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3041
        on:aStream
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3042
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3043
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3044
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3045
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3046
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3047
     MessageTracer trace:p selector:#x: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3048
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3049
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3050
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3051
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3052
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3053
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3054
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3055
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3056
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3057
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3058
     MessageTracer trace:a selector:#at:put: on:Stderr.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3059
     MessageTracer trace:a selector:#at:.    on:Stderr
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3060
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3061
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3062
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3063
    "Modified: / 21-04-1998 / 15:37:05 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3064
    "Modified (comment): / 29-06-2019 / 09:07:17 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3065
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3066
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3067
trace:anObject selectors:aCollectionOfSelectors
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3068
    "arrange for a trace message to be output on Stderr, when any message
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3069
     from aCollectionOfSelectors is sent to anObject.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3070
     Both entry and exit are traced.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3071
     Use untrap:/untrace: to remove this trace.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3072
     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
  3073
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3074
    self trace:anObject selectors:aCollectionOfSelectors on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3075
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3076
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3077
     |p|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3078
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3079
     p := Point new.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3080
     MessageTracer trace:p selector:#x:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3081
     p x:5.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3082
     p y:1.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3083
     p x:10.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3084
     MessageTracer untrap:p.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3085
     p x:7
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3086
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3087
    "
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3088
     |a|
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3089
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3090
     a := #(6 1 9 66 2 17) copy.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3091
     MessageTracer trace:a selector:#at:put:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3092
     MessageTracer trace:a selector:#at:.
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3093
     a sort.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3094
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3095
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3096
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3097
    "Modified (comment): / 29-06-2019 / 09:07:24 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3098
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3099
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3100
trace:anObject selectors:aCollectionOfSelectors on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3101
    "arrange for a trace message to be output on aStream, when any message
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3102
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3103
     Both entry and exit are traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3104
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3105
     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
  3106
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3107
    aCollectionOfSelectors do:[:aSelector |
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3108
        |methodName|
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3109
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3110
        methodName := anObject class name , '>>' , aSelector.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3111
        self
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3112
            wrap:anObject
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3113
            selector:aSelector
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3114
            onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3115
                        aStream nextPutAll:'enter '; nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3116
                        aStream nextPutAll:' receiver='.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3117
                        con receiver printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3118
                        aStream nextPutAll:' args='. (con args) printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3119
                        aStream nextPutAll:' from:'. con sender printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3120
                        aStream cr; flush
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3121
                    ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3122
            onExit:[:con :retVal |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3123
                        aStream nextPutAll:'leave '; nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3124
                        aStream nextPutAll:' receiver='. con receiver printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3125
                        aStream nextPutAll:' returning:'. retVal printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3126
                        aStream cr; flush
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3127
                   ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3128
            withOriginalClass:true
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3129
            flushCaches:false
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3130
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3131
    ObjectMemory flushCaches
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3132
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3133
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3134
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3135
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3136
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3137
     MessageTracer trace:p selectors:#(x:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3138
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3139
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3140
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3141
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3142
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3143
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3144
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3145
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3146
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3147
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3148
     MessageTracer trace:a selectors:#( at:put: at:) on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3149
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3150
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3151
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3152
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3153
    "Modified (comment): / 29-06-2019 / 09:07:28 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3154
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3155
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3156
traceAll:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3157
    "trace all messages which are understood by anObject"
27
claus
parents: 26
diff changeset
  3158
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3159
    self traceAll:anObject on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3160
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3161
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3162
     trace all (implemented) messages sent to Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3163
     (other messages lead to an error, anyway)
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3164
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3165
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3166
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3167
     MessageTracer traceAll:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3168
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3169
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3170
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3171
    "Modified: / 05-06-1996 / 13:43:51 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3172
    "Modified (comment): / 29-06-2019 / 09:07:32 / Claus Gittinger"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3173
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3174
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3175
traceAll:anObject from:aClass
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3176
    "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
  3177
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3178
    self traceAll:anObject from:aClass on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3179
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3180
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3181
     trace all methods in Display, which are implemented
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3182
     in the DisplayWorkstation class.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3183
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3184
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3185
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3186
     MessageTracer traceAll:Display from:XWorkstation
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3187
     MessageTracer untrace:Display
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3188
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3189
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3190
    "Modified: / 05-06-1996 / 13:45:37 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3191
    "Modified (comment): / 29-06-2019 / 09:08:26 / Claus Gittinger"
27
claus
parents: 26
diff changeset
  3192
!
claus
parents: 26
diff changeset
  3193
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3194
traceAll:anObject from:aClass on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3195
    "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
  3196
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3197
    self trace:anObject selectors:aClass selectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3198
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3199
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3200
     trace all methods in Display, which are implemented
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3201
     in the DisplayWorkstation class.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3202
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3203
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3204
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3205
     MessageTracer traceAll:Display from:XWorkstation on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3206
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3207
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3208
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3209
    "Modified: / 05-06-1996 / 13:45:37 / stefan"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3210
    "Modified (comment): / 29-06-2019 / 09:08:38 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3211
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3212
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3213
traceAll:anObject on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3214
    "trace all messages which are understood by anObject"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3215
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3216
    |allSelectors|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3217
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3218
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3219
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3220
	aClass methodDictionary keys addAllTo:allSelectors
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3221
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3222
    self trace:anObject selectors:allSelectors on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3223
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3224
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3225
     trace all (implemented) messages sent to Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3226
     (other messages lead to an error, anyway)
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
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
     MessageTracer traceAll:Display on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3231
     MessageTracer untrace:Display
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3232
    "
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
    "Modified: 5.6.1996 / 13:43:51 / stefan"
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
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3237
traceEntry:anObject selectors:aCollectionOfSelectors on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3238
    "arrange for a trace message to be output on aStream, when any message
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3239
     from aCollectionOfSelectors is sent to anObject.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3240
     Only entry is traced.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3241
     Use untrap:/untrace: to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3242
     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
  3243
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3244
    self
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3245
        traceEntry:anObject selectors:aCollectionOfSelectors on:Processor activeProcess stderr
664
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
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3248
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3249
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3250
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3251
     MessageTracer traceEntry:p selectors:#(x:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3252
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3253
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3254
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3255
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3256
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3257
    "
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
     |a|
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
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3262
     MessageTracer traceEntry:a selectors:#( at:put: at:).
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3263
     a sort.
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
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3266
    "Modified: / 21-04-1998 / 15:41:57 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3267
    "Modified (comment): / 29-06-2019 / 09:08:46 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3268
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3269
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3270
traceSender:anObject selector:aSelector
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3271
    "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
  3272
     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
  3273
     Use untrap to remove this trace.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3274
     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
  3275
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3276
    ^ self traceSender:anObject selector:aSelector on:(Processor activeProcess stderr)
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3277
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3278
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3279
     |p|
27
claus
parents: 26
diff changeset
  3280
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3281
     p := Point new.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3282
     MessageTracer traceSender:p selector:#x:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3283
     p x:5.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3284
     p y:1.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3285
     p x:10.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3286
     MessageTracer untrap:p.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3287
     p x:7
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3288
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3289
    "
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3290
     |a|
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3291
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3292
     a := #(6 1 9 66 2 17) copy.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3293
     MessageTracer traceSender:a selector:#at:put:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3294
     MessageTracer traceSender:a selector:#at:.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3295
     a sort.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3296
    "
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3297
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3298
    "Modified: / 10-01-1997 / 17:54:53 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3299
    "Modified (comment): / 29-06-2019 / 09:08:51 / Claus Gittinger"
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3300
!
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  3301
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3302
traceSender:anObject selector:aSelector on:aStream
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3303
    "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
  3304
     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
  3305
     Use untrap to remove this trace.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3306
     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
  3307
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3308
    |methodName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3309
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3310
    methodName := anObject class name , '>>' , aSelector.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3311
    self wrap:anObject
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3312
         selector:aSelector
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3313
         onEntry:[:con |
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3314
                     aStream nextPutAll:methodName.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3315
                     aStream nextPutAll:' from '.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3316
                     con sender printOn:aStream.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3317
                     aStream cr; flush.
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3318
                 ]
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3319
         onExit:LeaveTraceBlock.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3320
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3321
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3322
     |p|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3323
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3324
     p := Point new.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3325
     MessageTracer traceSender:p selector:#x: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3326
     p x:5.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3327
     p y:1.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3328
     p x:10.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3329
     MessageTracer untrap:p.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3330
     p x:7
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3331
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3332
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3333
     |a|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3334
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3335
     a := #(6 1 9 66 2 17) copy.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3336
     MessageTracer traceSender:a selector:#at:put: on:Transcript.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3337
     MessageTracer traceSender:a selector:#at:.    on:Transcript
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3338
     a sort.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3339
    "
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3340
4451
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3341
    "Modified: / 10-01-1997 / 17:54:53 / cg"
8fcca6fa38f7 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4403
diff changeset
  3342
    "Modified (comment): / 29-06-2019 / 09:08:56 / Claus Gittinger"
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3343
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3344
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3345
untrace:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3346
    "remove any traces on anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3347
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3348
    "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
  3349
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3350
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3351
    ^ self untrap:anObject
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3352
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3353
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3354
untrace:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3355
    "remove traces of aSelector sent to anObject"
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3356
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3357
    "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
  3358
     trace facilities ..."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3359
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3360
    ^ self untrap:anObject selector:aSelector
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3361
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3362
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3363
!MessageTracer class methodsFor:'object wrapping'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3364
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3365
wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3366
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3367
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3368
     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
  3369
     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
  3370
     The current implementation does not allow integers or nil to be wrapped."
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3371
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3372
    "I have not yet enough experience, if the wrapped original method should
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3373
     run as an instance of the original, or of the catching class;
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3374
     The latter has the advantage of catching recursive and other sends, while
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3375
     it might lead into trouble when the message is sent from a debugger or a long
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3376
     return is done out of the original method ...
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3377
     Time will show, you can experiment by setting the withOriginalClass: flag to false
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3378
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3379
    ^ self
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3380
        wrap:anObject
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3381
        selector:aSelector
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3382
        onEntry:entryBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3383
        onExit:exitBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3384
        withOriginalClass:true
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3385
        flushCaches:true
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3386
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3387
    "Modified: / 21-04-1998 / 15:29:50 / cg"
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3388
    "Modified (comment): / 21-11-2017 / 13:03:04 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3389
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3390
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3391
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
  3392
    "arrange for the two blocks entryBlock and exitBlock to be evaluated whenever
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3393
     a message with aSelector is sent to anObject. EntryBlock will be called on
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3394
     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
  3395
     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
  3396
     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
  3397
     before the wrapped method will be called.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3398
     NOTICE: The current implementation does not allow integers or nil to be wrapped."
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3399
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3400
    |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
  3401
     originalMethod|
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3402
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3403
    "
27
claus
parents: 26
diff changeset
  3404
     some are not allowed (otherwise we get into trouble ...)
claus
parents: 26
diff changeset
  3405
    "
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3406
    (aSelector == #class
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3407
    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
  3408
        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
  3409
        ^ self
27
claus
parents: 26
diff changeset
  3410
    ].
claus
parents: 26
diff changeset
  3411
claus
parents: 26
diff changeset
  3412
    WrappedMethod autoload.     "/ just to make sure ...
claus
parents: 26
diff changeset
  3413
claus
parents: 26
diff changeset
  3414
    "
3393
943250332a24 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3347
diff changeset
  3415
     create a new (anonymous) subclass of the receiver's class
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3416
     but only if not already being trapped.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3417
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3418
    orgClass := anObject class.
457
8ba8e7ac735d use #'* trapping *' instead of #trapping as category mark
Claus Gittinger <cg@exept.de>
parents: 352
diff changeset
  3419
    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
  3420
        newClass := orgClass
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3421
    ] 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
  3422
        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
  3423
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3424
        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
  3425
        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
  3426
        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
  3427
        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
  3428
        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
  3429
        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
  3430
        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
  3431
        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
  3432
        newClass methodDictionary:MethodDictionary new.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3433
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3434
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3435
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3436
     create a method, executing the trap-blocks and the original method via a super-send
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3437
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3438
    spec := Parser methodSpecificationForSelector:aSelector.
4098
048912860538 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 3956
diff changeset
  3439
    s := WriteStream on:''.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3440
    s nextPutAll:spec.
3286
f284e25d482e class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3258
diff changeset
  3441
    s nextPutAll:' <context: #return>'.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3442
    s nextPutAll:' |retVal stubClass '.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3443
    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
  3444
        s nextPutAll:additionalVariables.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3445
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3446
    s nextPutAll:'| '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3447
    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
  3448
        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
  3449
        s nextPutAll:'self changeClassTo:(stubClass superclass). '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3450
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3451
    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
  3452
        s nextPutAll:additionalEntryCode.
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3453
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3454
    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
  3455
        s nextPutAll:'#literal1 yourself value:thisContext. '.               "/ #literal1 will be replaced by the entryBlock
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3456
    ].
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3457
    s nextPutAll:('retVal := #originalMethod. ').                            "/ just to get a place for the originalMethod
27
claus
parents: 26
diff changeset
  3458
    s nextPutAll:('retVal := super ' , spec , '. ').
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3459
    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
  3460
        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
  3461
    ].
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3462
    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
  3463
        s nextPutAll:additionalExitCode.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3464
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3465
    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
  3466
        s nextPutAll:'self changeClassTo:stubClass. '.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3467
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3468
    s nextPutAll:'^ retVal'; cr.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3469
1452
297d94ece21c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
  3470
    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
  3471
        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
  3472
        do:[
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3473
            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
  3474
                [
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3475
                    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
  3476
                                    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
  3477
                                    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
  3478
                                    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
  3479
                                    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
  3480
                                    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
  3481
                                    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
  3482
                                    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
  3483
                ] 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
  3484
                    "/ 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
  3485
                    "/ 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
  3486
                    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
  3487
                ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3488
            ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3489
        ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3490
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3491
    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
  3492
        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
  3493
        ^ self
646
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3494
    ].
da12b86e88ea care fore compilation errors
Claus Gittinger <cg@exept.de>
parents: 591
diff changeset
  3495
29
claus
parents: 27
diff changeset
  3496
    implClass := orgClass whichClassIncludesSelector:aSelector.
claus
parents: 27
diff changeset
  3497
    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
  3498
        Transcript showCR:aSelector , ' is not understood by ' , orgClass name.
29
claus
parents: 27
diff changeset
  3499
    ] 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
  3500
        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
  3501
        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
  3502
            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
  3503
        ].
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3504
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3505
        trapMethod changeLiteral:#originalMethod to:originalMethod.
29
claus
parents: 27
diff changeset
  3506
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3507
    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
  3508
        trapMethod changeLiteral:#literal1 to:entryBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3509
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3510
    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
  3511
        trapMethod changeLiteral:#literal2 to:exitBlock.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3512
    ].
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3513
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3514
     change the source of this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3515
     (to avoid confusion in the debugger ...)
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3516
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3517
    trapMethod source:'this is a wrapper method - not the real one'.
27
claus
parents: 26
diff changeset
  3518
    trapMethod changeClassTo:WrappedMethod.
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3519
    trapMethod register.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3520
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3521
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3522
     install this new method
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3523
    "
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3524
    dict := newClass methodDictionary.
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3525
    dict := dict at:aSelector putOrAppend:trapMethod.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3526
    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
  3527
        newClass methodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3528
    ] 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
  3529
        newClass setMethodDictionary:dict.
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3530
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3531
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3532
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3533
     and finally, the big trick:
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3534
    "
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3535
    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
  3536
        anObject changeClassTo:newClass
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3537
    ].
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3538
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3539
    "
3617
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3540
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3541
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3542
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3543
     p := Point new copy.
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3544
     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
  3545
                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
  3546
            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
  3547
             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
  3548
              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
  3549
                         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
  3550
                         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
  3551
                         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
  3552
                     ]
cd5cba72f63a Fix in #wrap:selector:onEntry:onExit:additionalEntryCode:additionalExitCode:additionalVariables:withOriginalClass:flushCaches:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3609
diff changeset
  3553
               withOriginalClass:true.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3554
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3555
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3556
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3557
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3558
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3559
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3560
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3561
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3562
     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
  3563
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3564
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3565
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3566
    "
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
                                                                        [exBegin]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3568
     |p|
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3569
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3570
     p := Point new copy.
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3571
     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
  3572
               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
  3573
                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
  3574
                 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
  3575
                  withOriginalClass:false.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3576
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3577
     p x:1.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3578
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3579
     p y:2.
309
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3580
     MessageTracer untrap:p.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3581
     Transcript showCR:'sending x: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3582
     p x:2.
256
da5bff51d133 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 244
diff changeset
  3583
     Transcript showCR:'sending y: ...'.
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3584
     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
  3585
                                                                        [exEnd]
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3586
    "
150
54b6185e9aa7 compile without updating changes-file (also disables historyManager for the wrap)
Claus Gittinger <cg@exept.de>
parents: 120
diff changeset
  3587
2396
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3588
    "Modified: / 25-06-1996 / 22:11:21 / stefan"
95b7dc0353f0 changed:
Claus Gittinger <cg@exept.de>
parents: 2310
diff changeset
  3589
    "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
  3590
    "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
  3591
    "Modified (comment): / 21-11-2017 / 13:03:09 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3592
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3593
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3594
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
  3595
    "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
  3596
     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
  3597
     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
  3598
     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
  3599
     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
  3600
     before the wrapped method will be called.
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3601
     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
  3602
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3603
    ^ self
4265
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3604
        wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3605
        additionalEntryCode:nil additionalExitCode:nil  additionalVariables:nil
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3606
        withOriginalClass:withOriginalClass flushCaches:flushCaches
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3607
5f818d0c0aa7 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3608
    "Modified (comment): / 21-11-2017 / 13:03:16 / cg"
993
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3609
!
ebcbcdd21e05 experimental instVar-written traps
Claus Gittinger <cg@exept.de>
parents: 972
diff changeset
  3610
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3611
wrap:anObject selectors:aCollection onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3612
    "install wrappers for anObject on all selectors from aCollection"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3613
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3614
    aCollection do:[:aSelector |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3615
	self
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3616
	    wrap:anObject selector:aSelector
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3617
	    onEntry:entryBlock onExit:exitBlock
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3618
	    withOriginalClass:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3619
	    flushCaches:false
660
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3620
    ].
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3621
    ObjectMemory flushCaches
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3622
dd279b74eccf added trap-on-modification
Claus Gittinger <cg@exept.de>
parents: 646
diff changeset
  3623
    "Modified: / 21.4.1998 / 15:40:28 / cg"
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3624
!
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  3625
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3626
wrapAll:anObject onEntry:entryBlock onExit:exitBlock
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3627
    "install wrappers for anObject on all implemented selectors"
27
claus
parents: 26
diff changeset
  3628
claus
parents: 26
diff changeset
  3629
    |allSelectors|
claus
parents: 26
diff changeset
  3630
claus
parents: 26
diff changeset
  3631
    allSelectors := IdentitySet new.
972
45ca50da1bfa use #withAllSuperclassesDo:
Claus Gittinger <cg@exept.de>
parents: 970
diff changeset
  3632
    anObject class withAllSuperclassesDo:[:aClass |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3633
	aClass methodDictionary keys addAllTo:allSelectors
27
claus
parents: 26
diff changeset
  3634
    ].
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3635
    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
  3636
d2a145453677 Use methodDictionary instyead of selector/method arrays.
Stefan Vogel <sv@exept.de>
parents: 265
diff changeset
  3637
    "Modified: 5.6.1996 / 14:50:07 / stefan"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3638
! !
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3639
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3640
!MessageTracer class methodsFor:'queries'!
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3641
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3642
allWrappedMethods
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3643
    ^ WrappedMethod allWrappedMethods. 
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3644
    "/ ^ Smalltalk allMethodsForWhich:[:mthd | mthd isWrapped]
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3645
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3646
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3647
areAnyMethodsWrapped
3584
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3648
    ^ WrappedMethod allWrappedMethods notEmpty.
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3649
"/    Smalltalk allMethodsDo:[:mthd |
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3650
"/        mthd isWrapped ifTrue:[ ^ true ]
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3651
"/    ].
954261a42263 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3577
diff changeset
  3652
"/    ^ false
1369
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3653
!
7eef4c09c087 allBreakPoints
Claus Gittinger <cg@exept.de>
parents: 1320
diff changeset
  3654
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3655
isCounting:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3656
    "return true if aMethod is counted"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3657
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3658
    MethodCounts notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3659
	(MethodCounts includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3660
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3661
	    (MethodCounts includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3662
	].
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3663
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3664
    MethodCountsPerReceiverClass notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3665
	(MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3666
	aMethod isWrapped ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3667
	    (MethodCountsPerReceiverClass includesKey:aMethod originalMethod)ifTrue:[^ true].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3668
	].
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3669
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3670
    ^ false
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3671
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3672
    "Created: 15.12.1995 / 11:07:58 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3673
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3674
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3675
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3676
isCountingByReceiverClass:aMethod
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3677
    "return true if aMethod is counted with per receiver class statistics"
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3678
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3679
    MethodCountsPerReceiverClass isNil ifTrue:[^ false].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3680
    (MethodCountsPerReceiverClass includesKey:aMethod) ifTrue:[^ true].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3681
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3682
	^ MethodCountsPerReceiverClass includesKey:aMethod originalMethod
3308
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3683
    ].
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3684
    ^ false
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3685
!
25b846cf6917 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 3290
diff changeset
  3686
3609
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3687
isMocking:aMethod
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3688
    "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
  3689
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3690
    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
  3691
    ^ false
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3692
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3693
    "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
  3694
!
20c3f53f7160 Initial support for simple method mocking (for tests, mainly)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3584
diff changeset
  3695
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3696
isTiming:aMethod
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3697
    "return true if aMethod is timed"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3698
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3699
    MethodTiming isNil ifTrue:[^ false].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3700
    (MethodTiming includesKey:aMethod) ifTrue:[^ true].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3701
    aMethod isWrapped ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3702
	^ MethodTiming includesKey:aMethod originalMethod
579
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3703
    ].
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3704
    ^ false
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
    "Modified: 15.12.1995 / 15:42:10 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3707
    "Created: 17.6.1996 / 17:04:29 / cg"
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3708
!
eabd0d36b0d0 fixed isTiming query
Claus Gittinger <cg@exept.de>
parents: 572
diff changeset
  3709
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3710
isTrapped:aMethod
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3711
    "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
  3712
     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
  3713
     this returns false)"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3714
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3715
    aMethod isWrapped ifFalse:[^ false].
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3716
    ^ aMethod basicLiterals includesIdentical:LeaveBreakBlock
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3717
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3718
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3719
     MessageTracer trapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3720
     Transcript showCR:(Collection compiledMethodAt:#select:) isWrapped.
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3721
     Transcript showCR:(MessageTracer isTrapped:(Collection compiledMethodAt:#select:)).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3722
     MessageTracer unwrapMethod:(Collection compiledMethodAt:#select:).
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3723
    "
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3724
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3725
    "Modified: 22.10.1996 / 17:40:37 / cg"
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3726
! !
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3727
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  3728
!MessageTracer class methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3729
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3730
dummyEmptyMethod
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3731
    "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
  3732
     a dummy method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3733
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3734
    "Created: / 30.7.1998 / 16:58:08 / cg"
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3735
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3736
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3737
getTimeForWrappers
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3738
    "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
  3739
     a timed method."
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3740
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3741
    |m times|
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3742
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3743
    TimeForWrappers := 0.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3744
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3745
    "/ wrap the dummy method ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3746
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3747
    m := self class compiledMethodAt:#dummyEmptyMethod.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3748
    m := self timeMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3749
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3750
    "/ invoke it a few times ...
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3751
    "/ (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
  3752
    "/  depends on whether there is already some statistic data)
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3753
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3754
    10 timesRepeat:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3755
	self dummyEmptyMethod.
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3756
    ].
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3757
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3758
    "/ fetch min time & unwrap
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3759
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3760
    times := self executionTimesOfMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3761
    self stopTimingMethod:m.
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3762
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3763
    ^ (TimeForWrappers := times avgTime)
694
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
    "
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3766
     self getTimeForWrappers
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
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  3769
    "Modified: / 05-03-2007 / 15:44:24 / cg"
694
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3770
!
7c9f654a1054 much more detailed timing info;
Claus Gittinger <cg@exept.de>
parents: 693
diff changeset
  3771
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3772
printEntryFull:aContext
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3773
    self printEntryFull:aContext level:0 on:Processor activeProcess stderr
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3774
!
27
claus
parents: 26
diff changeset
  3775
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3776
printEntryFull:aContext level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3777
    self printEntryFull:aContext level:lvl on:Processor activeProcess stderr
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3778
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3779
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3780
printEntryFull:aContext level:lvl on:aStream
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3781
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3782
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3783
	nextPutAll:'enter '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3784
    self printFull:aContext on:aStream withSender:true.
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3785
!
27
claus
parents: 26
diff changeset
  3786
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3787
printEntryFull:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3788
    self printEntryFull:aContext level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3789
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3790
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3791
printEntrySender:aContext on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3792
    |sender mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3793
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3794
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3795
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3796
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3797
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3798
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3799
    ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3800
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3801
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3802
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3803
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3804
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3805
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3806
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3807
	nextPutAll:' from '.
538
5961061365d9 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 536
diff changeset
  3808
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3809
    sender := aContext sender.
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3810
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3811
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3812
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3813
	].
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3814
    ].
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3815
    sender printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3816
    aStream cr; flush.
555
c92d12af9f1e in trace: if sender is Object>>perform, print senders sender.
Claus Gittinger <cg@exept.de>
parents: 538
diff changeset
  3817
695
88a741b6008f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 694
diff changeset
  3818
    "Modified: / 30.7.1998 / 20:40:14 / cg"
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3819
!
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3820
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3821
printExit:aContext with:retVal
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3822
    self printExit:aContext with:retVal level:0 on:Processor activeProcess stderr
27
claus
parents: 26
diff changeset
  3823
!
claus
parents: 26
diff changeset
  3824
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3825
printExit:aContext with:retVal level:lvl
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  3826
    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
  3827
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3828
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3829
printExit:aContext with:retVal level:lvl on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3830
    |mClass mClassName|
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3831
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3832
    mClass := aContext methodClass.
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3833
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3834
	mClassName := '???'
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3835
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3836
	mClassName := mClass name
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3837
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3838
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3839
	spaces:lvl;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3840
	nextPutAll:'leave ';
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3841
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3842
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3843
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3844
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3845
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3846
	nextPutAll:' rec=['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3847
1486
d7ae9a86ea38 print same receiver on entry and exit
Stefan Vogel <sv@exept.de>
parents: 1472
diff changeset
  3848
    self printObject:aContext receiver on:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3849
    aStream nextPutAll:'] return: ['.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3850
    retVal printOn:aStream.
666
bd187c08d386 nicer printOut in tracing
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  3851
    aStream nextPutAll:']'; cr; flush.
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3852
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3853
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3854
printExit:aContext with:retVal on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3855
    self printExit:aContext with:retVal level:0 on:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3856
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3857
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3858
printFull:aContext on:aStream withSender:withSender
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3859
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3860
	printFull:aContext on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3861
	withSenderContext:(withSender ifTrue:[aContext sender]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3862
				      ifFalse:[nil])
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3863
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3864
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3865
printFull:aContext on:aStream withSenderContext:aSenderContextOrNil
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3866
    |mClass mClassName|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3867
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3868
    mClass := aContext methodClass.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3869
    mClass isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3870
	mClassName := '???'
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3871
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3872
	mClassName := mClass name
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3873
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3874
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3875
    aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3876
	nextPutAll:mClassName;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3877
	space;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3878
	bold;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3879
	nextPutAll:aContext selector;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3880
	normal;
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3881
	nextPutAll:' rec=['.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3882
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3883
    self printObject:aContext receiver on:aStream.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3884
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3885
    aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3886
    (aContext args) keysAndValuesDo:[:idx :arg |
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3887
	aStream nextPutAll:'arg'. idx printOn:aStream. aStream nextPutAll:'=['.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3888
	self printObject:arg on:aStream.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3889
	aStream nextPutAll:'] '.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3890
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3891
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3892
    aSenderContextOrNil notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3893
	self printSender:aSenderContextOrNil on:aStream.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3894
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3895
    aStream cr; flush.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3896
!
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  3897
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3898
printObject:anObject on:aStream
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3899
    |s|
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3900
4165
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3901
    anObject isProtoObject ifTrue:[
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3902
        s := anObject classNameWithArticle
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3903
    ] ifFalse:[
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3904
        s := anObject printString.
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3905
        s size > 40 ifTrue:[
4172
96c1701f5490 #UI_ENHANCEMENT by sr
sr
parents: 4165
diff changeset
  3906
            s := s contractTo:40.
4165
8b8d8ccce41b #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4128
diff changeset
  3907
        ].
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3908
    ].
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3909
    aStream nextPutAll:s
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3910
!
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  3911
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3912
printSender:aSenderContext on:aStream
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3913
    |sender|
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3914
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3915
    sender := aSenderContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3916
    sender notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3917
	(sender selector startsWith:'perform:') ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3918
	    sender := sender sender.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3919
	].
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3920
    ].
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3921
    aStream nextPutAll:'from:'.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3922
    aStream bold.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3923
    sender printOn:aStream.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3924
    aStream normal.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3925
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3926
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3927
printUpdateEntryFull:aContext level:lvl on:aStream
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3928
    |con|
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3929
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3930
    con := aContext.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3931
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3932
    [con notNil
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3933
     and:[con selector ~~ #'changed:with:']
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3934
    ] whileTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3935
	con := con sender.
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3936
    ].
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3937
    "/ con is #'changed:with:'
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3938
    con isNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3939
	^ self printEntryFull:aContext level:lvl on:aStream.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3940
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3941
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3942
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3943
    and:[ con sender selector == #'changed:']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3944
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3945
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3946
    (con sender notNil
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3947
    and:[ con sender selector == #'changed']) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3948
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3949
    ].
3465
3ab190fb9bb2 merged in jv's changes
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
  3950
    (con sender notNil) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3951
	con := con sender.
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3952
    ].
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3953
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3954
    aStream spaces:lvl; nextPutAll:'enter '.
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3955
    self
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3956
	printFull:aContext
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3957
	on:aStream
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3958
	withSenderContext:con
1071
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3959
!
b63a3093e0db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1020
diff changeset
  3960
697
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3961
traceEntryFull:aContext on:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3962
    aStream nextPutLine:'-----------------------------------------'.
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3963
    aContext fullPrintAllOn:aStream
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3964
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3965
    "Created: / 30.7.1998 / 20:39:57 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3966
    "Modified: / 30.7.1998 / 20:42:23 / cg"
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3967
!
062ee48ece19 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 696
diff changeset
  3968
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3969
traceFullBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3970
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3971
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3972
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3973
	^ TraceFullBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3974
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3975
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3976
	^ TraceFullBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3977
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3978
    ^ [:con | con fullPrintAllOn:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3979
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3980
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3981
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3982
!
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3983
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3984
traceSenderBlockFor:aStream
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3985
    "avoid generation of fullBlocks"
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3986
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3987
    aStream == Transcript ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3988
	^ TraceSenderBlock2
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3989
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3990
    aStream == Stderr ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  3991
	^ TraceSenderBlock
664
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3992
    ].
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3993
    ^ [:con | MessageTracer printEntrySender:con on:aStream]
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3994
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3995
3412407a540f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 663
diff changeset
  3996
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  3997
! !
13
e416e7aa11e1 *** empty log message ***
claus
parents: 12
diff changeset
  3998
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  3999
!MessageTracer methodsFor:'trace helpers'!
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4000
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4001
trace:aBlock detail:fullDetail
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4002
    "trace execution of aBlock."
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4003
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4004
    traceDetail := fullDetail.
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4005
    tracedBlock := aBlock.
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4006
88
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4007
    ObjectMemory stepInterruptHandler:self.
070ba8eb911e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
  4008
    ^ [
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4009
	ObjectMemory flushInlineCaches.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4010
	StepInterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4011
	InterruptPending := 1.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4012
	aBlock value
1139
56861678ff27 #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 1082
diff changeset
  4013
    ] ensure:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4014
	tracedBlock := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4015
	StepInterruptPending := nil.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4016
	ObjectMemory stepInterruptHandler:nil.
11
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4017
    ]
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4018
3553d053d5b8 *** empty log message ***
claus
parents: 10
diff changeset
  4019
    "
735
a82f12caf84f *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 734
diff changeset
  4020
     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
  4021
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4022
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4023
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4024
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4025
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4026
     PrintingMessageTracer new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
8
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  4027
    "
3fba2acf0eeb Initial revision
claus
parents:
diff changeset
  4028
! !
27
claus
parents: 26
diff changeset
  4029
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  4030
!MessageTracer::InteractionCollector methodsFor:'trace helpers'!
1008
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4031
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4032
stepInterrupt
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4033
    StepInterruptPending := nil.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4034
    ObjectMemory flushInlineCaches.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4035
    StepInterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4036
    InterruptPending := 1.
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4037
! !
19836654299a Smalltalk change-notifications (in addition-for now)
Claus Gittinger <cg@exept.de>
parents: 993
diff changeset
  4038
3733
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4039
!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
  4040
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4041
profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4042
    ^ profiler
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4043
!
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4044
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4045
profiler:aMessageTally
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4046
    profiler := aMessageTally.
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4047
! !
406ed5a2c24d Added utility method to profile (using MessageTally) on given method.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3680
diff changeset
  4048
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4049
!MessageTracer::MethodTimingInfo methodsFor:'accessing'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4050
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4051
avgTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4052
    sumTimes notNil ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4053
	^ sumTimes / count
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4054
    ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4055
    ^ nil
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4056
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4057
    "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
  4058
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4059
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4060
avgTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4061
    |avg|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4062
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4063
    avg := self avgTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4064
    avg > 100 ifTrue:[ ^ avg roundTo:1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4065
    avg > 10 ifTrue:[ ^ avg roundTo:0.1 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4066
    avg > 1 ifTrue:[ ^ avg roundTo:0.01 ].
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4067
    ^ avg roundTo:0.001
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4068
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4069
    "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
  4070
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4071
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4072
count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4073
    ^ count
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4074
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4075
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4076
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
  4077
    count := countArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4078
    minTime := minTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4079
    maxTime := maxTimeArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4080
    sumTimes := sumTimesArg.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4081
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4082
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4083
maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4084
    ^ maxTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4085
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4086
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4087
maxTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4088
    |max|
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4089
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4090
    max := self maxTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4091
    ^ 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
  4092
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4093
    "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
  4094
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4095
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4096
minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4097
    ^ minTime
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4098
!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4099
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4100
minTimeRounded
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4101
    |min|
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
    min := self minTime.
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4104
    ^ 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
  4105
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4106
    "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
  4107
!
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
sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4110
    ^ sumTimes
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4111
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4112
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4113
!MessageTracer::MethodTimingInfo methodsFor:'initialization'!
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4114
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4115
rememberExecutionTime:t
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4116
    (count isNil or:[count == 0]) ifTrue:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4117
	minTime := maxTime := sumTimes := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4118
	count := 1.
1957
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4119
    ] ifFalse:[
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4120
	t < minTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4121
	    minTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4122
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4123
	    t > maxTime ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4124
		maxTime := t.
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4125
	    ]
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4126
	].
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4127
	sumTimes := (sumTimes + t).
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4128
	count := count + 1
1957
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
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4131
    "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
  4132
! !
79be76350837 dont use anon-arrays to represent info
Claus Gittinger <cg@exept.de>
parents: 1486
diff changeset
  4133
2972
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4134
!MessageTracer::PrintingMessageTracer methodsFor:'accessing'!
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4135
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4136
output:something
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4137
    output := something.
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4138
! !
114b461b280d class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2825
diff changeset
  4139
1082
181f679e4b2d category included a space
Claus Gittinger <cg@exept.de>
parents: 1072
diff changeset
  4140
!MessageTracer::PrintingMessageTracer methodsFor:'trace helpers'!
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4141
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4142
stepInterrupt
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4143
    "called for every send while tracing"
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4144
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  4145
    |ignore sel con r outStream senderContext|
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4146
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4147
    StepInterruptPending := nil.
3258
812cc23ab5e8 class: MessageTracer
Stefan Vogel <sv@exept.de>
parents: 3175
diff changeset
  4148
    con := senderContext := thisContext sender.
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4149
    ignore := false.
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4150
    outStream := output notNil ifTrue:[output] ifFalse:[Processor activeProcess stderr].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4151
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4152
    con receiver == Processor ifTrue:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4153
        (sel := con selector) == #threadSwitch: ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4154
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4155
        ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4156
        sel == #timerInterrupt ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4157
            ignore := true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4158
        ]
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4159
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4160
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4161
    con lineNumber == 1 ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4162
        ignore := true
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4163
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4164
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4165
    ignore ifFalse:[
3956
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4166
        con markForInterruptOnUnwind.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4167
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4168
        ((r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4169
        and:[r ~~ tracedBlock]) ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4170
            traceDetail == #fullIndent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4171
                [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4172
                and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4173
                and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4174
                    '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4175
                    con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4176
                ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4177
                con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4178
                self class printFull:con on:outStream withSender:false.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4179
            ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4180
                traceDetail == #indent ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4181
                    [con notNil
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4182
                    and:[(r := con receiver) ~~ self
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4183
                    and:[r ~~ tracedBlock]]] whileTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4184
                        '  ' printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4185
                        con := con sender.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4186
                    ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4187
                    con := senderContext.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4188
                    con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4189
                    outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4190
                ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4191
                    traceDetail == true ifTrue:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4192
                        self class printFull:con on:outStream withSender:true.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4193
                    ] ifFalse:[
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4194
                        con printOn:outStream.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4195
                        outStream cr.
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4196
                    ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4197
                ]
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4198
            ].
8c01ea3b86fc #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3944
diff changeset
  4199
        ].
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4200
    ].
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4201
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4202
    ObjectMemory flushInlineCaches.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4203
    StepInterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4204
    InterruptPending := 1.
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4205
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4206
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4207
     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
  4208
3577
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4209
     self new trace:[#(6 5 4 3 2 1) sort] detail:true
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4210
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4211
     self new trace:[#(6 5 4 3 2 1) sort] detail:#indent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4212
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4213
     self new trace:[#(6 5 4 3 2 1) sort] detail:#fullIndent
Claus Gittinger <cg@exept.de>
parents: 3489
diff changeset
  4214
     self new trace:[ View new ] detail:#fullIndent
734
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4215
    "
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4216
! !
726905bea1bb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  4217
503
67f6584e0f9f use different leaveBlocks for break & trace
Claus Gittinger <cg@exept.de>
parents: 501
diff changeset
  4218
!MessageTracer class methodsFor:'documentation'!
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  4219
2243
886bcbcd310e comment/format in: #trapMethod:
Claus Gittinger <cg@exept.de>
parents: 2085
diff changeset
  4220
version_CVS
3944
612b03480f99 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3793
diff changeset
  4221
    ^ '$Header$'
98
123d948aacd1 version at the end
Claus Gittinger <cg@exept.de>
parents: 88
diff changeset
  4222
! !
1320
f346fa1fdb3a class category: sends a change notification;
Claus Gittinger <cg@exept.de>
parents: 1145
diff changeset
  4223
3130
cf77484583b8 class: MessageTracer
Claus Gittinger <cg@exept.de>
parents: 2972
diff changeset
  4224
27
claus
parents: 26
diff changeset
  4225
MessageTracer initialize!