On 7 Nov 2006 at 12:56, kikote gregoris wrote:
[ . . . ]
> ifTrue: [newInstance instVarAt: newPosition put: (oldInstance
> instVarAt: position)].
> position + 1].
>
> Se puede ver claramente que se le esta enviando un mensaje a la vieja
instancia que se llama
> anObsoletXXX.
> Esto se supone no es posible pues el comportamiento fue modificado para que no
entienda mas
> que el #doesNotUnderstand:aMessage.
> Lo cual es cierto si abro un inspector sobre dicha instancia y trato de
enviarle un mensaje.
> Como es posible que dentro de la ejecución si entienda #instVarAt: y sobre un
inspector no ¿?.
Te doy una teoría, no la verifiqué (se puede verificar viendo los bytecodes y/o
literals del compiled method) pero igual es interesante:
Al compilar el método, el #instVarAt: no genera bytecodes para el envío de ese
mensaje, sino que lo pasa a una operación directa de la Máquina Virtual.
Entonces, en la ejecución, como vos decís, los bytecodes andan bien, porque no
se envía el mensaje. En el inspector, vos sí enviás el mensaje (se compila en
otro contexto en el que no se aplica esa conversión del código) y no anda.
> No se si es algo natural lo que ocurra, pues en ciertos momentos me ocurre que
olvido conceptos
> básicos de la TO.
Esto no es un concepto básico de Teoría, sino un detalle de implementación.
Saludos
--
Carlos E. Ferro
Caesar Systems