|
|
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: ({ assert(CLS_GETNUMBER(cls)==0); \ ! 240: __CLS_SETINFO(cls, (((unsigned long)num) << (HOST_BITS_PER_LONG/2))); }) ! 241: ! 242: /* ! 243: ** The compiler generates one of these structures for each category. A class ! 244: ** may have many categories and contain both instance and factory methods. ! 245: */ ! 246: typedef struct objc_category { ! 247: const char* category_name; /* Name of the category. Name ! 248: contained in the () of the ! 249: category definition. */ ! 250: const char* class_name; /* Name of the class to which ! 251: the category belongs. */ ! 252: MethodList_t instance_methods; /* Linked list of instance ! 253: methods defined in the ! 254: category. NULL indicates no ! 255: instance methods defined. */ ! 256: MethodList_t class_methods; /* Linked list of factory ! 257: methods defined in the ! 258: category. NULL indicates no ! 259: class methods defined. */ ! 260: struct objc_protocol_list *protocols; /* List of Protocols ! 261: conformed to */ ! 262: } Category, *Category_t; ! 263: ! 264: /* ! 265: ** Structure used when a message is send to a class's super class. The ! 266: ** compiler generates one of these structures and passes it to ! 267: ** objc_msg_super. ! 268: */ ! 269: typedef struct objc_super { ! 270: id self; /* Id of the object sending ! 271: the message. */ ! 272: Class* class; /* Object's super class. */ ! 273: } Super, *Super_t; ! 274: ! 275: IMP objc_msg_lookup_super(Super_t super, SEL sel); ! 276: ! 277: retval_t objc_msg_sendv(id, SEL, size_t, arglist_t); ! 278: ! 279: ! 280: ! 281: static const ARGSIZE = 96; /* for `method_get_argsize()' */ ! 282: ! 283: /* ! 284: ** This is a hook which is called by objc_lookup_class and ! 285: ** objc_get_class if the runtime is not able to find the class. ! 286: ** This may e.g. try to load in the class using dynamic loading. ! 287: ** The function is guaranteed to be passed a non-NULL name string. ! 288: */ ! 289: extern Class* (*_objc_lookup_class)(const char *name); ! 290: ! 291: extern id (*_objc_object_alloc)(Class* class); ! 292: ! 293: extern id (*_objc_object_copy)(id object); ! 294: ! 295: extern id (*_objc_object_dispose)(id object); ! 296: ! 297: Method_t class_get_class_method(MetaClass* class, SEL aSel); ! 298: ! 299: Method_t class_get_instance_method(Class* class, SEL aSel); ! 300: ! 301: Class* class_pose_as(Class* impostor, Class* superclass); ! 302: ! 303: Class* objc_get_class(const char *name); ! 304: ! 305: Class* objc_lookup_class(const char *name); ! 306: ! 307: const char *sel_get_name(SEL selector); ! 308: ! 309: SEL sel_get_uid(const char *name); ! 310: ! 311: SEL sel_register_name(const char *name); ! 312: ! 313: BOOL sel_is_mapped (SEL aSel); ! 314: ! 315: extern id class_create_instance(Class* class); ! 316: ! 317: static inline const char * ! 318: class_get_class_name(Class* class) ! 319: { ! 320: return CLS_ISCLASS(class)?class->name:((class==Nil)?"Nil":0); ! 321: } ! 322: ! 323: static inline long ! 324: class_get_instance_size(Class* class) ! 325: { ! 326: return CLS_ISCLASS(class)?class->instance_size:0; ! 327: } ! 328: ! 329: static inline MetaClass* ! 330: class_get_meta_class(Class* class) ! 331: { ! 332: return CLS_ISCLASS(class)?class->class_pointer:Nil; ! 333: } ! 334: ! 335: static inline Class* ! 336: class_get_super_class(Class* class) ! 337: { ! 338: return CLS_ISCLASS(class)?class->super_class:Nil; ! 339: } ! 340: ! 341: static inline int ! 342: class_get_version(Class* class) ! 343: { ! 344: return CLS_ISCLASS(class)?class->version:-1; ! 345: } ! 346: ! 347: static inline BOOL ! 348: class_is_class(Class* class) ! 349: { ! 350: return CLS_ISCLASS(class); ! 351: } ! 352: ! 353: static inline BOOL ! 354: class_is_meta_class(Class* class) ! 355: { ! 356: return CLS_ISMETA(class); ! 357: } ! 358: ! 359: ! 360: static inline void ! 361: class_set_version(Class* class, long version) ! 362: { ! 363: if (CLS_ISCLASS(class)) ! 364: class->version = version; ! 365: } ! 366: ! 367: static inline unsigned int ! 368: method_get_argsize(Method_t method) ! 369: { ! 370: return ARGSIZE; /* This was a magic number (96)... */ ! 371: } ! 372: ! 373: static inline IMP ! 374: method_get_imp(Method_t method) ! 375: { ! 376: return (method!=METHOD_NULL)?method->method_imp:(IMP)0; ! 377: } ! 378: ! 379: IMP get_imp (Class* class, SEL sel); ! 380: ! 381: id object_copy(id object); ! 382: ! 383: id object_dispose(id object); ! 384: ! 385: static inline Class* ! 386: object_get_class(id object) ! 387: { ! 388: return ((object!=nil) ! 389: ? (CLS_ISCLASS(object->class_pointer) ! 390: ? object->class_pointer ! 391: : (CLS_ISMETA(object->class_pointer) ! 392: ? (Class*)object ! 393: : Nil)) ! 394: : Nil); ! 395: } ! 396: ! 397: static inline const char * ! 398: object_get_class_name(id object) ! 399: { ! 400: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 401: ?object->class_pointer->name ! 402: :((Class*)object)->name) ! 403: :"Nil"); ! 404: } ! 405: ! 406: static inline MetaClass* ! 407: object_get_meta_class(id object) ! 408: { ! 409: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 410: ?object->class_pointer->class_pointer ! 411: :(CLS_ISMETA(object->class_pointer) ! 412: ?object->class_pointer ! 413: :Nil)) ! 414: :Nil); ! 415: } ! 416: ! 417: static inline Class* ! 418: object_get_super_class ! 419: (id object) ! 420: { ! 421: return ((object!=nil)?(CLS_ISCLASS(object->class_pointer) ! 422: ?object->class_pointer->super_class ! 423: :(CLS_ISMETA(object->class_pointer) ! 424: ?((Class*)object)->super_class ! 425: :Nil)) ! 426: :Nil); ! 427: } ! 428: ! 429: static inline BOOL ! 430: object_is_class(id object) ! 431: { ! 432: return CLS_ISCLASS((Class*)object); ! 433: } ! 434: ! 435: static inline BOOL ! 436: object_is_instance(id object) ! 437: { ! 438: return (object!=nil)&&CLS_ISCLASS(object->class_pointer); ! 439: } ! 440: ! 441: static inline BOOL ! 442: object_is_meta_class(id object) ! 443: { ! 444: return CLS_ISMETA((Class*)object); ! 445: } ! 446: ! 447: #endif /* not __objc_api_INCLUDE_GNU */ ! 448: ! 449: ! 450:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.