On Mon, Jul 18, 2011 at 2:40 PM, Sean P. DeNigris
Well, the tricky thing with literals is that 0.0 = 0 and 'one' = #one but these are all different literals. That said, it looks like a bug to me. It should surely be
!CompiledMethod methodsFor: 'literals' stamp: 'eem 7/19/2011 09:19'!
hasLiteral: literal
| litClass lit |
"Answer whether the receiver references the argument, literal."
litClass := literal class.
2 to: self numLiterals - 1 do: "exclude superclass + selector/properties"
[:index |
lit := self objectAt: index.
(litClass == lit class and: [literal = lit]) ifTrue: [^true]].
^false! !
!Array methodsFor: 'private' stamp: 'eem 7/19/2011 09:20'!
hasLiteral: literal
"Answer true if literal is identical to any literal in this array, even
if imbedded in further array structure. This method is only intended
for private use by CompiledMethod hasLiteralSymbol:"
| litClass lit |
litClass := literal class.
1 to: self size do:
[:index |
(litClass == (lit := self at: index) class
and: [literal = lit]) ifTrue: [^true].
(Array == lit class
and: [lit hasLiteral: literal]) ifTrue: [^true]].
^false! !
I've run all the tests in a trunk 4.2 before and after and making the above change makes no difference. So I think I'll go ahead and commit the change to Squeak trunk. I'll leave the Pharo folks to apply it there-in. Files attached.