[Vm-dev] Problem with Proxies, objects and MethoDict
siguctua at gmail.com
Tue Sep 28 21:12:02 UTC 2010
Here it is.
Just be aware, that its not intercepting all messages.
Some messages like #== or #class is early bound by compiler/VM,
so even if you redefine them, their behavior won't be changed.
(I forgot where to get the list of these exceptional selectors).
Smalltalk specialSelectors seems like not the same thing.
On 28 September 2010 23:48, Bert Freudenberg <bert at freudenbergs.de> wrote:
> On 28.09.2010, at 22:29, Mariano Martinez Peck wrote:
> Hi folks. I am trying to do something and I found a VM crash. Suppose I want to swap out a class, do a become with a proxy (that with the DNU will load the class back). In addition, I have instances of the swapped class.
> Example of code (will crash in the last line):
> o := MyObject new.
> o foo: 123.
> p := ClassProxy new.
> p become: MyObject.
> o == nil.
> o foo.
> My Object just extends Object, has an instVar 'foo', and implements the accessors.
> ClassProxy implements:
> become: aClass
> className := aClass name.
> aClass fileOut.
> super become: aClass
> doesNotUnderstand: aMessage
> | reloadedClass |
> (FileStream fileNamed: className, '.st') fileIn.
> reloadedClass := Smalltalk at: className.
> self becomeForward: reloadedClass.
> ^aMessage sendTo: reloadedClass
> So....does someone know why the crash?
> Looks like o's class pointer does not point to a class after the become. When the VM tries to lookup #foo in o's class it crashes.
> how can I solve it ?
> I'd say you cannot get rid of a class if there are still instances of it. You can stub out the class however. If the method dict is nil, the VM will send cannotInterpret: if you send a message to an instance. You should be able to use that instead of #doesNotUnderstand:.
> - Bert -
Igor Stasenko AKA sig.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 1114 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20100929/390f5294/MessageCatchingProxy.obj
More information about the Vm-dev