kikoGregoris wrote:
> Hola Carlos, gente
>
> Hay algo curioso que pasa cuando recupero un método perdido.
>
> Luego de recuperarlo del change.log, yo hago un #sender y aparecen
> todas las referencias al mensaje.
> Me pregunto. Si los fuentes estan perdidos porque encuentra los
> sender del mensaje ?.
>
Ya adivinaste la respuesta... el mecanismo que busca los senders NO usa
el código fuente.
Hay varias razones para eso, pero supongo que lo que más pesó es la
performance.
Fijate que para localizar senders dentro del source, tendrías que
parsearlo de nuevo. Si no, no podrías distinguir qué son mensajes de
pedazos de strings o identificadores de variables. Eso sería muy costoso.
Lo que usan esas herramientas, normalmente, es el literalFrame de los
CompiledMethod's. Un envío de mensaje deja el selector en el
literalFrame (*), ya que es un argumento que se apilará para el bytecode
de envío de mensaje. Y ahí se buscan los senders. Como en tu imagen los
compiled methods están bien, esto funciona correctamente.
(*) Hay varias excepciones a esto, por ejemplo el #ifTrue:, pero es otro
tema.
> Si esto fuera así, tendría que sospechar que se puede recuperar el
> sourceString de una manera mas facil, que desde el change.log.
>
No, la otra manera sería "decompilarlo" y como te dije, es muy trabajoso
e ingrato.
Saludos
--
Carlos E. Ferro* *
ceferro@... <mailto:ceferro@...>
carloseferrob@... <mailto:carloseferrob@...>