1/* Wrapper around <objc/runtime.h>
2   Copyright (C) 2011 Free Software Foundation, Inc.
3   Contributed by Nicola Pero
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21#ifndef _TESTSUITE_RUNTIME_H_
22#define _TESTSUITE_RUNTIME_H_
23
24/* Include this file where you'd normally include <objc/runtime.h>.
25
26   Older versions of the NeXT runtime do not have <objc/runtime.h> and
27   you need to include <objc/objc-runtime.h> instead.  This file takes
28   care of figuring out if that's the case.  */
29
30#ifndef __NEXT_RUNTIME__
31
32/*
33  GNU Objective-C runtime (libobjc).
34*/
35# include <objc/runtime.h>
36
37#else
38
39/*
40  NeXT Objective-C runtime.
41*/
42
43/* Include next-abi.h to determine which version of the runtime we are
44   dealing with.  TODO: If this is the only place including it, maybe
45   it could be copied here ?  */
46# include "next-abi.h"
47
48# ifdef NEXT_OBJC_USE_NEW_INTERFACE
49
50/* New NeXT runtime, with an API that should be basically identical to
51   the GNU Objective-C one.  */
52#  include <objc/runtime.h>
53
54# else
55
56/* Old NeXT runtime, with an API similar, but not identical to the new
57   one.  To start with, different headers need to be included.  */
58#  include <objc/objc-class.h>
59#  include <objc/objc-runtime.h>
60
61/* Not all functions are available in the old NeXT runtime.  A few
62   that we need are not, and here we provide an implementation on top
63   of the old NeXT API.  */
64
65#  define class_isMetaClass(C) (CLS_GETINFO((struct objc_class *)C, CLS_META)? YES: NO)
66#  define class_getName(C) object_getClassName(C)
67#  define class_getSuperclass(C)  (((struct objc_class *)C)->super_class)
68#  define method_getImplementation(M) (((Method)M)->method_imp)
69#  define method_getTypeEncoding(M) (((Method)M)->method_types)
70#  define object_getClass(O) (*(struct objc_class **)O)
71
72#include <objc/Protocol.h>
73BOOL class_conformsToProtocol (Class class_, Protocol *protocol)
74{
75  struct objc_protocol_list *p;
76  int i;
77  for (p = class_->protocols; p; p = p->next)
78    for (i = 0; i < p->count; i++)
79      if ([p->list[i] conformsTo: protocol])
80	return YES;
81  return NO;
82}
83
84#define protocol_getName(P) [P name]
85#define protocol_isEqual(P,Q) [P isEqual: Q]
86
87struct objc_method_description protocol_getMethodDescription (Protocol *protocol,
88							      SEL selector,
89							      BOOL requiredMethod,
90							      BOOL instanceMethod)
91{
92  struct objc_method_description *tmp;
93  struct objc_method_description result;
94
95  if (instanceMethod)
96    tmp = [protocol descriptionForInstanceMethod: selector];
97  else
98    tmp = [protocol descriptionForClassMethod: selector];
99
100  if (tmp)
101    result = *tmp;
102  else
103    {
104      result.name = (SEL)0;
105      result.types = (char *)0;
106    }
107
108  return result;
109}
110
111#  endif /* NEXT_OBJC_USE_NEW_INTERFACE */
112
113# endif /* __NEXT_RUNTIME__ */
114
115#endif /* _TESTSUITE_RUNTIME_H_ */
116
117