Ah, so the lookups are done once when the method is compiled and then stored
in the CompiledMethod...
My vision is to write something like:
cannedNow := DateAndTime stub: #now; andReturn: [ DateAndTime year: 2011
month: 12 day: 24 hour: 12 minute: 34 second: 55 ].
testableClass := MyClass usingDouble: cannedNow.
The first line seems easy, and for the second line, I have so far (very
rough, but working):
| class copy |
class := MyClass.
copy := MyClass copy.
copy methods do: [ :m | | classRef |
(m hasLiteralSuchThat: [ :l | ((l isKindOf: Association) and: [
l key =
#DateAndTime])])
ifTrue: [ | newMeth refIndex |
newMeth := copy methodDictionary at: m selector
put: m copy.
refIndex := newMeth indexOfLiteralSuchThat: [
:l | ((l isKindOf:
Association) and: [ l key = #DateAndTime])].
newMeth literalAt: refIndex put:
#DateAndTime->MockedClass ] ].
^ copy.
Where CompiledMethod>>indexOfLiteralSuchThat: aBlock
"Answer the literal index of the argument, literal, or zero if none."
2 to: self numLiterals - 1 "exclude superclass + selector/properties"
do:
[:index |
(aBlock value: (self objectAt: index)) ifTrue: [^index - 1]].
^0
Thanks again.
Sean
--
View this message in context:
http://forum.world.st/Stubbing-class-side-methods-tp3674065p3676637.html
Sent from the Pharo Smalltalk mailing list archive at Nabble.com.