|
|
1.1 ! root 1: /* Basic data types for Objective C. ! 2: Copyright (C) 1992 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: ! 27: #ifndef __objc_INCLUDE_GNU ! 28: #define __objc_INCLUDE_GNU ! 29: ! 30: /* If someone is using a c++ compiler then adjust the types in the ! 31: file back to C. */ ! 32: #ifdef __cplusplus ! 33: extern "C" { ! 34: #endif ! 35: ! 36: #include "record.h" ! 37: ! 38: ! 39: #define nil (id)0 /* id of Nil instance */ ! 40: #define Nil (Class_t)0 /* id of Nil class */ ! 41: typedef char* STR; /* String alias */ ! 42: ! 43: /* Boolean typedefs */ ! 44: typedef char BOOL; ! 45: #define YES (BOOL)1 ! 46: #define NO (BOOL)0 ! 47: ! 48: /* Definition of a selector. Selectors are really of type char*. The ! 49: run-time hashes the string's address to locate the method. If the ! 50: method isn't in the hash table then a search is made through the ! 51: class hierarchy using strcmp to locate the method. */ ! 52: #if 0 ! 53: typedef struct objc_selector* SEL; ! 54: #else ! 55: typedef void* SEL; ! 56: #endif ! 57: ! 58: /* ObjC uses this typedef for untyped instances. */ ! 59: ! 60: typedef struct objc_object { ! 61: struct objc_class* class_pointer; ! 62: } *id; ! 63: ! 64: /* Prototype for method functions. */ ! 65: typedef id (*IMP)(id, SEL, ...); ! 66: ! 67: /* Filer types used to describe Ivars and Methods. */ ! 68: #define _C_ID '@' ! 69: #define _C_CLASS '#' ! 70: #define _C_SEL ':' ! 71: #define _C_CHR 'c' ! 72: #define _C_UCHR 'C' ! 73: #define _C_SHT 's' ! 74: #define _C_USHT 'S' ! 75: #define _C_INT 'i' ! 76: #define _C_UINT 'I' ! 77: #define _C_LNG 'l' ! 78: #define _C_ULNG 'L' ! 79: #define _C_FLT 'f' ! 80: #define _C_DBL 'd' ! 81: #define _C_BFLD 'b' ! 82: #define _C_VOID 'v' ! 83: #define _C_UNDEF '?' ! 84: #define _C_PTR '^' ! 85: #define _C_CHARPTR '*' ! 86: #define _C_ARY_B '[' ! 87: #define _C_ARY_E ']' ! 88: #define _C_UNION_B '(' ! 89: #define _C_UNION_E ')' ! 90: #define _C_STRUCT_B '{' ! 91: #define _C_STRUCT_E '}' ! 92: ! 93: /* These definitions are masks used with the "info" member variable in ! 94: the lass and meta class structures. */ ! 95: #define CLS_CLASS 0x1L /* The structure is of type ! 96: class (Class_t). */ ! 97: #define CLS_META 0x2L /* The structure is of type ! 98: meta class (MetaClass_t). */ ! 99: #define CLS_INITIALIZED 0x4L /* Class is initialized. A ! 100: +initialize method is the ! 101: first message sent to a ! 102: class. It isn't guaranteed ! 103: to be sent only once. */ ! 104: #define CLS_RTI 0x8L /* The class has been initialized ! 105: within the run time library. */ ! 106: ! 107: /* Set this variable nonzero to print a line describing each ! 108: message that is sent. */ ! 109: extern BOOL objc_trace; ! 110: ! 111: ! 112: /* ! 113: * Whereas a Module (defined further down) is the root (typically) of a file, ! 114: * a Symtab is the root of the class and category definitions within the ! 115: * module. ! 116: * ! 117: * A Symtab contains a variable length array of pointers to classes and ! 118: * categories defined in the module. ! 119: */ ! 120: typedef struct objc_symtab { ! 121: unsigned long sel_ref_cnt; /* Unknown. */ ! 122: SEL *refs; /* Unknown. */ ! 123: unsigned short cls_def_cnt; /* Number of classes compiled ! 124: (defined) in the module. */ ! 125: unsigned short cat_def_cnt; /* Number of categories ! 126: compiled (defined) in the ! 127: module. */ ! 128: void *defs[1]; /* Variable array of pointers. ! 129: cls_def_cnt of type Class_t ! 130: followed by cat_def_cnt of ! 131: type Category_t. */ ! 132: } Symtab, *Symtab_t; ! 133: ! 134: ! 135: /* ! 136: * The compiler generates one of these structures for each module that ! 137: * composes the executable (eg main.m). ! 138: * ! 139: * This data structure is the root of the definition tree for the module. ! 140: * ! 141: * A collect program runs between ld stages and creates a ObjC ctor array. ! 142: * That array holds a pointer to each module structure of the executable. ! 143: */ ! 144: typedef struct objc_module { ! 145: unsigned long version; /* Compiler revision. */ ! 146: unsigned long size; /* sizeof(Module). */ ! 147: const char* name; /* Name of the file where the ! 148: module was generated. The ! 149: name includes the path. */ ! 150: Symtab_t symtab; /* Pointer to the Symtab of ! 151: the module. The Symtab ! 152: holds an array of pointers to ! 153: the classes and categories ! 154: defined in the module. */ ! 155: } Module, *Module_t; ! 156: ! 157: ! 158: /* ! 159: * The compiler generates one of these structures for a class that has ! 160: * instance variables defined in its specification. ! 161: */ ! 162: typedef struct objc_ivar* Ivar_t; ! 163: typedef struct objc_ivar_list { ! 164: int ivar_count; /* Number of structures (Ivar) ! 165: contained in the list. One ! 166: structure per instance ! 167: variable defined in the ! 168: class. */ ! 169: struct objc_ivar { ! 170: const char* ivar_name; /* Name of the instance ! 171: variable as entered in the ! 172: class definition. */ ! 173: const char* ivar_type; /* Description of the Ivar's ! 174: type. Useful for ! 175: debuggers. */ ! 176: int ivar_offset; /* Byte offset from the base ! 177: address of the instance ! 178: structure to the variable. */ ! 179: ! 180: } ivar_list[1]; /* Variable length ! 181: structure. */ ! 182: } IvarList, *IvarList_t; ! 183: ! 184: ! 185: /* ! 186: * The compiler generates one (or more) of these structures for a class that ! 187: * has methods defined in its specification. ! 188: * ! 189: * The implementation of a class can be broken into separate pieces in a file ! 190: * and categories can break them across modules. To handle this problem is a ! 191: * singly linked list of methods. ! 192: */ ! 193: typedef struct objc_method Method; ! 194: typedef Method* Method_t; ! 195: typedef struct objc_method_list { ! 196: struct objc_method_list* method_next; /* This variable is used to link ! 197: a method list to another. It ! 198: is a singly linked list. */ ! 199: int method_count; /* Number of methods defined in ! 200: this structure. */ ! 201: struct objc_method { ! 202: SEL method_name; /* This variable is the method's ! 203: name. It is a char*. ! 204: The unique integer passed to ! 205: objc_msgSend is a char* too. ! 206: It is compared against ! 207: method_name using strcmp. */ ! 208: const char* method_types; /* Description of the method's ! 209: parameter list. Useful for ! 210: debuggers. */ ! 211: IMP method_imp; /* Address of the method in the ! 212: executable. */ ! 213: } method_list[1]; /* Variable length ! 214: structure. */ ! 215: } MethodList, *MethodList_t; ! 216: ! 217: ! 218: /* ! 219: * The compiler generates one of these structures for each class. ! 220: * ! 221: * This structure is the definition for meta classes. By definition a meta ! 222: * class is the class's class. Its most relevant contribution is that its ! 223: * method list contain the class's factory methods. ! 224: * ! 225: * This structure is generated by the compiler in the executable and used by ! 226: * the run-time during normal messaging operations. Therefore some members ! 227: * change type. The compiler generates "char* const" and places a string in ! 228: * the following member variables: class_pointer and super_class. ! 229: */ ! 230: typedef struct objc_metaClass { ! 231: struct objc_metaClass* class_pointer; /* Pointer to Object meta class. */ ! 232: struct objc_metaClass* super_class; /* Pointer to meta class's ! 233: super class. NULL for ! 234: Object. */ ! 235: const char* name; /* Name of the meta class. */ ! 236: long version; /* Unknown. */ ! 237: long info; /* Bit mask. See class masks ! 238: defined above. */ ! 239: long instance_size; /* Always 0 except for Object. ! 240: Should be ignored. */ ! 241: IvarList_t ivars; /* Always NULL except for ! 242: Object. Should be ignored. */ ! 243: MethodList_t methods; /* Linked List of factory methods ! 244: for the class. */ ! 245: struct record ** cache; /* Pointer to factory method dispatch table. */ ! 246: } MetaClass, *MetaClass_t; ! 247: ! 248: ! 249: /* ! 250: * The compiler generates one of these structures for each class. ! 251: * ! 252: * This structure is the definition for classes. ! 253: * ! 254: * This structure is generated by the compiler in the executable and used by ! 255: * the run-time during normal messaging operations. Therefore some members ! 256: * change type. The compiler generates "char* const" and places a string in ! 257: * the following member variables: super_class. ! 258: */ ! 259: typedef struct objc_class { ! 260: MetaClass_t class_pointer; /* Pointer to the class's ! 261: meta class. */ ! 262: struct objc_class* super_class; /* Pointer to the super ! 263: class. NULL for class ! 264: Object. */ ! 265: const char* name; /* Name of the class. */ ! 266: long version; /* Unknown. */ ! 267: long info; /* Bit mask. See class masks ! 268: defined above. */ ! 269: long instance_size; /* Size in bytes of the class. ! 270: The sum of the class definition ! 271: and all super class ! 272: definitions. */ ! 273: IvarList_t ivars; /* Pointer to a structure that ! 274: describes the instance ! 275: variables in the class ! 276: definition. NULL indicates ! 277: no instance variables. Does ! 278: not include super class ! 279: variables. */ ! 280: MethodList_t methods; /* Linked list of instance ! 281: methods defined for the ! 282: class. */ ! 283: struct record ** cache; /* Pointer to instance method dispatch table. */ ! 284: } Class, *Class_t; ! 285: ! 286: ! 287: /* ! 288: * The compiler generates one of these structures for each category. A class ! 289: * may have many categories and contain both instance and factory methods. ! 290: */ ! 291: typedef struct objc_category { ! 292: const char* category_name; /* Name of the category. Name ! 293: contained in the () of the ! 294: category definition. */ ! 295: const char* class_name; /* Name of the class to which ! 296: the category belongs. */ ! 297: MethodList_t instance_methods; /* Linked list of instance ! 298: methods defined in the ! 299: category. NULL indicates no ! 300: instance methods defined. */ ! 301: MethodList_t class_methods; /* Linked list of factory ! 302: methods defined in the ! 303: category. NULL indicates no ! 304: class methods defined. */ ! 305: } Category, *Category_t; ! 306: ! 307: ! 308: /* ! 309: * Structure used when a message is send to a class's super class. The ! 310: * compiler generates one of these structures and passes it to ! 311: * objc_msgSuper. ! 312: */ ! 313: typedef struct objc_super { ! 314: id receiver; /* Id of the object sending ! 315: the message. */ ! 316: Class_t class; /* Object's super class. */ ! 317: } Super, *Super_t; ! 318: ! 319: /* ! 320: * _alloc points to the function, called through class_createInstance, used ! 321: * to allocate memory for new instances. ! 322: */ ! 323: extern id (*_alloc)(Class_t); ! 324: /* ! 325: * _dealloc points to the function, called through object_dispose, used to ! 326: * free instances. ! 327: */ ! 328: extern id (*_dealloc)(id); ! 329: /* ! 330: * _realloc points to the function, called through object_realloc, used to ! 331: * reallocate memory for an object ! 332: */ ! 333: extern id (*_realloc)(id, unsigned int); ! 334: ! 335: /* ! 336: * _copy points to the function, called through object_copy, used to create ! 337: * an exact copy of an object. ! 338: */ ! 339: extern id (*_copy)(id); ! 340: ! 341: /* ! 342: * _error points to the function that the run-time system calls in response ! 343: * to an error. By default, it prints formatted error messages to the ! 344: * standard error stream and calls abort to produce a core file. ! 345: */ ! 346: extern void (*_error)(id object, const char *fmt, va_list ap); ! 347: ! 348: ! 349: #ifdef __cplusplus ! 350: } ! 351: #endif ! 352: ! 353: ! 354: #endif /* not __objc_INCLUDE_GNU */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.