MessageTally.st
author Claus Gittinger <cg@exept.de>
Sat, 11 Nov 1995 16:20:50 +0100
changeset 68 5f7ac0b5c903
parent 39 e36b38a77856
child 88 070ba8eb911e
permissions -rw-r--r--
uff - version methods changed to return stings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
470788421600 Initial revision
claus
parents:
diff changeset
     1
"
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
     2
 COPYRIGHT (c) 1995 by Claus Gittinger
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
     3
	      All Rights Reserved
0
470788421600 Initial revision
claus
parents:
diff changeset
     4
470788421600 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
470788421600 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
470788421600 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
470788421600 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
470788421600 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
470788421600 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
470788421600 Initial revision
claus
parents:
diff changeset
    11
"
470788421600 Initial revision
claus
parents:
diff changeset
    12
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    13
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    14
'From Smalltalk/X, Version:2.10.4 on 8-mar-1995 at 22:38:17'!
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    15
0
470788421600 Initial revision
claus
parents:
diff changeset
    16
Object subclass:#MessageTally
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    17
	 instanceVariableNames:'process tree ntally theBlock spyInterval'
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    18
	 classVariableNames:''
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    19
	 poolDictionaries:''
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    20
	 category:'System-Debugging-Support'
0
470788421600 Initial revision
claus
parents:
diff changeset
    21
!
470788421600 Initial revision
claus
parents:
diff changeset
    22
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    23
!MessageTally class methodsFor:'documentation'!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    24
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    25
version
68
5f7ac0b5c903 uff - version methods changed to return stings
Claus Gittinger <cg@exept.de>
parents: 39
diff changeset
    26
    ^ '$Header: /cvs/stx/stx/libbasic3/MessageTally.st,v 1.13 1995-11-11 15:20:37 cg Exp $'
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    27
!
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    28
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    29
documentation
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    30
"
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    31
    MessageTally allows profiling excution of a block; 
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    32
    statistic of method evaluation is output on Transcript.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    33
    To get statistic, use 'MessageTally spyOn:aBlock'.
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    34
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    35
    example:
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    36
	MessageTally spyOn:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    37
	    (ByteArray uninitalizedNew:1000) sort
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    38
	]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    39
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    40
    By default, probing is done every 10ms (i.e. the execution of the block is 
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    41
    interrupted every 10ms, and the context chain analyzed).
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    42
    For better resolution, use smaller clock ticks (if your OperatingSystem
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    43
    supports it). Try spyDetailedOn:aBlock, which tries to measure things
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    44
    every 1ms. (Notice, that some OS's only provide a resolution of less than
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    45
    that time interval)
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    46
"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    47
!
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    48
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    49
examples
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    50
"
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    51
     MessageTally spyOn:[ #(6 5 4 3 2 1) sort ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    52
     MessageTally spyOn:[100 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    53
     MessageTally spyOn:[1000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    54
     MessageTally spyOn:[10000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    55
     MessageTally spyOn:[100000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    56
     MessageTally spyOn:[500000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    57
     MessageTally spyDetailedOn:[500000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    58
     Time millisecondsToRun:[500000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    59
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    60
     MessageTally spyOn:[SystemBrowser open ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    61
     MessageTally spyDetailedOn:[SystemBrowser open ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    62
"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    63
!
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    64
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    65
copyright
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    66
"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    67
 COPYRIGHT (c) 1995 by Claus Gittinger
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    68
	      All Rights Reserved
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    69
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    70
 This software is furnished under a license and may be used
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    71
 only in accordance with the terms of that license and with the
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    72
 inclusion of the above copyright notice.   This software may not
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    73
 be provided or otherwise made available to, or used by, any
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    74
 other person.  No title to or ownership of the software is
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    75
 hereby transferred.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    76
"
9
f5b6ab00bdf6 *** empty log message ***
claus
parents: 5
diff changeset
    77
! !
0
470788421600 Initial revision
claus
parents:
diff changeset
    78
470788421600 Initial revision
claus
parents:
diff changeset
    79
!MessageTally class methodsFor:'instance creation'!
470788421600 Initial revision
claus
parents:
diff changeset
    80
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    81
spyOn:aBlock interval:ms
0
470788421600 Initial revision
claus
parents:
diff changeset
    82
    "evaluate aBlock and output time statistic on Transcript"
470788421600 Initial revision
claus
parents:
diff changeset
    83
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    84
    |runTime aTally nTally|
0
470788421600 Initial revision
claus
parents:
diff changeset
    85
470788421600 Initial revision
claus
parents:
diff changeset
    86
    aTally := self new.
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    87
    runTime := aTally spyOn:aBlock interval:ms.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    88
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    89
    aTally tree isNil ifTrue:[
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    90
	Transcript cr.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    91
	Transcript showCr:'TALLY: No probes - execution time too short;'.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    92
	Transcript showCr:'TALLY: retry using: spyOn:[n timesRepeat:[...]]'.
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
    93
    ] ifFalse:[
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    94
	"/ aTally tree inspect.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    95
	nTally := aTally nTally.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    96
	Transcript cr.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    97
	Transcript showCr:('total execution time: '
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    98
			   , runTime printString , ' ms '
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
    99
			   , '(' , nTally printString , ' probes ;'
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   100
			   , ' error >= ' 
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   101
			   , (1000 // nTally / 10.0) printString
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   102
			   , '%)').
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   103
	Transcript cr.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   104
	aTally tree printOn:Transcript.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   105
	Transcript cr.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   106
	Transcript cr.
0
470788421600 Initial revision
claus
parents:
diff changeset
   107
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   108
	Transcript showCr:'leafs of calling tree:'.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   109
	Transcript cr.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   110
	aTally tree printLeafsOn:Transcript.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   111
	Transcript cr.
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   112
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   113
	"
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   114
	aTally statistics.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   115
	"
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   116
    ].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   117
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   118
    "
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   119
     MessageTally spyOn:[ #(6 5 4 3 2 1) sort ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   120
     MessageTally spyOn:[100 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   121
     MessageTally spyOn:[1000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   122
     MessageTally spyOn:[10000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   123
     MessageTally spyOn:[100000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   124
     MessageTally spyOn:[500000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   125
     MessageTally spyOn:[SystemBrowser open ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   126
     MessageTally spyDetailedOn:[SystemBrowser open ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   127
     Time millisecondsToRun:[500000 timesRepeat:[#(6 5 4 3 2 1) sort] ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   128
    "
0
470788421600 Initial revision
claus
parents:
diff changeset
   129
!
470788421600 Initial revision
claus
parents:
diff changeset
   130
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   131
spyDetailedOn:aBlock
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   132
    "evaluate aBlock and output time statistic on the Transcript.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   133
     Tick is 1ms."
0
470788421600 Initial revision
claus
parents:
diff changeset
   134
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   135
    ^ self spyOn:aBlock interval:1
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   136
!
0
470788421600 Initial revision
claus
parents:
diff changeset
   137
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   138
spyOn:aBlock
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   139
    "evaluate aBlock and output time statistic on the Transcript.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   140
     Tick is 10ms."
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   141
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   142
    ^ self spyOn:aBlock interval:10
0
470788421600 Initial revision
claus
parents:
diff changeset
   143
! !
470788421600 Initial revision
claus
parents:
diff changeset
   144
470788421600 Initial revision
claus
parents:
diff changeset
   145
!MessageTally methodsFor:'private'!
470788421600 Initial revision
claus
parents:
diff changeset
   146
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   147
execute
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   148
    theBlock value
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   149
! !
0
470788421600 Initial revision
claus
parents:
diff changeset
   150
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   151
!MessageTally methodsFor:'accessing'!
0
470788421600 Initial revision
claus
parents:
diff changeset
   152
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   153
tree
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   154
    ^ tree
0
470788421600 Initial revision
claus
parents:
diff changeset
   155
!
470788421600 Initial revision
claus
parents:
diff changeset
   156
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   157
nTally 
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   158
    ^ ntally 
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   159
! !
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   160
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   161
!MessageTally methodsFor:'setup'!
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   162
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   163
spyOn:aBlock interval:ms
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   164
    "spy on execution time"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   165
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   166
    |startTime endTime running delay|
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   167
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   168
    theBlock := aBlock.
0
470788421600 Initial revision
claus
parents:
diff changeset
   169
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   170
    Processor activeProcess withPriority:23 do:[
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   171
	process := [
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   172
			[
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   173
			    self execute
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   174
			] valueNowOrOnUnwindDo:[
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   175
			    running := false.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   176
			    theBlock := nil.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   177
			]
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   178
		   ] newProcess.
0
470788421600 Initial revision
claus
parents:
diff changeset
   179
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   180
	Processor activeProcess withPriority:24 do:[
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   181
	    startTime := OperatingSystem getMillisecondTime.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   182
	    delay := (Delay forMilliseconds:ms).
0
470788421600 Initial revision
claus
parents:
diff changeset
   183
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   184
	    ntally := 0.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   185
	    running := true.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   186
	    process resume.
0
470788421600 Initial revision
claus
parents:
diff changeset
   187
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   188
	    [running] whileTrue:[
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   189
		delay wait.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   190
		self count:process suspendedContext
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   191
	    ].
0
470788421600 Initial revision
claus
parents:
diff changeset
   192
24
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   193
	    endTime := OperatingSystem getMillisecondTime.
10e1150b1f4b *** empty log message ***
claus
parents: 21
diff changeset
   194
	].    
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   195
    ].    
0
470788421600 Initial revision
claus
parents:
diff changeset
   196
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   197
    tree notNil ifTrue:[tree computePercentage:ntally].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   198
    ^ endTime - startTime
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   199
! !
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   200
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   201
!MessageTally methodsFor:'probes'!
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   202
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   203
count:aContext
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   204
    |con chain info atEnd sender home|
0
470788421600 Initial revision
claus
parents:
diff changeset
   205
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   206
    con := aContext.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   207
    con isNil ifTrue:[^ self].
0
470788421600 Initial revision
claus
parents:
diff changeset
   208
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   209
    ntally := ntally + 1.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   210
    "walk up above the interrupt context"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   211
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   212
    [con receiver == Processor] whileTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   213
	con := con sender
0
470788421600 Initial revision
claus
parents:
diff changeset
   214
    ].
470788421600 Initial revision
claus
parents:
diff changeset
   215
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   216
    "got it - collect info from contexts"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   217
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   218
    "walk up"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   219
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   220
    con isNil ifTrue:[^ self].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   221
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   222
    atEnd := false.
0
470788421600 Initial revision
claus
parents:
diff changeset
   223
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   224
    [atEnd] whileFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   225
	con isNil ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   226
	    atEnd := true
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   227
	] ifFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   228
	    sender := con sender.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   229
	    sender isNil ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   230
		atEnd := true
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   231
	    ] ifFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   232
		((sender receiver == self) and:[sender selector == #execute]) ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   233
		    atEnd := true
36
claus
parents: 24
diff changeset
   234
"/                ] ifFalse:[
claus
parents: 24
diff changeset
   235
"/                    (sender isMemberOf:BlockContext) ifTrue:[
claus
parents: 24
diff changeset
   236
"/                        sender sender selector == #execute ifTrue:[
claus
parents: 24
diff changeset
   237
"/                            atEnd := true
claus
parents: 24
diff changeset
   238
"/                        ]
claus
parents: 24
diff changeset
   239
"/                    ]
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   240
		]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   241
	    ]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   242
	].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   243
	atEnd ifFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   244
	    info := CallChain new.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   245
	    (con isMemberOf:BlockContext) ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   246
		home := con methodHome.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   247
		home isNil ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   248
		    info receiver:UndefinedObject
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   249
			 selector:'optimized'
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   250
			    class:UndefinedObject.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   251
		] ifFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   252
		    info receiver:home receiver class
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   253
			 selector:home selector
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   254
			    class:con methodClass.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   255
		].
36
claus
parents: 24
diff changeset
   256
		info isBlock:true.
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   257
	    ] ifFalse:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   258
		info receiver:con receiver class
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   259
		     selector:con selector
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   260
			class:con methodClass.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   261
	    ].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   262
	    info rest:chain.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   263
	    chain := info.
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   264
	    con := sender
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   265
	]
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   266
    ].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   267
    "add chain to the tree"
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   268
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   269
    chain isNil ifTrue:[^ self].
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   270
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   271
    tree isNil ifTrue:[
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   272
	tree := ProfileTree new.
36
claus
parents: 24
diff changeset
   273
	tree receiver:MessageTally 
claus
parents: 24
diff changeset
   274
	     selector:#execute 
claus
parents: 24
diff changeset
   275
		class:MessageTally .
0
470788421600 Initial revision
claus
parents:
diff changeset
   276
    ].
470788421600 Initial revision
claus
parents:
diff changeset
   277
21
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   278
    tree addChain:chain
c521be54a8e6 *** empty log message ***
claus
parents: 17
diff changeset
   279
! !
0
470788421600 Initial revision
claus
parents:
diff changeset
   280