Am 15.06.2011 um 10:39 schrieb David Chisnall: > On 14 Jun 2011, at 23:19, Nat! wrote: > >> Am 14.06.2011 um 23:47 schrieb David Chisnall: >> >>> On 14 Jun 2011, at 22:38, Nat! wrote: >>> >>>> Hmm interesting, though I don't see offhand, why dividing what >>>> objc_msgSend does into separate steps makes it inherently more portable. >>>> I will have to look into my code, to see if its feasible to roll my own >>>> objc_msgSend, (because I use it a lot as I found out :) ). >>> >>> objc_msgSend() is a trampoline function. It must pass all of its arguments >>> to the called IMP. This is not possible in C. Apple implements a version >>> of it in assembly for every calling convention, for every architecture, and >>> for every platform that they support (currently, this comes to about a >>> dozen implementations, and they support a very narrow range of platforms >>> compared to GNUstep). >>> >> Ah I see. I hope, that if I reduce the scope to a small fixed number of id >> parameters, I can get by. > > It's really better to just call class_getMethodImplementation() and call the > returning IMP. This code will work everywhere, and the performance > difference between using it and using objc_msgSend() is tiny.
It's more of an experiment porting my stuff to GNUstep, so your advice nonwithstanding I think my plan, will work, because I believe I only use it objc_msgSend for simple calls (max. one or two id parameters and return value). Otherwise I would have to change a lot of source. > >>>> Ah and one more question, regarding forwarding is __objc_msg_forward >>>> (instead of __objc_msg_forward2) ever really used or can I ignore it, when >>>> I run atop a current runtime ? >>> The forwarding hooks that are used depend on the runtime. See >>> GSFFIInvocation.m for how they are all used. >> >> Is there some exported #define (like OBJC_API_VERSION) that could be >> checked, which runtime I am compiling against ? > > Not really. GCC 4.6 and later define something. The GNUstep Runtime defines > __GNUSTEP_RUNTIME__ in objc/runtime.h and then provides a set of capability > flags in objc/caps.h to let you check at compile time and run time which > capabilities the runtime that you are using supports. Hmm, this could indicate that I _do_ have the wrong set of headers. In /usr/lib/gcc/i586-suse-linux/4.5/include/objc I neither see caps.h nor runtime.h. But it's not a big problem, for my experiments I can live without them. > > > ... then you are almost certainly doing something very, very wrong. > Hey, I would prefer to think of it as almost certainly doing something very, very clever :) Thanks for all the help Nat! ------------------------------------------------------ A good dog, though a fool. Who wants a smart dog! -- R.A. Lafferty _______________________________________________ Discuss-gnustep mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnustep
