[codesyntax lang=”smalltalk”]
Smalltalk at: #SSDefaultMessageTracer put: nil!
Object
subclass: #SSMessageTracer
instanceVariableNames: 'level'
classVariableNames: ''
poolDictionaries: ''
category: 'TT - Tracing'!
SSMessageTracer
subclass: #SSSimpleMessageTracer
instanceVariableNames: 'tracing'
classVariableNames: ''
poolDictionaries: ''
category: 'TT - Tracing'!
Object
subclass: #SSTraceFactory
instanceVariableNames: 'tracer'
classVariableNames: ''
poolDictionaries: ''
category: 'TT - Tracing'!
SSTraceFactory class instanceVariableNames: 'current'!
SSTraceFactory
subclass: #SSDirectTraceFactory
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'TT - Tracing'!
SSTraceFactory
subclass: #SSErrorHandlingTraceFactory
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'TT - Tracing'!
!SSDirectTraceFactory methodsFor: 'prototypes' !
optimizedPrototype
SSDefaultMessageTracer isNil ifTrue: [
^super original.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original
class: #OriginalMethodClass
sender: self sender.
result := super original.
SSDefaultMessageTracer traceSendReturn: self
selector: #original
class: #OriginalMethodClass
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:
class: #OriginalMethodClass
with: a1
sender: self sender.
result := super original: a1.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:
class: #OriginalMethodClass
with: a1
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1 w: a2
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:
class: #OriginalMethodClass
with: a1 with: a2
sender: self sender.
result := super original: a1 w: a2.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:
class: #OriginalMethodClass
with: a1 with: a2
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1 w: a2 w: a3
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:
class: #OriginalMethodClass
with: a1 with: a2 with: a3
sender: self sender.
result := super original: a1 w: a2 w: a3.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:
class: #OriginalMethodClass
with: a1 with: a2 with: a3
sender: self sender
result: result.
^result.
].!
prototype
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original.
] ifFalse: [
| args result |
args := Array new: 0.
SSDefaultMessageTracer traceSendBegin: self
selector: #original
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original.
SSDefaultMessageTracer traceSendReturn: self
selector: #original
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1.
] ifFalse: [
| args result |
args := Array new: 1.
args at: 1 put: a1.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2.
] ifFalse: [
| args result |
args := Array new: 2.
args at: 1 put: a1.
args at: 2 put: a2.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3.
] ifFalse: [
| args result |
args := Array new: 3.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4.
] ifFalse: [
| args result |
args := Array new: 4.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5.
] ifFalse: [
| args result |
args := Array new: 5.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6.
] ifFalse: [
| args result |
args := Array new: 6.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7.
] ifFalse: [
| args result |
args := Array new: 7.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8.
] ifFalse: [
| args result |
args := Array new: 8.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9.
] ifFalse: [
| args result |
args := Array new: 9.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10.
] ifFalse: [
| args result |
args := Array new: 10.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11.
] ifFalse: [
| args result |
args := Array new: 11.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12.
] ifFalse: [
| args result |
args := Array new: 12.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13.
] ifFalse: [
| args result |
args := Array new: 13.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14.
] ifFalse: [
| args result |
args := Array new: 14.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15.
] ifFalse: [
| args result |
args := Array new: 15.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16.
] ifFalse: [
| args result |
args := Array new: 16.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17.
] ifFalse: [
| args result |
args := Array new: 17.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18.
] ifFalse: [
| args result |
args := Array new: 18.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19.
] ifFalse: [
| args result |
args := Array new: 19.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
args at: 19 put: a19.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20.
] ifFalse: [
| args result |
args := Array new: 20.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
args at: 19 put: a19.
args at: 20 put: a20.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20.
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].! !
!SSDirectTraceFactory methodsFor: 'private' !
patchOptimizedTracingMethod: compiledMethod prototype: prototype
| selectorPlaceholder |
selectorPlaceholder := self originalSelector: compiledMethod argumentCount.
" Replace the SSDefaultMessageTracer variable in the method. "
self ASSERT: (prototype at: 1) == (Smalltalk associationAt: #SSDefaultMessageTracer).
prototype at: 1 put: tracer.
" Replace the symbol used to send to the trace messages "
self ASSERT: (prototype at: 2) == selectorPlaceholder.
prototype at: 2 put: compiledMethod selector.
" Replace the name of the class where the original method is implemented "
self ASSERT: (prototype at: 3) == #OriginalMethodClass.
prototype at: 3 put: compiledMethod classField symbol.
" Replace the selector of the method for the <super> send "
self ASSERT: (prototype at: 7) == selectorPlaceholder.
prototype at: 7 put: compiledMethod selector.!
patchTracingMethod: compiledMethod prototype: prototype
| selectorPlaceholder |
selectorPlaceholder := self originalSelector: compiledMethod argumentCount.
" Replace the SSDefaultMessageTracer variable in the method. "
self ASSERT: (prototype at: 1) == (Smalltalk associationAt: #SSDefaultMessageTracer).
prototype at: 1 put: tracer.
" Replace the symbol used to send to the trace messages "
self ASSERT: (prototype at: 3) == selectorPlaceholder.
prototype at: 3 put: compiledMethod selector.
" Replace the name of the class where the original method is implemented "
self ASSERT: (prototype at: 4) == #OriginalMethodClass.
prototype at: 4 put: compiledMethod classField symbol.
" Replace the selector of the method for the <super> send "
self ASSERT: (prototype at: 8) == selectorPlaceholder.
prototype at: 8 put: compiledMethod selector.! !
!SSDirectTraceFactory class methodsFor: 'development' !
writeMethodPrototype: args on: str
self writeMethodPrototypeProlog: args on: str.
str nextPutAll: ' SSDefaultMessageTracer isNil ifTrue: ['; cr.
str nextPutAll: ' ^super '.
self writeOriginalMethodSendPlaceholder: args on: str.
str nextPutAll: '.'; cr.
str nextPutAll: ' ] ifFalse: ['; cr.
str nextPutAll: ' | args result |'; cr.
str nextPutAll: ' args := Array new: ', args asString, '.'; cr.
1 to: args do: [ :i | str nextPutAll: ' args at: ', i asString, ' put: a', i asString, '.'; cr ].
str cr.
str nextPutAll: ' SSDefaultMessageTracer traceSendBegin: self '; cr.
str nextPutAll: ' selector: #'. self writeOriginalMethodSelectorPlaceholder: args on: str. str cr.
str nextPutAll: ' class: #OriginalMethodClass'; cr.
str nextPutAll: ' arguments: args'; cr.
str nextPutAll: ' sender: self sender.'; cr; cr.
str nextPutAll: ' result := super '.
self writeOriginalMethodSendPlaceholder: args on: str.
str nextPutAll: '.'; cr; cr.
str nextPutAll: ' SSDefaultMessageTracer traceSendReturn: self '; cr.
str nextPutAll: ' selector: #'. self writeOriginalMethodSelectorPlaceholder: args on: str. str cr.
str nextPutAll: ' class: #OriginalMethodClass'; cr.
str nextPutAll: ' arguments: args'; cr.
str nextPutAll: ' sender: self sender'; cr.
str nextPutAll: ' result: result.'; cr; cr.
str nextPutAll: ' ^result.'; cr.
str nextPutAll: ' ].'; cr.! !
!SSErrorHandlingTraceFactory methodsFor: 'prototypes' !
optimizedPrototype
SSDefaultMessageTracer isNil ifTrue: [
^super original.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original
class: #OriginalMethodClass
sender: self sender.
[
result := super original.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original
class: #OriginalMethodClass
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original
class: #OriginalMethodClass
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:
class: #OriginalMethodClass
with: a1
sender: self sender.
[
result := super original: a1.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:
class: #OriginalMethodClass
with: a1
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:
class: #OriginalMethodClass
with: a1
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1 w: a2
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:
class: #OriginalMethodClass
with: a1 with: a2
sender: self sender.
[
result := super original: a1 w: a2.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:
class: #OriginalMethodClass
with: a1 with: a2
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:
class: #OriginalMethodClass
with: a1 with: a2
sender: self sender
result: result.
^result.
].!
optimizedPrototype: a1 w: a2 w: a3
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3.
] ifFalse: [
| result |
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:
class: #OriginalMethodClass
with: a1 with: a2 with: a3
sender: self sender.
[
result := super original: a1 w: a2 w: a3.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:
class: #OriginalMethodClass
with: a1 with: a2 with: a3
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:
class: #OriginalMethodClass
with: a1 with: a2 with: a3
sender: self sender
result: result.
^result.
].!
prototype
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original.
] ifFalse: [
| args result |
args := Array new: 0.
SSDefaultMessageTracer traceSendBegin: self
selector: #original
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1.
] ifFalse: [
| args result |
args := Array new: 1.
args at: 1 put: a1.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2.
] ifFalse: [
| args result |
args := Array new: 2.
args at: 1 put: a1.
args at: 2 put: a2.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3.
] ifFalse: [
| args result |
args := Array new: 3.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4.
] ifFalse: [
| args result |
args := Array new: 4.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5.
] ifFalse: [
| args result |
args := Array new: 5.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6.
] ifFalse: [
| args result |
args := Array new: 6.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7.
] ifFalse: [
| args result |
args := Array new: 7.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8.
] ifFalse: [
| args result |
args := Array new: 8.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9.
] ifFalse: [
| args result |
args := Array new: 9.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10.
] ifFalse: [
| args result |
args := Array new: 10.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11.
] ifFalse: [
| args result |
args := Array new: 11.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12.
] ifFalse: [
| args result |
args := Array new: 12.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13.
] ifFalse: [
| args result |
args := Array new: 13.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14.
] ifFalse: [
| args result |
args := Array new: 14.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15.
] ifFalse: [
| args result |
args := Array new: 15.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16.
] ifFalse: [
| args result |
args := Array new: 16.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17.
] ifFalse: [
| args result |
args := Array new: 17.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18.
] ifFalse: [
| args result |
args := Array new: 18.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19.
] ifFalse: [
| args result |
args := Array new: 19.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
args at: 19 put: a19.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].!
prototype: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20
" Auto generated method for tracing - method source may be mismatching "
SSDefaultMessageTracer isNil ifTrue: [
^super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20.
] ifFalse: [
| args result |
args := Array new: 20.
args at: 1 put: a1.
args at: 2 put: a2.
args at: 3 put: a3.
args at: 4 put: a4.
args at: 5 put: a5.
args at: 6 put: a6.
args at: 7 put: a7.
args at: 8 put: a8.
args at: 9 put: a9.
args at: 10 put: a10.
args at: 11 put: a11.
args at: 12 put: a12.
args at: 13 put: a13.
args at: 14 put: a14.
args at: 15 put: a15.
args at: 16 put: a16.
args at: 17 put: a17.
args at: 18 put: a18.
args at: 19 put: a19.
args at: 20 put: a20.
SSDefaultMessageTracer traceSendBegin: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender.
[
result := super original: a1 w: a2 w: a3 w: a4 w: a5 w: a6 w: a7 w: a8 w: a9 w: a10 w: a11 w: a12 w: a13 w: a14 w: a15 w: a16 w: a17 w: a18 w: a19 w: a20.
] on: SSDefaultMessageTracer errorClass do: [ :err |
SSDefaultMessageTracer traceSendError: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
error: err.
err pass.
].
SSDefaultMessageTracer traceSendReturn: self
selector: #original:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:
class: #OriginalMethodClass
arguments: args
sender: self sender
result: result.
^result.
].! !
!SSErrorHandlingTraceFactory methodsFor: 'private' !
patchOptimizedTracingMethod: compiledMethod prototype: prototype
| selectorPlaceholder |
selectorPlaceholder := self originalSelector: compiledMethod argumentCount.
" Replace the SSDefaultMessageTracer variable in the method. "
self ASSERT: (prototype at: 1) == (Smalltalk associationAt: #SSDefaultMessageTracer).
prototype at: 1 put: tracer.
" Replace the symbol used to send to the trace messages "
self ASSERT: (prototype at: 2) == selectorPlaceholder.
prototype at: 2 put: compiledMethod selector.
" Replace the name of the class where the original method is implemented "
self ASSERT: (prototype at: 3) == #OriginalMethodClass.
prototype at: 3 put: compiledMethod classField symbol.
" Replace the selector of the method for the <super> send "
self ASSERT: (prototype at: 13) == selectorPlaceholder.
prototype at: 13 put: compiledMethod selector.!
patchTracingMethod: compiledMethod prototype: prototype
| selectorPlaceholder |
selectorPlaceholder := self originalSelector: compiledMethod argumentCount.
" Replace the SSDefaultMessageTracer variable in the method. "
self ASSERT: (prototype at: 1) == (Smalltalk associationAt: #SSDefaultMessageTracer).
prototype at: 1 put: tracer.
" Replace the symbol used to send to the trace messages "
self ASSERT: (prototype at: 3) == selectorPlaceholder.
prototype at: 3 put: compiledMethod selector.
" Replace the name of the class where the original method is implemented "
self ASSERT: (prototype at: 4) == #OriginalMethodClass.
prototype at: 4 put: compiledMethod classField symbol.
" Replace the selector of the method for the <super> send "
self ASSERT: (prototype at: 14) == selectorPlaceholder.
prototype at: 14 put: compiledMethod selector.
! !
!SSErrorHandlingTraceFactory class methodsFor: 'development' !
writeMethodPrototype: args on: str
self writeMethodPrototypeProlog: args on: str.
str nextPutAll: ' SSDefaultMessageTracer isNil ifTrue: ['; cr.
str nextPutAll: ' ^super '.
self writeOriginalMethodSendPlaceholder: args on: str.
str nextPutAll: '.'; cr.
str nextPutAll: ' ] ifFalse: ['; cr.
str nextPutAll: ' | args result |'; cr.
str nextPutAll: ' args := Array new: ', args asString, '.'; cr.
1 to: args do: [ :i | str nextPutAll: ' args at: ', i asString, ' put: a', i asString, '.'; cr ].
str cr.
str nextPutAll: ' SSDefaultMessageTracer traceSendBegin: self '; cr.
str nextPutAll: ' selector: #'. self writeOriginalMethodSelectorPlaceholder: args on: str. str cr.
str nextPutAll: ' class: #OriginalMethodClass'; cr.
str nextPutAll: ' arguments: args'; cr.
str nextPutAll: ' sender: self sender.'; cr; cr.
str nextPutAll: ' ['; cr.
str nextPutAll: ' result := super '.
self writeOriginalMethodSendPlaceholder: args on: str.
str nextPutAll: '.'; cr.
str nextPutAll: ' ] on: SSDefaultMessageTracer errorClass do: [ :err |'; cr.
str nextPutAll: ' SSDefaultMessageTracer traceSendError: self '; cr.
str nextPutAll: ' selector: #'. self writeOriginalMethodSelectorPlaceholder: args on: str. str cr.
str nextPutAll: ' class: #OriginalMethodClass'; cr.
str nextPutAll: ' arguments: args'; cr.
str nextPutAll: ' sender: self sender'; cr.
str nextPutAll: ' error: err.'; cr.
str nextPutAll: ' err pass.'; cr.
str nextPutAll: ' ].'; cr; cr.
str nextPutAll: ' SSDefaultMessageTracer traceSendReturn: self '; cr.
str nextPutAll: ' selector: #'. self writeOriginalMethodSelectorPlaceholder: args on: str. str cr.
str nextPutAll: ' class: #OriginalMethodClass'; cr.
str nextPutAll: ' arguments: args'; cr.
str nextPutAll: ' sender: self sender'; cr.
str nextPutAll: ' result: result.'; cr; cr.
str nextPutAll: ' ^result.'; cr.
str nextPutAll: ' ].'; cr.! !
!SSMessageTracer methodsFor: 'tracing-begin' !
traceSendBegin: anObject selector: aSymbol class: aClassSymbol arguments: anArray sender: aSenderObject
level := level + 1.
!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol sender: aSenderObject
level := level + 1.
!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 sender: aSenderObject
level := level + 1.
!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 sender: aSenderObject
level := level + 1.
!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 with: arg3 sender: aSenderObject
level := level + 1.
! !
!SSMessageTracer methodsFor: 'tracing-end' !
traceSendReturn: anObject selector: aSymbol class: aClassSymbol arguments: anArray sender: aSenderObject result: aResult
level := level - 1.
!
traceSendReturn: anObject selector: aSymbol class: aClassSymbol sender: aSenderObject result: aResult
level := level - 1.
!
traceSendReturn: anObject selector: aSymbol class: aClassSymbol with: arg1 sender: aSenderObject result: aResult
level := level - 1.
!
traceSendReturn: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 sender: aSenderObject result: aResult
level := level - 1.
!
traceSendReturn: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 with: arg3 sender: aSenderObject result: aResult
level := level - 1.! !
!SSMessageTracer methodsFor: 'tracing-error' !
traceSendError: anObject selector: aSymbol class: aClassSymbol arguments: anArray sender: aSenderObject error: anError
level := level - 1.
!
traceSendError: anObject selector: aSymbol class: aClassSymbol sender: aSenderObject error: anError
level := level - 1.!
traceSendError: anObject selector: aSymbol class: aClassSymbol with: arg1 sender: aSenderObject error: anError
level := level - 1.
!
traceSendError: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 sender: aSenderObject error: anError
level := level - 1.
!
traceSendError: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 with: arg3 sender: aSenderObject error: anError
level := level - 1.
! !
!SSMessageTracer methodsFor: 'private' !
errorClass
^Error.!
initialize
level := 0.
super initialize.! !
!SSMessageTracer class methodsFor: 'as yet unclassified' !
new
^super new initialize; yourself.! !
!SSSimpleMessageTracer methodsFor: 'tracing-begin' !
traceSendBegin: anObject selector: aSymbol class: aClassSymbol arguments: anArray sender: aSenderObject
tracing == true ifTrue: [ ^self ].
tracing := true.
level := level + 1.
[
[
| str |
str := WriteStream on: (String new: 150).
level - 1 timesRepeat: [ str tab ].
aClassSymbol printOn: str.
str nextPutAll: '>>'.
aSymbol printOn: str.
str space.
anArray printOn: str.
str cr.
self outputTrace: str.
] on: Error do: [ ].
] ensure: [ tracing := false ].!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol sender: aSenderObject
tracing == true ifTrue: [ ^self ].
tracing := true.
level := level + 1.
[
[
| str |
str := WriteStream on: (String new: 150).
level - 1 timesRepeat: [ str tab ].
aClassSymbol printOn: str.
str nextPutAll: '>>'.
aSymbol printOn: str.
str cr.
self outputTrace: str.
] on: Error do: [ ].
] ensure: [ tracing := false ].!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 sender: aSenderObject
tracing == true ifTrue: [ ^self ].
tracing := true.
level := level + 1.
[
[
| str |
str := WriteStream on: (String new: 150).
level - 1 timesRepeat: [ str tab ].
aClassSymbol printOn: str.
str nextPutAll: '>>'.
aSymbol printOn: str.
str nextPutAll: ' ('.
arg1 printOn: str.
str nextPutAll: ')'.
str cr.
self outputTrace: str.
] on: Error do: [ ].
] ensure: [ tracing := false ].!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 sender: aSenderObject
tracing == true ifTrue: [ ^self ].
tracing := true.
level := level + 1.
[
[
| str |
str := WriteStream on: (String new: 150).
level - 1 timesRepeat: [ str tab ].
aClassSymbol printOn: str.
str nextPutAll: '>>'.
aSymbol printOn: str.
str nextPutAll: ' ('.
arg1 printOn: str.
str space.
arg2 printOn: str.
str nextPutAll: ')'.
str cr.
self outputTrace: str.
] on: Error do: [ ].
] ensure: [ tracing := false ].!
traceSendBegin: anObject selector: aSymbol class: aClassSymbol with: arg1 with: arg2 with: arg3 sender: aSenderObject
tracing == true ifTrue: [ ^self ].
tracing := true.
level := level + 1.
[
[
| str |
str := WriteStream on: (String new: 150).
level - 1 timesRepeat: [ str tab ].
aClassSymbol printOn: str.
str nextPutAll: '>>'.
aSymbol printOn: str.
str nextPutAll: ' ('.
arg1 printOn: str.
str space.
arg2 printOn: str.
str space.
arg3 printOn: str.
str nextPutAll: ')'.
str cr.
self outputTrace: str.
] on: Error do: [ ].
] ensure: [ tracing := false ].! !
!SSSimpleMessageTracer methodsFor: 'private' !
outputTrace: stream
Transcript show: stream contents.! !
!SSTraceFactory methodsFor: 'private' !
createMethodDictionary: methodDictionaryArray for: aClass upToClass: aSuperclass
| md tracingClass |
md := MethodDictionary new.
self installTracingMethods: methodDictionaryArray in: md upToClass: aSuperclass.
" Next two lines are <the magic> that make it possible for <super> sends to work correctly. "
tracingClass := self createTracingClass: aClass.
md do: [ :compiledMethod | compiledMethod classField: tracingClass ].
^md.!
createTracingClass: aClass
| cls |
cls := aClass objectShallowCopy.
self ASSERT: cls ~~ aClass.
" Unfortunately, too difficult to change that info for meta classes "
cls isMetaClass ifFalse: [ cls newNameSymbol: ('Tracing', cls name asString) asSymbol ].
" Now, fix the superclass so method lookup for <super> works as expected. "
" NB: They still share the same method dictionary array, but we don't care - we'll not use it. "
cls superclass: aClass.
^cls.!
getPrototype: args
^(self class compiledMethodAt: (self optimizedPrototypeSelector: args))
ifNil: [ self class compiledMethodAt: (self prototypeSelector: args) ].!
initialize
tracer := #Tracer -> SSSimpleMessageTracer new.
super initialize.!
installTracingMethod: compiledMethod in: methodDictionary
| args prototype tracingMethod |
( #( vmInterrupt: doesNotUnderstand: sender ) includes: compiledMethod selector )
ifTrue: [ ^self " Don't trace those - too dangerous " ].
" Determine number of method arguments. "
args := compiledMethod argumentCount.
" And determine if this is a special binary selector ... currently we only support keywords "
( args = (Message numberOfArgumentsFor: compiledMethod selector) and: [ args = (compiledMethod selector occurrencesOf: $: ) ] )
ifFalse: [ ^self ].
" Get the prototype method for the requested number of arguments. "
prototype := self getPrototype: args.
prototype isNil
ifTrue: [ ^self ].
" Copy the prototype and fix the literla array "
tracingMethod := prototype copy.
" Fix the prototype by replacing literals in it. "
(tracingMethod selector asString indexOfString: 'optimized') = 1
ifTrue: [ self patchOptimizedTracingMethod: compiledMethod prototype: tracingMethod ]
ifFalse: [ self patchTracingMethod: compiledMethod prototype: tracingMethod ].
" Rename it, and clear the JIT cache. "
tracingMethod selector: compiledMethod selector.
tracingMethod primitive: nil.
" Add it to the method dictionary array. "
methodDictionary at: tracingMethod selector put: tracingMethod.
!
installTracingMethods: mdaOrMd in: methodDictionary upToClass: aClass
mdaOrMd isArray ifTrue: [
mdaOrMd do: [ :md |
(self installTracingMethods: md in: methodDictionary upToClass: aClass)
ifFalse: [ ^false " Terminate " ].
].
^true. " Continue "
] ifFalse: [
mdaOrMd do: [ :compiledMethod |
(methodDictionary includesKey: compiledMethod selector)
ifFalse: [ self installTracingMethod: compiledMethod in: methodDictionary ].
].
^aClass isNil | (mdaOrMd classField ~= aClass). " <true> continue, <false> terminate "
].!
optimizedPrototypeSelector: args
| str |
str := WriteStream on: String new.
self class writePrototypeMethodSelector: args on: str.
str := str contents.
str at: 1 put: str first asUppercase.
^('optimized', str) asSymbol.!
originalSelector: args
| str |
str := WriteStream on: String new.
self class writeOriginalMethodSelectorPlaceholder: args on: str.
^str contents asSymbol.!
patchOptimizedTracingMethod: compiledMethod prototype: prototype
self implementedBySubclass.!
patchTracingMethod: compiledMethod prototype: prototype
self implementedBySubclass.!
prototypeSelector: args
| str |
str := WriteStream on: String new.
self class writePrototypeMethodSelector: args on: str.
^str contents asSymbol.! !
!SSTraceFactory methodsFor: 'public' !
activateTracingFor: anObject
self activateTracingFor: anObject upToClass: nil.!
activateTracingFor: anObject upToClass: aClass
| mda md |
mda := anObject methodDictionaryArray.
md := self createMethodDictionary: mda for: anObject class upToClass: aClass.
anObject propertyAt: self put: md.
anObject addBehavior: md.!
deactivateTracingFor: anObject
| md |
md := anObject propertyAt: self ifAbsent: [ nil ].
md isNil ifTrue: [ ^self ].
anObject removePropertyAt: self.
anObject removeBehavior: md.!
tracer
^tracer value.!
tracer: anSSMessageTracer
tracer value: anSSMessageTracer.! !
!SSTraceFactory class methodsFor: 'development' !
createMethodPrototypeSource: args
| str |
str := WriteStream on: String new.
self writeMethodPrototype: args on: str.
^str contents.!
writeMethodPrototype: args on: str
self implementedBySubclass.!
writeMethodPrototypeProlog: args on: str
str nextPutAll: 'prototype'.
(1 to: args) do: [ :argIdx |
str nextPutAll: ': a', argIdx asString.
] andBetweenDo: [
str nextPutAll: ' w'.
].
str cr; cr; nextPutAll: ' " Auto generated method for tracing - method source may be mismatching " '; cr; cr.!
writeOriginalMethodSelectorPlaceholder: args on: str
str nextPutAll: 'original'.
(1 to: args) do: [ :na | str nextPutAll: ':' ] andBetweenDo: [ str nextPutAll: 'w' ].
!
writeOriginalMethodSendPlaceholder: args on: str
str nextPutAll: 'original'.
(1 to: args) do: [ :argIdx |
str nextPutAll: ': a', argIdx asString.
] andBetweenDo: [
str nextPutAll: ' w'.
].!
writePrototypeMethodSelector: args on: str
str nextPutAll: 'prototype'.
(1 to: args) do: [ :argIdx | str nextPutAll: ':' ] andBetweenDo: [ str nextPutAll: 'w' ].! !
!SSTraceFactory class methodsFor: 'public' !
current
current isNil ifTrue: [ current := self new ].
^current.!
new
^super new initialize; yourself.! !
!Object methodsFor: 'tracing' !
ssActivateTracing
SSDirectTraceFactory current activateTracingFor: self.
^self.! !
!Object methodsFor: 'tracing' !
ssActivateTracingUpToClass: aClass
SSDirectTraceFactory current activateTracingFor: self upToClass: aClass.
^self.! !
!Object methodsFor: 'tracing' !
ssDeactivateTracing
SSDirectTraceFactory current deactivateTracingFor: self.
^self.! !
[/codesyntax]