/* 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-2023 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
struct sarray *dtable;
struct sarray *super_dtable;
- /* This table could be initialized in init.c. We can not use the
+ /* This table could be initialized in init.c. We cannot use the
class name since the class maintains the instance methods and the
meta class maintains the the class methods yet both share the
same name. Classes should be unique in any program. */