summaryrefslogtreecommitdiff
path: root/gcc/testsuite/objc-obj-c++-shared/runtime.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/objc-obj-c++-shared/runtime.h')
-rw-r--r--gcc/testsuite/objc-obj-c++-shared/runtime.h114
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_ */
+