diff options
author | Andrew Ruder <andy@aeruder.net> | 2007-04-09 18:04:50 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2007-04-09 11:04:50 -0700 |
commit | 80ae8e8ad2efea97a01aad6cb4656e7fb5b0fd55 (patch) | |
tree | d4296a5892d33adec631c46ee86b937dcd79fb6f /libobjc/sendmsg.c | |
parent | ecc0fc15ecc0eea8678ccca5abf0672f76127d9c (diff) | |
download | gcc-80ae8e8ad2efea97a01aad6cb4656e7fb5b0fd55.tar.gz |
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
Diffstat (limited to 'libobjc/sendmsg.c')
-rw-r--r-- | libobjc/sendmsg.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/libobjc/sendmsg.c b/libobjc/sendmsg.c index 9453ef3dd46..c1aed1c0f9a 100644 --- a/libobjc/sendmsg.c +++ b/libobjc/sendmsg.c @@ -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); } } } |