[Vm-dev] Problem understanding #cannotInterpret
Mariano Martinez Peck
marianopeck at gmail.com
Sun Jan 16 10:50:05 UTC 2011
Hi. There is something I don't understand about #cannotInterpret and maybe
you can help me. Since I am not sure if this is more image side or vm, I did
a cross post, sorry for that.
Context: I am implementing proxies for classes. Since I want that a proxy
loads back the original object when receiving the message #class, I have
removed from the compiler the shortcut bytecode for class, with this:
(ParseNode classVarNamed: 'StdSelectors') removeKey: #class ifAbsent: [].
Now, my testcase is something like this:
| inst proxy |
"This is the simplest test that does the less assert as possible."
inst := ClassWith1Var new.
self assert: inst foo = 'foo'.
proxy := ClassProxyInstVar new.
proxy become: ClassWith1Var.
"here I can send any message, it is just to load back the original
class"
inst basicIdentityHash.
self assert: (inst class == ClassWith1Var).
self assert: inst foo = 'foo'.
ProtoObject subclass: #ClassProxyInstVar
instanceVariableNames: 'superclass methodDict format actualClass'
classVariableNames: ''
poolDictionaries: ''
category: 'Proxies'
ClassProxyInstVar >> initialize
super initialize.
superclass := ProxySuperclass.
methodDict := nil.
actualClass := self
So...with this i can use an instance of ClassProxyInstVar like a class. When
an instance of the class receives a message, the methodDict will be in nil,
and then the VM will send the #cannotInterpret. and there I want to put back
the original class. Then I do:
ProxySuperclass >> cannotInterpret: aMessage
Transcript cr;
show: 'cannotInterpret:';
space;
show: aMessage selector..
self class restore.
^aMessage sendTo: self
Now, this is working, but there is something I DO NOT UNSERSTAND. When I try
to do the "inst basicIdentityHash" the VM will send the #cannotInterpret to
ProxySuperclass because the methodDict was nil in ClassProxyInstVar. Ok,
perfect. What I don't understand is how the method #cannotInterptet can be
run perfeclty in this case, since I am doing a "self class restore" there.
Remember I removed the shortcut bytecode, so #class is sent like any normal
message. So, my question is, when sending "self class", why the VM doesn't
call #cannotInterpter again like it did it when I did " inst
basicIdentityHash." ? in other words...why the VM isn't entering in a loop
? There is something I am not seeing.
Thanks for any help in advance,
Mariano
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20110116/a8e6344f/attachment-0001.htm
More information about the Vm-dev
mailing list