summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/cc/libobjc/objc.h
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/cc/libobjc/objc.h')
-rw-r--r--gnu/usr.bin/cc/libobjc/objc.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/gnu/usr.bin/cc/libobjc/objc.h b/gnu/usr.bin/cc/libobjc/objc.h
new file mode 100644
index 000000000000..4bb9da361dec
--- /dev/null
+++ b/gnu/usr.bin/cc/libobjc/objc.h
@@ -0,0 +1,185 @@
+/* Basic data types for Objective C.
+ Copyright (C) 1993 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC 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 2, or (at your option)
+any later version.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* As a special exception, if you link this library with files
+ compiled with GCC to produce an executable, this does not cause
+ the resulting executable to be covered by the GNU General Public License.
+ This exception does not however invalidate any other reasons why
+ the executable file might be covered by the GNU General Public License. */
+
+#ifndef __objc_INCLUDE_GNU
+#define __objc_INCLUDE_GNU
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef IN_GCC
+#include "gstddef.h"
+#else
+#include "stddef.h"
+#endif
+
+/*
+** Definition of the boolean type.
+*/
+typedef char BOOL;
+#define YES (BOOL)1
+#define NO (BOOL)0
+
+/*
+** Definition of a selector. Selectors are really of type unsigned int.
+** The runtime does this mapping from SEL's to names internally in the
+** sel_... operations. You should never use the fact that it is actually
+** an integer, since other Objective-C implementations use other conventions.
+*/
+typedef void* SEL;
+
+/*
+** ObjC uses this typedef for untyped instances.
+*/
+typedef struct objc_object {
+ struct objc_class* class_pointer;
+} *id;
+
+/*
+** Definition of method type. When retrieving the implementation of a
+** method, this is type of the pointer returned
+*/
+typedef id (*IMP)(id, SEL, ...);
+
+/*
+** More simple types...
+*/
+#define nil (id)0 /* id of Nil instance */
+#define Nil (Class*)0 /* id of Nil class */
+typedef char *STR; /* String alias */
+
+/*
+** The compiler generates one of these structures for each class.
+**
+** This structure is the definition for classes.
+**
+** This structure is generated by the compiler in the executable and used by
+** the run-time during normal messaging operations. Therefore some members
+** change type. The compiler generates "char* const" and places a string in
+** the following member variables: super_class.
+*/
+typedef struct objc_class MetaClass;
+typedef struct objc_class Class;
+struct objc_class {
+ MetaClass* class_pointer; /* Pointer to the class's
+ meta class. */
+ struct objc_class* super_class; /* Pointer to the super
+ class. NULL for class
+ Object. */
+ const char* name; /* Name of the class. */
+ long version; /* Unknown. */
+ unsigned long info; /* Bit mask. See class masks
+ defined above. */
+ long instance_size; /* Size in bytes of the class.
+ The sum of the class definition
+ and all super class
+ definitions. */
+ struct objc_ivar_list* ivars; /* Pointer to a structure that
+ describes the instance
+ variables in the class
+ definition. NULL indicates
+ no instance variables. Does
+ not include super class
+ variables. */
+ struct objc_method_list* methods; /* Linked list of instance
+ methods defined for the
+ class. */
+ struct sarray * dtable; /* Pointer to instance
+ method dispatch table. */
+ struct objc_class* subclass_list; /* Subclasses */
+ struct objc_class* sibling_class;
+
+ struct objc_protocol_list *protocols; /* Protocols conformed to */
+};
+
+#ifndef __OBJC__
+typedef struct objc_protocol {
+ struct objc_class* class_pointer;
+ char *protocol_name;
+ struct objc_protocol_list *protocol_list;
+ struct objc_method_description_list *instance_methods, *class_methods;
+} Protocol;
+
+#else
+
+@class Protocol;
+#endif
+
+typedef void* retval_t; /* return value */
+typedef void(*apply_t)(void); /* function pointer */
+
+#if defined(REG_ARGS) || defined(STACK_ARGS)
+
+typedef struct {
+ char* arg_pointer;
+#ifdef STRUCT_RETURN
+ void* struct_return;
+#endif
+#ifdef REG_ARGS
+ void* regs[2];
+#endif
+} *arglist_t;
+
+#ifdef REG_ARGS
+#define __objc_frame_receiver(FRAME) (FRAME)->regs[0]
+#define __objc_frame_selector(FRAME) ((SEL)(FRAME)->regs[1])
+
+#else
+#define __objc_frame_receiver(FRAME) ((id*)(FRAME)->arg_pointer)[0]
+#define __objc_frame_selector(FRAME) ((SEL*)(FRAME)->arg_pointer)[1]
+#endif
+#else
+
+typedef void* arglist_t;
+
+#endif
+
+#if defined(__OBJC__)
+
+#include "objc/sarray.h"
+
+static id nil_method(id rcv, SEL op, ...) { return rcv; }
+
+extern __inline__ IMP
+objc_msg_lookup(id receiver, SEL op)
+{
+ if(receiver)
+ return sarray_get(receiver->class_pointer->dtable, (size_t) op);
+ else
+ return nil_method;
+}
+
+#else
+
+IMP objc_msg_lookup(id receiver, SEL op);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not __objc_INCLUDE_GNU */