mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
sendmsg.c: Added __objc_msg_forward2...
2007-04-09 Andrew Ruder <andy@aeruder.net> * sendmsg.c: Added __objc_msg_forward2, a hook that allows external libraries to provide a function that returns the real forwarding function based on both the selector and the receiver. * objc/objc-api.h: Define __objc_msg_forward2. From-SVN: r123678
This commit is contained in:
committed by
Andrew Pinski
parent
ecc0fc15ec
commit
80ae8e8ad2
@@ -52,10 +52,15 @@ Boston, MA 02110-1301, USA. */
|
||||
/* The uninstalled dispatch table */
|
||||
struct sarray *__objc_uninstalled_dtable = 0; /* !T:MUTEX */
|
||||
|
||||
/* Hook for method forwarding. If it is set, is invoked to return a
|
||||
function that performs the real forwarding. Otherwise the libgcc
|
||||
based functions (__builtin_apply and friends) are used. */
|
||||
/* Two hooks for method forwarding. If either is set, it is invoked
|
||||
* to return a function that performs the real forwarding. If both
|
||||
* are set, the result of __objc_msg_forward2 will be preferred over
|
||||
* that of __objc_msg_forward. If both return NULL or are unset,
|
||||
* the libgcc based functions (__builtin_apply and friends) are
|
||||
* used.
|
||||
*/
|
||||
IMP (*__objc_msg_forward) (SEL) = NULL;
|
||||
IMP (*__objc_msg_forward2) (id, SEL) = NULL;
|
||||
|
||||
/* Send +initialize to class */
|
||||
static void __objc_send_initialize (Class);
|
||||
@@ -69,8 +74,7 @@ static void __objc_init_install_dtable (id, SEL);
|
||||
return type for the selector.
|
||||
__objc_block_forward for structures.
|
||||
__objc_double_forward for floats/doubles.
|
||||
__objc_word_forward for pointers or types that fit in registers.
|
||||
*/
|
||||
__objc_word_forward for pointers or types that fit in registers. */
|
||||
static double __objc_double_forward (id, SEL, ...);
|
||||
static id __objc_word_forward (id, SEL, ...);
|
||||
typedef struct { id many[8]; } __big;
|
||||
@@ -87,10 +91,11 @@ id nil_method (id, SEL);
|
||||
/* Given a selector, return the proper forwarding implementation. */
|
||||
inline
|
||||
IMP
|
||||
__objc_get_forward_imp (SEL sel)
|
||||
__objc_get_forward_imp (id rcv, SEL sel)
|
||||
{
|
||||
/* If a custom forwarding hook was registered, try getting a forwarding
|
||||
* function from it. */
|
||||
function from it. There are two forward routine hooks, one that
|
||||
takes the receiver as an argument and one that does not. */
|
||||
if (__objc_msg_forward)
|
||||
{
|
||||
IMP result;
|
||||
@@ -99,7 +104,7 @@ __objc_get_forward_imp (SEL sel)
|
||||
}
|
||||
|
||||
/* In all other cases, use the default forwarding functions built using
|
||||
* __builtin_apply and friends. */
|
||||
__builtin_apply and friends. */
|
||||
{
|
||||
const char *t = sel->sel_types;
|
||||
|
||||
@@ -168,7 +173,7 @@ get_imp (Class class, SEL sel)
|
||||
is not in the dispatch table. So the method just
|
||||
doesn't exist for the class. Return the forwarding
|
||||
implementation. */
|
||||
res = __objc_get_forward_imp (sel);
|
||||
res = __objc_get_forward_imp ((id)class, sel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -237,7 +242,7 @@ objc_msg_lookup (id receiver, SEL op)
|
||||
{
|
||||
/* If the method still just doesn't exist for the
|
||||
class, attempt to forward the method. */
|
||||
result = __objc_get_forward_imp (op);
|
||||
result = __objc_get_forward_imp (receiver, op);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user