|
|
1.1 ! root 1: /* GNU Objective-C Runtime API. ! 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 it ! 7: under the terms of the GNU General Public License as published by the ! 8: Free Software Foundation; either version 2, or (at your option) any ! 9: later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, but WITHOUT ! 12: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ! 13: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ! 14: 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 compiled ! 21: with GCC to produce an executable, this does not cause the resulting ! 22: executable to be covered by the GNU General Public License. This ! 23: exception does not however invalidate any other reasons why the ! 24: executable file might be covered by the GNU General Public License. */ ! 25: ! 26: #ifndef __objc_api_INCLUDE_GNU ! 27: #define __objc_api_INCLUDE_GNU ! 28: ! 29: #include "objc/objc.h" ! 30: #include "objc/hash.h" ! 31: #include <stdio.h> ! 32: ! 33: /* For functions which return Method_t */ ! 34: #define METHOD_NULL (Method_t)0 ! 35: /* Boolean typedefs */ ! 36: /* ! 37: ** Method descriptor returned by introspective Object methods. ! 38: ** This is really just the first part of the more complete objc_method ! 39: ** structure defined below and used internally by the runtime. ! 40: */ ! 41: struct objc_method_description ! 42: { ! 43: SEL name; /* this is a selector, not a string */ ! 44: char *types; /* type encoding */ ! 45: }; ! 46: ! 47: ! 48: ! 49: /* Filer types used to describe Ivars and Methods. */ ! 50: #define _C_ID '@' ! 51: #define _C_CLASS '#' ! 52: #define _C_SEL ':' ! 53: #define _C_CHR 'c' ! 54: #define _C_UCHR 'C' ! 55: #define _C_SHT 's' ! 56: #define _C_USHT 'S' ! 57: #define _C_INT 'i' ! 58: #define _C_UINT 'I' ! 59: #define _C_LNG 'l' ! 60: #define _C_ULNG 'L' ! 61: #define _C_FLT 'f' ! 62: #define _C_DBL 'd' ! 63: #define _C_BFLD 'b' ! 64: #define _C_VOID 'v' ! 65: #define _C_UNDEF '?' ! 66: #define _C_PTR '^' ! 67: #define _C_CHARPTR '*' ! 68: #define _C_ATOM '%' ! 69: #define _C_ARY_B '[' ! 70: #define _C_ARY_E ']' ! 71: #define _C_UNION_B '(' ! 72: #define _C_UNION_E ')' ! 73: #define _C_STRUCT_B '{' ! 74: #define _C_STRUCT_E '}' ! 75: ! 76: ! 77: ! 78: /* ! 79: ** Set this variable nonzero to print a line describing each ! 80: ** message that is sent. (this is currently disabled) ! 81: */ ! 82: extern BOOL objc_trace; ! 83: ! 84: ! 85: /* ! 86: ** Whereas a Module (defined further down) is the root (typically) of a file, ! 87: ** a Symtab is the root of the class and category definitions within the ! 88: ** module. ! 89: ** ! 90: ** A Symtab contains a variable length array of pointers to classes and ! 91: ** categories defined in the module. ! 92: */ ! 93: typedef struct objc_symtab { ! 94: unsigned long sel_ref_cnt; /* Unknown. */ ! 95: SEL *refs; /* Unknown. */ ! 96: unsigned short cls_def_cnt; /* Number of classes compiled ! 97: (defined) in the module. */ ! 98: unsigned short cat_def_cnt; /* Number of categories ! 99: compiled (defined) in the ! 100: module. */ ! 101: void *defs[1]; /* Variable array of pointers. ! 102: cls_def_cnt of type Class* ! 103: followed by cat_def_cnt of ! 104: type Category_t. */ ! 105: } Symtab, *Symtab_t; ! 106: ! 107: ! 108: /* ! 109: ** The compiler generates one of these structures for each module that ! 110: ** composes the executable (eg main.m). ! 111: ** ! 112: ** This data structure is the root of the definition tree for the module. ! 113: ** ! 114: ** A collect program runs between ld stages and creates a ObjC ctor array. ! 115: ** That array holds a pointer to each module structure of the executable. ! 116: */ ! 117: typedef struct objc_module { ! 118: unsigned long version; /* Compiler revision. */ ! 119: unsigned long size; /* sizeof(Module). */ ! 120: const char* name; /* Name of the file where the ! 121: module was generated. The ! 122: name includes the path. */ ! 123: Symtab_t symtab; /* Pointer to the Symtab of ! 124: the module. The Symtab ! 125: holds an array of pointers to ! 126: the classes and categories ! 127: defined in the module. */ ! 128: } Module, *Module_t; ! 129: ! 130: ! 131: /* ! 132: ** The compiler generates one of these structures for a class that has ! 133: ** instance variables defined in its specification. ! 134: */ ! 135: typedef struct objc_ivar* Ivar_t; ! 136: typedef struct objc_ivar_list { ! 137: int ivar_count; /* Number of structures (Ivar) ! 138: contained in the list. One ! 139: structure per instance ! 140: variable defined in the ! 141: class. */ ! 142: struct objc_ivar { ! 143: const char* ivar_name; /* Name of the instance ! 144: variable as entered in the ! 145: class definition. */ ! 146: const char* ivar_type; /* Description of the Ivar's ! 147: type. Useful for ! 148: debuggers. */ ! 149: int ivar_offset; /* Byte offset from the base ! 150: address of the instance ! 151: structure to the variable. */ ! 152: ! 153: } ivar_list[1]; /* Variable length ! 154: structure. */ ! 155: } IvarList, *IvarList_t; ! 156: ! 157: ! 158: /* ! 159: ** The compiler generates one (or more) of these structures for a class that ! 160: ** has methods defined in its specification. ! 161: ** ! 162: ** The implementation of a class can be broken into separate pieces in a file ! 163: ** and categories can break them across modules. To handle this problem is a ! 164: ** singly linked list of methods. ! 165: */ ! 166: typedef struct objc_method Method; ! 167: typedef Method* Method_t; ! 168: typedef struct objc_method_list { ! 169: struct objc_method_list* method_next; /* This variable is used to link ! 170: a method list to another. It ! 171: is a singly linked list. */ ! 172: int method_count; /* Number of methods defined in ! 173: this structure. */ ! 174: struct objc_method { ! 175: SEL method_name; /* This variable is the method's ! 176: name. It is a char*. ! 177: The unique integer passed to ! 178: objc_msg_send is a char* too. ! 179: It is compared against ! 180: method_name using strcmp. */ ! 181: const char* method_types; /* Description of the method's ! 182: parameter list. Useful for ! 183: debuggers. */ ! 184: IMP method_imp; /* Address of the method in the ! 185: executable. */ ! 186: } method_list[1]; /* Variable length ! 187: structure. */ ! 188: } MethodList, *MethodList_t; ! 189: ! 190: struct objc_protocol_list { ! 191: struct objc_protocol_list *next; ! 192: int count; ! 193: Protocol *list[1]; ! 194: }; ! 195: ! 196: /* ! 197: ** This is used to assure consistent access to the info field of ! 198: ** classes ! 199: */ ! 200: #ifndef HOST_BITS_PER_LONG ! 201: #define HOST_BITS_PER_LONG (sizeof(long)*8) ! 202: #endif ! 203: ! 204: #define __CLS_INFO(cls) ((cls)->info) ! 205: #define __CLS_ISINFO(cls, mask) ((__CLS_INFO(cls)&mask)==mask) ! 206: #define __CLS_SETINFO(cls, mask) (__CLS_INFO(cls) |= mask) ! 207: ! 208: /* The structure is of type MetaClass* */ ! 209: #define _CLS_META 0x2L ! 210: #define CLS_ISMETA(cls) ((cls)&&__CLS_ISINFO(cls, _CLS_META)) ! 211: ! 212: ! 213: /* The structure is of type Class* */ ! 214: #define _CLS_CLASS 0x1L ! 215: #define CLS_ISCLASS(cls) ((cls)&&__CLS_ISINFO(cls, _CLS_CLASS)) ! 216: ! 217: /* ! 218: ** The class is initialized within the runtime. This means that ! 219: ** it has had correct super and sublinks assigned ! 220: */ ! 221: #define _CLS_RESOLV 0x8L ! 222: #define CLS_ISRESOLV(cls) __CLS_ISINFO(cls, _CLS_RESOLV) ! 223: #define CLS_SETRESOLV(cls) __CLS_SETINFO(cls, _CLS_RESOLV) ! 224: ! 225: /* ! 226: ** The class has been send a +initialize message or a such is not ! 227: ** defined for this class ! 228: */ ! 229: #define _CLS_INITIALIZED 0x04L ! 230: #define CLS_ISINITIALIZED(cls) __CLS_ISINFO(cls, _CLS_INITIALIZED) ! 231: #define CLS_SETINITIALIZED(cls) __CLS_SETINFO(cls, _CLS_INITIALIZED) ! 232: ! 233: /* ! 234: ** The class number of this class. This must be the same for both the ! 235: ** class and it's meta class object ! 236: */ ! 237: #define CLS_GETNUMBER(cls) (__CLS_INFO(cls) >> (HOST_BITS_PER_LONG/2)) ! 238: #define CLS_SETNUMBER(cls, num) \ ! 239: ({ (cls)->info <<= (HOST_BITS_PER_LONG/2); \ ! 240: (cls)->info >>= (HOST_BITS_PER_LONG/2); \ ! 241: __CLS_SETINFO(cls, (((unsigned long)num) << (HOST_BITS_PER_LONG/2))); }) ! 242: ! 243: /* ! 244: ** The compiler generates one of these structures for each category. A class ! 245: ** may have many categories and contain both instance and factory methods. ! 246: */ ! 247: typedef struct objc_category { ! 248: const char* category_name; /* Name of the category. Name ! 249: contained in the () of the ! 250: category definition. */ ! 251: const char* class_name; /* Name of the class to which ! 252: the category belongs. */ ! 253: MethodList_t instance_methods; /* Linked list of instance ! 254: methods defined in the ! 255: category. NULL indicates no ! 256: instance methods defined. */ ! 257: MethodList_t class_methods; /* Linked list of factory ! 258: methods defined in the ! 259: category. NULL indicates no ! 260: class methods defined. */ ! 261: struct objc_protocol_list *protocols; /* List of Protocols ! 262: conformed to */ ! 263: } Category, *Category_t; ! 264: ! 265: /* ! 266: ** Structure used when a message is send to a class's super class. The ! 267: ** compiler generates one of these structures and passes it to ! 268: ** objc_msg_super. ! 269: */ ! 270: typedef struct objc_super { ! 271: id self; /* Id of the object sending ! 272: the message. */ ! 273: Class* class; /* Object's super class. */ ! 274: } Super, *Super_t; ! 275: ! 276: IMP objc_msg_lookup_super(Super_t super, SEL sel); ! 277: ! 278: retval_t objc_msg_sendv(id, SEL, arglist_t); ! 279: ! 280: ! 281: ! 282: /* ! 283: ** This is a hook which is called by objc_lookup_class and ! 284: ** objc_get_class if the runtime is not able to find the class. ! 285: ** This may e.g. try to load in the class using dynamic loading. ! 286: ** The function is guaranteed to be passed a non-NULL name string. ! 287: */ ! 288: extern Class* (*_objc_lookup_class)(const char *name); ! 289: ! 290: extern id (*_objc_object_alloc)(Class* class); ! 291: ! 292: extern id (*_objc_object_copy)(id object); ! 293: ! 294: extern id (*_objc_object_dispose)(id object); ! 295: ! 296: Method_t class_get_class_method(MetaClass* class, SEL aSel); ! 297: ! 298: Method_t class_get_instance_method(Class* class, SEL aSel); ! 299: ! 300: Class* class_pose_as(Class* impostor, Class* superclass); ! 301: ! 302: Class* objc_get_class(const char *name); ! 303: ! 304: Class* objc_lookup_class(const char *name); ! 305: ! 306: const char *sel_get_name(SEL selector); ! 307: ! 308: SEL sel_get_uid(const char *name); ! 309: ! 310: SEL sel_register_name(const char *name); ! 311: ! 312: BOOL sel_is_mapped (SEL aSel); ! 313: ! 314: extern id class_create_instance(Class* class); ! 315: ! 316: static inline const char * ! 317: class_get_class_name(Class* class) ! 318: { ! 319: return CLS_ISCLASS(class)?class->name:((class==Nil)?"Nil":0); ! 320: } ! 321: ! 322: static inline long ! 323: class_get_instance_size(Class* class) ! 324: { ! 325: return CLS_ISCLASS(class)?class->instance_size:0; ! 326: } ! 327: ! 328: static inline MetaClass* ! 329: class_get_meta_class(Class* class) ! 330: { ! 331: return CLS_ISCLASS(class)?class->class_pointer:Nil; ! 332: } ! 333: ! 334: static inline Class* ! 335: class_get_super_class(Class* class) ! 336: { ! 337: return CLS_ISCLASS(class)?class->super_class:Nil; ! 338: } ! 339: ! 340: static inline int ! 341: class_get_version(Class* class) ! 342: { ! 343: return CLS_ISCLASS(class)?class->version:-1; ! 344: } ! 345: ! 346: static inline BOOL ! 347: class_is_class(Class* class) ! 348: { ! 349: return CLS_ISCLASS(class); ! 350: } ! 351: ! 352: static inline BOOL ! 353: class_is_meta_class(Class* class) ! 354: { ! 355: return CLS_ISMETA(class); ! 356: } ! 357: ! 358: ! 359: static inline void ! 360: class_set_version(Class* class, long version) ! 361: { ! 362: if (CLS_ISCLASS(class)) ! 363: class->version = version; ! 364: } ! 365: ! 366: static inline IMP ! 367: method_get_imp(Method_t method) ! 368: { ! 369: return (method!=METHOD_NULL)?method->method_imp:(IMP)0; ! 370: } ! 371: ! 372: IMP get_imp (Class* class, SEL sel); ! 373: ! 374: id object_copy(id object); ! 375: ! 376: id object_dispose(id object); ! 377: ! 378: static inline Class* ! 379: object_get_class(id object) ! 380: { ! 381: return ((object!=nil) ! 382: ? (CLS_ISCLASS(object->class_pointer) ! 383: ? object->class_pointer ! 384: : (CLS_ISMETA(object->class_pointer) ! 385: ? (Class*)object ! 386: : Nil)) ! 387: : Nil); ! 388: } ! 389: ! 390: static inline const char * ! 391: object_get_class_name(id object) ! 392: { ! 393: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 394: ?object->class_pointer->name ! 395: :((Class*)object)->name) ! 396: :"Nil"); ! 397: } ! 398: ! 399: static inline MetaClass* ! 400: object_get_meta_class(id object) ! 401: { ! 402: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 403: ?object->class_pointer->class_pointer ! 404: :(CLS_ISMETA(object->class_pointer) ! 405: ?object->class_pointer ! 406: :Nil)) ! 407: :Nil); ! 408: } ! 409: ! 410: static inline Class* ! 411: object_get_super_class ! 412: (id object) ! 413: { ! 414: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 415: ?object->class_pointer->super_class ! 416: :(CLS_ISMETA(object->class_pointer) ! 417: ?((Class*)object)->super_class ! 418: :Nil)) ! 419: :Nil); ! 420: } ! 421: ! 422: static inline BOOL ! 423: object_is_class(id object) ! 424: { ! 425: return CLS_ISCLASS((Class*)object); ! 426: } ! 427: ! 428: static inline BOOL ! 429: object_is_instance(id object) ! 430: { ! 431: return (object!=nil)&&CLS_ISCLASS(object->class_pointer); ! 432: } ! 433: ! 434: static inline BOOL ! 435: object_is_meta_class(id object) ! 436: { ! 437: return CLS_ISMETA((Class*)object); ! 438: } ! 439: ! 440: #endif /* not __objc_api_INCLUDE_GNU */ ! 441: ! 442: ! 443:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.