[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