Estoy buscando una forma de hacer que un NSInvocation
invoque un IMP
específico. Por defecto, invoca el IMP
"más bajo" que puede encontrar (es decir, la versión reemplazada más recientemente), pero estoy buscando una forma de invocar un IMP
desde un nivel superior en la cadena de herencia. El IMP
que deseo invocar se determina dinámicamente, o de lo contrario podría usar la palabra clave super
o algo así.Hacer que NSInvocation invoque un IMP específico
Mi idea era utilizar el mecanismo -forwardInvocation:
para capturar un mensaje (fácil y ya trabajan) y luego alterar el IMP
por lo que pasa a un método que no es ni la aplicación ni super
aplicación del descendiente más lejano. (difícil)
Lo único que he encontrado que se acerca remotamente es AspectObjectiveC, pero eso requiere libffi, lo que hace que no sea compatible con iOS. Idealmente me gustaría que esto sea multiplataforma.
¿Alguna idea?
exención de responsabilidad: sólo estoy experimentando
Probando idea de @ bbum de una función de trampolín
así que creo que tengo cosas en su mayoría creados; Tengo la siguiente cama elástica que se agrega correctamente a través de class_addMethod()
, y que se pone entré:
id dd_trampolineFunction(id self, SEL _cmd, ...) {
IMP imp = [self retrieveTheProperIMP];
self = [self retrieveTheProperSelfObject];
asm(
"jmp %0\n"
:
: "r" (imp)
);
return nil; //to shut up the compiler
}
He verificado que tanto el auto adecuado y la IMP adecuada son las cosas correctas antes de la JMP, y el parámetro _cmd
también está entrando correctamente. (en otras palabras, agregué correctamente este método).
Sin embargo, algo está sucediendo. A veces me encuentro saltando a un método (generalmente no el correcto) con un nil self
y _cmd
. Otras veces, simplemente me estrellaré en el medio de la nada con un EXC_BAD_ACCESS. Ideas? (Ha pasado mucho tiempo desde que hice algo en ensamblaje ...) Estoy probando esto en x86_64.
He actualizado mi pregunta con mi función de trampolín (que no está funcionando del todo). Te agradecería si pudieras echarle un vistazo. –
No puede hacerlo desde C ... tendrá que ser ensamblado y tendrá que jugar un poco con el IMP correcto. – bbum