diff options
Diffstat (limited to 'gcc/testsuite/objc-obj-c++-shared/runtime.h')
-rw-r--r-- | gcc/testsuite/objc-obj-c++-shared/runtime.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/gcc/testsuite/objc-obj-c++-shared/runtime.h b/gcc/testsuite/objc-obj-c++-shared/runtime.h new file mode 100644 index 00000000000..bdc2bff620f --- /dev/null +++ b/gcc/testsuite/objc-obj-c++-shared/runtime.h @@ -0,0 +1,114 @@ +/* Wrapper around <objc/runtime.h> + 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 +<http://www.gnu.org/licenses/>. */ + +#ifndef _TESTSUITE_RUNTIME_H_ +#define _TESTSUITE_RUNTIME_H_ + +/* Include this file where you'd normally include <objc/runtime.h>. + + Older versions of the NeXT runtime do not have <objc/runtime.h> and + you need to include <objc/objc-runtime.h> instead. This file takes + care of figuring out if that's the case. */ + +#ifndef __NEXT_RUNTIME__ + +/* + GNU Objective-C runtime (libobjc). +*/ +# include <objc/runtime.h> + +#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 <objc/runtime.h> + +# 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 <objc/objc-class.h> +# include <objc/objc-runtime.h> + +/* 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 <objc/Protocol.h> +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]; + result = *tmp; + } + else + { + tmp = [protocol descriptionForClassMethod: selector]; + result = *tmp; + } + + return result; +} + +# endif /* NEXT_OBJC_USE_NEW_INTERFACE */ + +# endif /* __NEXT_RUNTIME__ */ + +#endif /* _TESTSUITE_RUNTIME_H_ */ + |