[Pkg] The Trunk: Kernel-eem.1161.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Mar 15 02:16:43 UTC 2018
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1161.mcz
==================== Summary ====================
Name: Kernel-eem.1161
Author: eem
Time: 14 March 2018, 7:16:26.289237 pm
UUID: 53deb012-ffaa-41f5-a0d0-7e8ddfb4bbb1
Ancestors: Kernel-eem.1160
Reimplement CompiledMethod>>messages[Do:] so that they function in the full blocks regime (i.e. they include messages in block methods).
=============== Diff against Kernel-eem.1160 ===============
Item was added:
+ ----- Method: CompiledCode>>messages (in category 'scanning') -----
+ messages
+ "Answer a Set of all the message selectors sent by this method."
+
+ | encoderClass scanner aSet |
+ encoderClass := self encoderClass.
+ aSet := Set new.
+ scanner := InstructionStream on: self.
+ scanner scanFor: [ :x |
+ | selector |
+ (selector := encoderClass selectorToSendOrItselfFor: scanner in: self at: scanner pc) == scanner
+ ifFalse:
+ [aSet add: selector]
+ ifTrue:
+ [(encoderClass blockMethodOrNilFor: scanner in: self at: scanner pc) ifNotNil:
+ [:blockMethod| aSet addAll: blockMethod messages]].
+ false "keep scanning" ].
+ ^aSet!
Item was added:
+ ----- Method: CompiledCode>>messagesDo:encoderClass:visitedSet: (in category 'private') -----
+ messagesDo: aBlock encoderClass: encoderClass visitedSet: visitedSet
+ "The inner engine for messagesDo:"
+
+ | scanner |
+ scanner := InstructionStream on: self.
+ scanner scanFor: [ :x |
+ | selector |
+ (selector := encoderClass selectorToSendOrItselfFor: scanner in: self at: scanner pc) == scanner
+ ifFalse:
+ [(visitedSet ifAbsentAdd: selector) ifTrue:
+ [aBlock value: selector]]
+ ifTrue:
+ [(encoderClass blockMethodOrNilFor: scanner in: self at: scanner pc) ifNotNil:
+ [:blockMethod|
+ blockMethod messagesDo: aBlock encoderClass: encoderClass visitedSet: visitedSet]].
+ false "keep scanning" ]!
Item was changed:
----- Method: CompiledCode>>refersTo:bytecodeScanner:thorough: (in category 'literals') -----
refersTo: literal bytecodeScanner: scanBlockOrNil thorough: thorough
"Answer if the receiver refers to the literal. If the scan block is non-nil, then
use it to find the literal in bytecode. If thorough is true, dive down into
literal arrays and method properties to locate references to the literal there-in."
2 to: ((self isCompiledBlock or: [thorough])
+ ifTrue: [self numLiterals] "exclude outerCode or methodClass"
+ ifFalse: [self numLiterals - 1]) "exclude selector/properties and methodClass"
- ifTrue: [self numLiterals ] "exclude outerCode or methodClass"
- ifFalse: [self numLiterals - 1]) "exclude selector/properties and methodClass"
do: [:i| | lit |
lit := self objectAt: i.
(literal == lit or: [literal literalEqual: lit]) ifTrue: [^true]. "== for Float bindingOf: #NaN since NaN ~= NaN"
lit isCompiledCode
ifTrue:
[(lit refersTo: literal bytecodeScanner: scanBlockOrNil thorough: thorough) ifTrue:
[^true]]
ifFalse:
[thorough ifTrue:
[lit isVariableBinding
ifTrue:
[literal == lit key ifTrue: [^true]]
ifFalse:
[(lit isArray
and: [(lit hasLiteral: literal)
or: [literal isVariableBinding
and: [literal key isSymbol
and: [lit hasLiteral: literal key]]]]) ifTrue:
[^true]]]]].
scanBlockOrNil ifNotNil:
[(self scanFor: scanBlockOrNil) ifTrue:
[^true]].
^false!
Item was changed:
----- Method: CompiledMethod>>messagesDo: (in category 'scanning') -----
messagesDo: aBlock
"Evaluate aBlock exactly once with all the message selectors sent by me."
+ self isQuick ifFalse:
+ [self messagesDo: aBlock
+ encoderClass: self encoderClass
+ visitedSet: IdentitySet new]!
- | scanner aSet |
- self isQuick ifTrue: [ ^self ].
- scanner := InstructionStream on: self.
- scanner scanFor: [ :x |
- | selector |
- (selector := scanner selectorToSendOrSelf) == scanner ifFalse: [
- ((aSet ifNil: [ aSet := IdentitySet new ]) ifAbsentAdd: selector) ifTrue: [
- aBlock value: selector ] ].
- false "keep scanning" ]!
Item was added:
+ ----- Method: InstructionStream>>blockMethodOrNil (in category 'scanning') -----
+ blockMethodOrNil
+ "If this instruction is a full block creation, answer the block's method, otherwise nil."
+
+ | method |
+ method := self method.
+ ^method encoderClass blockMethodOrNilFor: self in: method at: pc!
More information about the Packages
mailing list