/* Wrapper around Copyright (C) 2011 Free Software Foundation, Inc. Contributed by Nicola Pero This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef _TESTSUITE_RUNTIME_H_ #define _TESTSUITE_RUNTIME_H_ /* Include this file where you'd normally include . Older versions of the NeXT runtime do not have and you need to include instead. This file takes care of figuring out if that's the case. */ #ifndef __NEXT_RUNTIME__ /* GNU Objective-C runtime (libobjc). */ # include #else /* NeXT Objective-C runtime. */ /* Include next-abi.h to determine which version of the runtime we are dealing with. TODO: If this is the only place including it, maybe it could be copied here ? */ # include "next-abi.h" # ifdef NEXT_OBJC_USE_NEW_INTERFACE /* New NeXT runtime, with an API that should be basically identical to the GNU Objective-C one. */ # include # else /* Old NeXT runtime, with an API similar, but not identical to the new one. To start with, different headers need to be included. */ # include # include /* Not all functions are available in the old NeXT runtime. A few that we need are not, and here we provide an implementation on top of the old NeXT API. */ # define class_isMetaClass(C) (CLS_GETINFO((struct objc_class *)C, CLS_META)? YES: NO) # define class_getName(C) object_getClassName(C) # define class_getSuperclass(C) (((struct objc_class *)C)->super_class) # define method_getImplementation(M) (((Method)M)->method_imp) # define method_getTypeEncoding(M) (((Method)M)->method_types) # define object_getClass(O) (*(struct objc_class **)O) #include BOOL class_conformsToProtocol (Class class_, Protocol *protocol) { struct objc_protocol_list *p; int i; for (p = class_->protocols; p; p = p->next) for (i = 0; i < p->count; i++) if ([p->list[i] conformsTo: protocol]) return YES; return NO; } #define protocol_getName(P) [P name] #define protocol_isEqual(P,Q) [P isEqual: Q] struct objc_method_description protocol_getMethodDescription (Protocol *protocol, SEL selector, BOOL requiredMethod, BOOL instanceMethod) { struct objc_method_description *tmp; struct objc_method_description result; if (instanceMethod) tmp = [protocol descriptionForInstanceMethod: selector]; else tmp = [protocol descriptionForClassMethod: selector]; if (tmp) result = *tmp; else { result.name = (SEL)0; result.types = (char *)0; } return result; } # endif /* NEXT_OBJC_USE_NEW_INTERFACE */ # endif /* __NEXT_RUNTIME__ */ #endif /* _TESTSUITE_RUNTIME_H_ */