/* GNU Objective C Runtime message lookup
- Copyright (C) 1993, 1995, 1996, 1997, 1998,
- 2001, 2002, 2004, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1993-2017 Free Software Foundation, Inc.
Contributed by Kresten Krab Thorup
This file is part of GCC.
only while debugging the runtime. */
/* #define DEBUG 1 */
-/* FIXME: This file has no business including tm.h. */
/* FIXME: This should be using libffi instead of __builtin_apply
and friends. */
#include "objc-private/error.h"
#include "tconfig.h"
#include "coretypes.h"
-#include "tm.h"
#include "objc/runtime.h"
#include "objc/message.h" /* For objc_msg_lookup(), objc_msg_lookup_super(). */
#include "objc/thr.h"
#include <assert.h> /* For assert */
#include <string.h> /* For strlen */
-/* This is how we hack STRUCT_VALUE to be 1 or 0. */
-#define gen_rtx(args...) 1
-#define gen_rtx_MEM(args...) 1
-#define gen_rtx_REG(args...) 1
-/* Already defined in gcc/coretypes.h. So prevent double definition warning. */
-#undef rtx
-#define rtx int
-
-#if ! defined (STRUCT_VALUE) || STRUCT_VALUE == 0
#define INVISIBLE_STRUCT_RETURN 1
-#else
-#define INVISIBLE_STRUCT_RETURN 0
-#endif
/* The uninstalled dispatch table. If a class' dispatch table points
to __objc_uninstalled_dtable then that means it needs its dispatch
struct objc_method * search_for_method_in_list (struct objc_method_list * list, SEL op);
id nil_method (id, SEL);
+/* Make sure this inline function is exported regardless of GNU89 or C99
+ inlining semantics as it is part of the libobjc ABI. */
+extern IMP __objc_get_forward_imp (id, SEL);
+
/* Given a selector, return the proper forwarding implementation. */
inline
IMP
return res;
}
+/* Make sure this inline function is exported regardless of GNU89 or C99
+ inlining semantics as it is part of the libobjc ABI. */
+extern IMP get_imp (Class, SEL);
+
inline
IMP
get_imp (Class class, SEL sel)
{
SEL op = sel_registerName ("initialize");
- IMP imp = 0;
- struct objc_method_list * method_list = class->class_pointer->methods;
-
- while (method_list)
- {
- int i;
- struct objc_method * method;
-
- for (i = 0; i < method_list->method_count; i++)
- {
- method = &(method_list->method_list[i]);
- if (method->method_name
- && method->method_name->sel_id == op->sel_id)
- {
- imp = method->method_imp;
- break;
- }
- }
-
- if (imp)
- break;
-
- method_list = method_list->method_next;
- }
- if (imp)
+ struct objc_method *method = search_for_method_in_hierarchy (class->class_pointer,
+ op);
+
+ if (method)
{
DEBUG_PRINTF (" begin of [%s +initialize]\n", class->name);
- (*imp) ((id) class, op);
+ (*method->method_imp) ((id)class, op);
DEBUG_PRINTF (" end of [%s +initialize]\n", class->name);
}
#ifdef DEBUG