On 06 Jan 2008, at 11:39, Felipe Monteiro de Carvalho wrote:
I read the corresponding assembler code, but it's *very* confusing.
The order in which CALL's are made is:
// NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
call L_objc_getClass$stub
call L_objc_msgSend$stub
call L_objc_msgSend$stub
// The 2 simple procedures afaik
call L_NSApplicationLoad$stub
call L_NSRunAlertPanel$stub
// [pool release];
call L_objc_msgSend$stub
So, getting which procedures are called where isn't that hard, but I
couldn't understand what is filled on the parameters. Any ideas?
As the API explains, objc_getClass has one parameter: a char* pointing
to the class name. In this case, the class name is
"NSAutoreleasePool", and the first parameter is indeed simply a
pointer to that (null terminated) string.
objc_msgSend wants as first parameter the target (in this case: the
result of objc_getClass), then the selector for the method to call (a
selector is simply a char** pointing to the method name here, but for
forward compatibility it is safer to call
sel_registerName(fullyQualifiedMethodName) and use its result;
optimizations can always be done later)
etc.
By the way, what does the instruction "leal" do?? I don't remember
anything similar from intel intructions tables:
leal L_OBJC_SELECTOR_REFERENCES_0-"L00000000001$pb"(%ebx), %eax
lea means "load effective address". The "l" suffix in AT&T assembler
syntax means "long", which always corresponds to "32 bit value".
The construct above is simple PIC. Just search for the symbol before
the "-" to find out what it references.
Jonas
_______________________________________________
fpc-devel maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel