hi Pavel,
I also needed to intercept these two messages with my use of proxies in SqueakElib. I have a vm patch that pass through those bytecodes here: http://kilana.unibe.ch:8888/squeakelib/SqueakElibVM-rww.1.mcz
That blocks the bytecodes but there are still three methods you need. I have attached that file. Note that I hand edited the order of methods to put #basicEquivalence: before #==.
One other class of methods that need consideration are those of the #ifTrue:ifFalse: varients. If the receiver isn't a boolean, you get a MustBeBoolean (or whatever it is) error. Tim mentioned this to me and said that changing these could have a noticable impact on the system. :-( Maybe we could change the MustBeBoolean to a msg send, like #cannotInterpret or doesNotUnderstand:. Then we could catch it. I haven't attempted any solution for this case.
Rob
On Wednesday, June 30, 2004, at 12:34 AM, Pavel Křivánek wrote:
Hi all,
Monticello has a problem with this class construction:
ProtoObject subclass: #MyClass instanceVariableNames: 'object' classVariableNames: '' poolDictionaries: '' category: 'MyClasses. MyClass superclass: nil
It forgets the last line with superclass specification.
I'm using it for proxy objects. Instances of MyClass have one variable to store a real receiver of messages. MyClass resends messages using doesNotUnderstand mechanism.
doesNotUnderstand: aMessage
^ aMessage sendTo: object.
It works well but there is one problem - Squeak uses optimalization of some message calls. For example, message #class is never called, because Squeak uses special bytecode 199 (bytecodePrimClass). Real class of proxy object is returned instead of receiver class.
Message #isVariable returns wrong value for arrays, large integers etc. So I have made a variable subclass of MyClass and I use it for proxy object of variable receivers. It works well too.
I used this proxy objects for a dictionary and its instance variables including tally. This variable stores a size of dictionary. When Squeak makes a copy of dictionary array, he sends tally like a parameter in constructor of new array, but primitive method fails. VM wants an integer instance strictly.
Any ideas?
Pavel