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