summaryrefslogtreecommitdiff
path: root/libobjc/sendmsg.c
diff options
context:
space:
mode:
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-09 18:04:50 +0000
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-09 18:04:50 +0000
commit1ec3279582f663236038f253a46e295c9b78dfce (patch)
treed4296a5892d33adec631c46ee86b937dcd79fb6f /libobjc/sendmsg.c
parentcd3f4304b62a9fe9fe8cd579b9eeecd96bf7a146 (diff)
downloadgcc-1ec3279582f663236038f253a46e295c9b78dfce.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123678 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libobjc/sendmsg.c')
-rw-r--r--libobjc/sendmsg.c25
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);
}
}
}