[Vm-dev] Problem with Proxies, objects and MethoDict
Bert Freudenberg
bert at freudenbergs.de
Tue Sep 28 20:48:13 UTC 2010
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
>
> and
>
> 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 -
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20100928/6f685dcf/attachment.htm
More information about the Vm-dev
mailing list