After lots of test, (and some experimental ASM which I quickly discard for my too rusty ASM skills) I found this nice solution build from idea from the sources:
(However an ASM version with a jump would have been much more reliable (regarding argument forwarding, particularly with variable argument list), simple and fast):
-----------------------
DLL_EXPORT retval_t objcsharp_msg_send(id obj, const char* msg, ...)
{
void* args = __builtin_apply_args();
SEL sel = sel_get_uid(msg);
Method_t m = class_get_instance_method (obj->class_pointer, sel);
if(m != NULL)
{
__builtin_return( __builtin_apply(
(void(*)()) m->method_imp,
args,
method_get_sizeof_arguments(m)
));
}
else
{
SEL frwd_sel = sel_get_any_uid("forwardInvocation:");
if(sel && __objc_responds_to (obj, frwd_sel))
{
NSInvocation * i = [[NSInvocation alloc] initWithArgframe: args selector: sel];
[i autorelease];
[obj forwardInvocation:i];
}
else
{
objc_error (obj, OBJC_ERR_UNIMPLEMENTED, "ObjectiveC Runtime error, unimplemented method: %s\n", msg);
}
return 0;
}
}
-----------------------


for info here was the kind of ASM I was looking at:
---- pseudo ASM (failing) ------
retval_t objc_msgSend(id obj, SEL sel, ...)
{
   asm(" pusha \r\n");
   IMP imp = objc_msg_lookup(obj, sel);
   asm(" popa \r\n");
   asm( "longjmp %0 \r\n" : "=p" (imp) );
}
---------------------------------



----- Original Message ----- From: "Andrew Pinski" <[EMAIL PROTECTED]>
To: "Lloyd Dupont" <[EMAIL PROTECTED]>
Cc: "Mike Stump" <[EMAIL PROTECTED]>; <gcc@gcc.gnu.org>
Sent: Friday, May 20, 2005 10:25 AM
Subject: Re: ASM help needed... (on x86/windows/gcc)




On May 19, 2005, at 8:10 PM, Lloyd Dupont wrote:

Simple, I'm building an ObjectiveC binding from .NET.
Basically my .NET code generator transform all objectiveC method in a call to
objc_msg_send() (from the .NET code, which could call C directly)


the problem with _built_in_apply() is you need to know the size of the stack.
and that's a real issue for method such as +stringWithFormat:... with takes a variable number of argument

I would suggest you look into how libobjc implements forward. Thanks, Andrew Pinski

Reply via email to