|
|
1.1 root 1: /* Basic data types for Objective C.
2: Copyright (C) 1993 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: /* As a special exception, if you link this library with files
21: compiled with GCC to produce an executable, this does not cause
22: the resulting executable to be covered by the GNU General Public License.
23: This exception does not however invalidate any other reasons why
24: the executable file might be covered by the GNU General Public License. */
25:
26: #ifndef __objc_INCLUDE_GNU
27: #define __objc_INCLUDE_GNU
28:
29: #ifdef __cplusplus
30: extern "C" {
31: #endif
32:
33: #ifdef IN_GCC
34: #include "gstddef.h"
35: #else
36: #include "stddef.h"
37: #endif
38:
39: /*
40: ** Definition of the boolean type.
41: */
42: typedef char BOOL;
43: #define YES (BOOL)1
44: #define NO (BOOL)0
45:
46: /*
47: ** Definition of a selector. Selectors are really of type unsigned int.
48: ** The runtime does this mapping from SEL's to names internally in the
49: ** sel_... operations. You should never use the fact that it is actually
50: ** an integer, since other Objective-C implementations use other conventions.
51: */
52: typedef void* SEL;
53:
54: /*
55: ** ObjC uses this typedef for untyped instances.
56: */
57: typedef struct objc_object {
58: struct objc_class* class_pointer;
59: } *id;
60:
61: /*
62: ** Definition of method type. When retrieving the implementation of a
63: ** method, this is type of the pointer returned
64: */
65: typedef id (*IMP)(id, SEL, ...);
66:
67: /*
68: ** More simple types...
69: */
70: #define nil (id)0 /* id of Nil instance */
71: #define Nil (Class*)0 /* id of Nil class */
72: typedef char *STR; /* String alias */
73:
74: /*
75: ** The compiler generates one of these structures for each class.
76: **
77: ** This structure is the definition for classes.
78: **
79: ** This structure is generated by the compiler in the executable and used by
80: ** the run-time during normal messaging operations. Therefore some members
81: ** change type. The compiler generates "char* const" and places a string in
82: ** the following member variables: super_class.
83: */
84: typedef struct objc_class MetaClass;
85: typedef struct objc_class Class;
86: struct objc_class {
87: MetaClass* class_pointer; /* Pointer to the class's
88: meta class. */
89: struct objc_class* super_class; /* Pointer to the super
90: class. NULL for class
91: Object. */
92: const char* name; /* Name of the class. */
93: long version; /* Unknown. */
94: unsigned long info; /* Bit mask. See class masks
95: defined above. */
96: long instance_size; /* Size in bytes of the class.
97: The sum of the class definition
98: and all super class
99: definitions. */
100: struct objc_ivar_list* ivars; /* Pointer to a structure that
101: describes the instance
102: variables in the class
103: definition. NULL indicates
104: no instance variables. Does
105: not include super class
106: variables. */
107: struct objc_method_list* methods; /* Linked list of instance
108: methods defined for the
109: class. */
110: struct sarray * dtable; /* Pointer to instance
111: method dispatch table. */
112: struct objc_class* subclass_list; /* Subclasses */
113: struct objc_class* sibling_class;
114:
115: struct objc_protocol_list *protocols; /* Protocols conformed to */
116: };
117:
118: #ifndef __OBJC__
119: typedef struct objc_protocol {
120: struct objc_class* class_pointer;
121: char *protocol_name;
122: struct objc_protocol_list *protocol_list;
123: struct objc_method_description_list *instance_methods, *class_methods;
124: } Protocol;
125:
126: #else /* __OBJC__ */
127: @class Protocol;
128: #endif
129:
130: typedef void* retval_t; /* return value */
131: typedef void(*apply_t)(void); /* function pointer */
132: typedef union {
133: char *arg_ptr;
134: char arg_regs[sizeof (char*)];
135: } *arglist_t; /* argument frame */
136:
137:
138: #if defined(__OBJC__)
139: #include "objc/sarray.h"
140:
141: /*
142: This is the function called when messages are send to nil. You may
143: set a breakpoint in your debugger at this function to catch messages
144: too nil.
145: */
146: extern id nil_method(id rcv, SEL op, ...);
147:
148: /*
149: The messager is inlined, thus it is defined here directly. The
150: inlining is quite time-consuming when optimizing. This will be
151: taken care of later by hand-coding the messager in the compiler.
152: */
153: extern __inline__ IMP
154: objc_msg_lookup(id receiver, SEL op)
155: {
156: if(receiver)
157: return sarray_get(receiver->class_pointer->dtable, (size_t)(op));
158: else
159: return nil_method;
160: }
161:
162: #else
163:
164: IMP objc_msg_lookup(id receiver, SEL op);
165:
166: #endif
167:
168: #ifdef __cplusplus
169: }
170: #endif
171:
172: #endif /* not __objc_INCLUDE_GNU */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.