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
This commit is contained in:
parent
8cb4a04adc
commit
68b61df962
@ -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. */
|
|||||||
/* 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__
|
|||||||
IMP
|
IMP
|
||||||
__objc_get_forward_imp (SEL sel)
|
__objc_get_forward_imp (SEL sel)
|
||||||
{
|
{
|
||||||
const char *t = sel->sel_types;
|
if (__objc_msg_forward)
|
||||||
|
{
|
||||||
if (t && (*t == '[' || *t == '(' || *t == '{')
|
IMP result;
|
||||||
#ifdef OBJC_MAX_STRUCT_BY_VALUE
|
if ((result = __objc_msg_forward (sel)))
|
||||||
&& objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE
|
return result;
|
||||||
#endif
|
}
|
||||||
)
|
|
||||||
return (IMP)__objc_block_forward;
|
|
||||||
else if (t && (*t == 'f' || *t == 'd'))
|
|
||||||
return (IMP)__objc_double_forward;
|
|
||||||
else
|
else
|
||||||
return (IMP)__objc_word_forward;
|
{
|
||||||
|
const char *t = sel->sel_types;
|
||||||
|
|
||||||
|
if (t && (*t == '[' || *t == '(' || *t == '{')
|
||||||
|
#ifdef OBJC_MAX_STRUCT_BY_VALUE
|
||||||
|
&& objc_sizeof_type(t) > OBJC_MAX_STRUCT_BY_VALUE
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
return (IMP)__objc_block_forward;
|
||||||
|
else if (t && (*t == 'f' || *t == 'd'))
|
||||||
|
return (IMP)__objc_double_forward;
|
||||||
|
else
|
||||||
|
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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user