Commit 68b61df9 by Ovidiu Predescu

Added __objc_msg_forward...

Added __objc_msg_forward, a hook that allows external libraries to
provide a function that returns the real forwarding function. This can
alleviate problems __builtin_apply() and friends have on various
platforms. (Solution suggested by Helge Hess.)

Define gen_rtx_REG.

From-SVN: r38650
parent 8cb4a04a
...@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */
/* this is how we hack STRUCT_VALUE to be 1 or 0 */ /* this is how we hack STRUCT_VALUE to be 1 or 0 */
#define gen_rtx(args...) 1 #define gen_rtx(args...) 1
#define gen_rtx_MEM(args...) 1 #define gen_rtx_MEM(args...) 1
#define gen_rtx_REG(args...) 1
#define rtx int #define rtx int
#if !defined(STRUCT_VALUE) || STRUCT_VALUE == 0 #if !defined(STRUCT_VALUE) || STRUCT_VALUE == 0
...@@ -44,6 +45,11 @@ Boston, MA 02111-1307, USA. */ ...@@ -44,6 +45,11 @@ Boston, MA 02111-1307, USA. */
/* The uninstalled dispatch table */ /* The uninstalled dispatch table */
struct sarray* __objc_uninstalled_dtable = 0; /* !T:MUTEX */ 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. */
IMP (*__objc_msg_forward)(SEL) = NULL;
/* Send +initialize to class */ /* Send +initialize to class */
static void __objc_send_initialize(Class); static void __objc_send_initialize(Class);
...@@ -76,18 +82,27 @@ __inline__ ...@@ -76,18 +82,27 @@ __inline__
IMP IMP
__objc_get_forward_imp (SEL sel) __objc_get_forward_imp (SEL sel)
{ {
const char *t = sel->sel_types; if (__objc_msg_forward)
{
IMP result;
if ((result = __objc_msg_forward (sel)))
return result;
}
else
{
const char *t = sel->sel_types;
if (t && (*t == '[' || *t == '(' || *t == '{') if (t && (*t == '[' || *t == '(' || *t == '{')
#ifdef OBJC_MAX_STRUCT_BY_VALUE #ifdef OBJC_MAX_STRUCT_BY_VALUE
&& objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE && objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE
#endif #endif
) )
return (IMP)__objc_block_forward; return (IMP)__objc_block_forward;
else if (t && (*t == 'f' || *t == 'd')) else if (t && (*t == 'f' || *t == 'd'))
return (IMP)__objc_double_forward; return (IMP)__objc_double_forward;
else else
return (IMP)__objc_word_forward; return (IMP)__objc_word_forward;
}
} }
/* Given a class and selector, return the selector's implementation. */ /* Given a class and selector, return the selector's implementation. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment