Annotation of gcc/objc/objc-proto.h, revision 1.1.1.1

1.1       root        1: /* Declare functions used within Objective C runtime support.
                      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_proto_INCLUDE_GNU
                     28: #define __objc_proto_INCLUDE_GNU
                     29: 
                     30: /* This used to be #ifndef __OBJC__, but it turns out that
                     31:    object.m needs these declarations.  I don't understand why one
                     32:    might want to avoid them in object.m.  */
                     33: 
                     34: #if 1
                     35: /*
                     36:  * objc_getClass returns the id of the class 
                     37:  *  object for the aClassName class.   The class 
                     38:  *  object holds information used by instances of 
                     39:  *  the class.  
                     40:  *
                     41:  * Print a message to the standard error stream if 
                     42:  *  aClassName isn't part of the executable image.
                     43:  */
                     44: Class_t objc_getClass (const char *);
                     45: 
                     46: /*
                     47:  * objc_getMetaClass returns the id of the 
                     48:  *  meta class object for the aClassName class.  
                     49:  *  The meta class object holds information used 
                     50:  *  by the class object, just as the class 
                     51:  *  object holds information used by instances 
                     52:  *  of the class.  
                     53:  *
                     54:  * Print a message to the standard error stream 
                     55:  *  if aClassName isn't part of the executable image.
                     56:  */
                     57: MetaClass_t objc_getMetaClass (const char *);
                     58: 
                     59: /*
                     60:  * The compiler converts every message expression into a 
                     61:  *  call on one of these two functions.  Messages to 
                     62:  *  super are converted to calls on objc_msgSendSuper; 
                     63:  *  all others are converted to calls on objc_msgSend.
                     64:  *
                     65:  * These functions return the address of the method 
                     66:  *  implementation.  The compiler then generates calls
                     67:  *  to those methods passing the full argument array.
                     68:  *
                     69:  * Calls to objc_msgSend and objc_msgSendSuper 
                     70:  *  should be generated only by the compiler.  You shouldn't 
                     71:  *  call them directly in the Objective-C code you write.
                     72:  */
                     73: IMP objc_msgSend (id, SEL);
                     74: 
                     75: IMP objc_msgSendSuper (Super_t, SEL);
                     76: #endif
                     77: 
                     78: /*
                     79:  * Given the name of a variable within a class's 
                     80:  *  definition, return a pointer to a structure that
                     81:  *  describes it.
                     82:  */
                     83: Ivar_t object_getIvarAddress (id obj, const char *variableName);
                     84: 
                     85: /*
                     86:  * Given a class and a selector, return a pointer to the method's method
                     87:  * structure.  Return NULL if not found. 
                     88:  *
                     89:  * This is a method internal to the run-time. 
                     90:  */
                     91: Method_t searchForMethodInHierarchy (Class_t, SEL);
                     92: 
                     93: 
                     94: /*
                     95:  * The first function, sel_getUid, returns a selector that's 
                     96:  *  used at run time to identify the aName method.  Whenever 
                     97:  *  possible, you should use the @selector directive to 
                     98:  *  ask the compiler, rather than the run-time system, 
                     99:  *  to provide the selector for a method.  This function 
                    100:  *  should be used only if the name isn't known at compile 
                    101:  *  time.
                    102:  *
                    103:  * The second function, sel_getName, is the inverse 
                    104:  *  of the first.  It returns the name that was mapped to 
                    105:  *  aSelector.
                    106:  */
                    107: SEL sel_getUid (const STR);
                    108: 
                    109: const STR sel_getName (SEL);
                    110: 
                    111: /* 
                    112:  * This function returns the number of arguments that METHOD
                    113:  *  the takes.  This will be at least two, since it 
                    114:  *  includes the �hidden� arguments, self and _cmd, 
                    115:  *  which are the first two arguments passed to every 
                    116:  *  method implementation.
                    117:  */
                    118: unsigned int method_getNumberOfArguments (Method_t method);
                    119: 
                    120: /* This functiontakes an index into METHOD's argument 
                    121:  *  list and returns, by reference, the type of the argument 
                    122:  *  and the offset to the location of that argument in the 
                    123:  *  list.  Indices begin with 0.  The �hidden� arguments 
                    124:  *  self and _cmd are indexed at 0 and 1; method-specific 
                    125:  *  arguments begin at index 2.  The offset is measured in 
                    126:  *  bytes and depends on the size of arguments preceding the 
                    127:  *  indexed argument in the argument list.  The type is 
                    128:  *  encoded according to the conventions of the @encode 
                    129:  *  compiler directive.
                    130:  */
                    131: unsigned int method_getArgumentInfo (Method_t, int indx,
                    132:                                     const char **type, int *offset);
                    133: 
                    134: /*
                    135:  * This function is used to support archiving when a unknown class is to read
                    136:  *  from a archive.  This function returns a instantiated object.  To further
                    137:  *  dearchive the object it should be sent: -readFrom:.
                    138:  *
                    139:  * This function positions the file pointer just past class Object's class
                    140:  *  data.
                    141:  */
                    142: id objc_objectFromFile (int fd);
                    143: 
                    144: /*
                    145:  * class_getInstanceMethod returns a pointer 
                    146:  *  to the data structure that describes the method.  
                    147:  *
                    148:  * The selector must identify an 
                    149:  *  instance method.
                    150:  *
                    151:  * Return a NULL pointer if SEL doesn't 
                    152:  *  identify a method defined in or inherited 
                    153:  *  by CLASS.
                    154:  */
                    155: static inline Method_t  
                    156: class_getInstanceMethod (Class_t class, SEL sel)
                    157: {
                    158:   return searchForMethodInHierarchy (class, sel);
                    159: }
                    160: 
                    161: /*
                    162:  * class_getClassMethod returns a pointer to 
                    163:  *  the data structure that describes the method.  
                    164:  *
                    165:  * The selector must identify a class (factory) method.  
                    166:  *
                    167:  * Return a NULL pointer if SEL doesn't 
                    168:  *  identify a method defined in or inherited by CLASS.
                    169:  */
                    170: static inline Method_t  
                    171: class_getClassMethod (MetaClass_t class, SEL sel)
                    172: {
                    173:   return searchForMethodInHierarchy ((Class_t)class, sel);
                    174: }
                    175: 
                    176: /*
                    177:  * This function returns the name of OBJ's 
                    178:  *  class.  anObject should be an instance 
                    179:  *  object, not a class object.
                    180:  */
                    181: static inline const char * 
                    182: object_getClassName (id obj)
                    183: {
                    184:   return obj->class_pointer->name;
                    185: }
                    186: 
                    187: /*
                    188:  * This function returns the name of the 
                    189:  *  class. 
                    190:  */
                    191: static inline const char *
                    192: class_getClassName (Class_t class)
                    193: {
                    194:   return class->name;
                    195: }
                    196: 
                    197: /*
                    198:  * Add a class to the class hash table and assign it a class number. 
                    199:  */
                    200: void addClassToHash (Class_t class);
                    201: 
                    202: /*
                    203:  * This function takes a list of methods and adds them to the method list of
                    204:  * a class.  The method list must remain intact during the lifetime of the
                    205:  * class. 
                    206:  */
                    207: void addMethodsToClass (Class_t, MethodList_t);
                    208: 
                    209: /*
                    210:  * This function creates a new instance of CLASS, initializes its class_pointer
                    211:  * instance variable to point to the class, and return the new instance.  
                    212:  *
                    213:  * All other instance variables are initialized to 0. 
                    214:  */
                    215: static inline id  
                    216: class_createInstance (Class_t class)
                    217: {
                    218:   return (*_alloc)(class);
                    219: }
                    220: 
                    221: /*
                    222:  * object_dispose frees the memory occupied by OBJ after setting its
                    223:  * class_pointer instance variable to nil, and returns nil.  The function it calls to
                    224:  * do this work can be changed by reassigning the _dealloc variable. 
                    225:  */
                    226: static inline id  
                    227: object_dispose (id obj)
                    228: {
                    229:   return (*_dealloc)(obj);
                    230: }
                    231: 
                    232: /*
                    233:  * object_copy creates a new object that's an exact copy of anObject and
                    234:  * return the new object.  The second argument, indexedIvarBytes, specifies
                    235:  * the number of additional bytes that should be allocated for the copy to
                    236:  * accommodate indexed instance variables; it serves the same purpose as the
                    237:  * second argument to class_createInstance.  The function that
                    238:  * object_copy calls to do this work can be changed by reassigning the
                    239:  * _copy variable. 
                    240:  */
                    241: static inline id  
                    242: object_copy (id obj)
                    243: {
                    244:   return (*_copy)(obj);
                    245: }
                    246: 
                    247: /*
                    248:  * object_realloc reallocates storage for anObject, adding numBytes if
                    249:  * possible.  The memory previously occupied by anObject is freed if it can't
                    250:  * be reused, and a pointer to the new location of anObject is returned.  The
                    251:  * function that object_realloc calls to do this work can be changed by
                    252:  * reassigning the _realloc variable. 
                    253:  */
                    254: static inline id  
                    255: object_realloc (id obj, unsigned int size)
                    256: {
                    257:   return (*_realloc)(obj, size);
                    258: }
                    259: 
                    260: /*
                    261:  * This function causes one class to pose as its super class.  Messages sent
                    262:  * to the super class will actually be sent to the posing class. 
                    263:  *
                    264:  * Instance variables should not be declared in the posing class.  The posing
                    265:  * class can add new methods to the class or override existing methods in the
                    266:  * super class. 
                    267:  */
                    268: Class_t class_poseAs (Class_t, Class_t);
                    269: 
                    270: 
                    271: /* These functions set and return the class version number. */
                    272: static inline void 
                    273: class_setVersion (Class_t class, long version)
                    274: {
                    275:   class->version = version ;
                    276:   class->class_pointer->version = version ;
                    277: }
                    278: 
                    279: static inline long
                    280: class_getVersion (Class_t class)
                    281: {
                    282:   return class->version ;
                    283: }
                    284: 
                    285: 
                    286: /*
                    287:  * Class numbers are stored in the class's info variable. This is temporary. 
                    288:  * Eventually we will allocate a member to the class so that some efficiency
                    289:  * can be gained by not shifting. 
                    290:  */
                    291: #define        CLASS_LOCATION_SHIFT (HOST_BITS_PER_LONG / 2)
                    292: 
                    293: static inline void
                    294: setClassNumber (Class_t class, unsigned long number)
                    295: {
                    296:   class->info |= number << CLASS_LOCATION_SHIFT;
                    297: }
                    298: 
                    299: static inline unsigned long
                    300: getClassNumber (Class_t class)
                    301: {
                    302:   return class->info >> CLASS_LOCATION_SHIFT;
                    303: }
                    304: 
                    305: /*
                    306:  * class_addInstanceMethods adds methods that can be 
                    307:  *  used by instances of the class and class_addClassMethods 
                    308:  *  adds methods used by the class object.  Before adding a 
                    309:  *  method, both functions check for duplicates.  A warning 
                    310:  *  is sent to the standard error stream if any ambiguities exist.
                    311:  *
                    312:  * The passed structure and its contents must exist for the the
                    313:  *  duration of the program.  These functions don't support
                    314:  *  linked structures.
                    315:  */
                    316: static inline void  
                    317: class_addInstanceMethods (Class_t class, MethodList_t method_list)
                    318: {
                    319:   addMethodsToClass (class, method_list);
                    320: }
                    321: 
                    322: static inline void  
                    323: class_addClassMethods (Class_t class, MethodList_t method_list)
                    324: {
                    325:   addMethodsToClass ((Class_t)class->class_pointer, method_list);
                    326: }
                    327: 
                    328: /*
                    329:  * This function returns the number of bytes that all of METHOD's
                    330:  *  arguments, taken together, would occupy on the stack.
                    331:  */
                    332: static inline unsigned int 
                    333: method_getSizeOfArguments (Method_t method)
                    334: {
                    335:   return atoi (&method->method_types[1]);
                    336: }
                    337: 
                    338: /*
                    339:  * This function returns the size in bytes of a 
                    340:  *  instance of OBJ.
                    341:  */
                    342: static inline long
                    343: objc_classSize (id obj)
                    344: {
                    345:   return obj->class_pointer->instance_size;
                    346: }
                    347: 
                    348: /* Some functions that I've been told are useful by Henry Flurry */
                    349: 
                    350: /* Returns a C string representing the ASCII rep of the selector. */
                    351: static inline const char *
                    352: SELNAME (SEL sel)
                    353: {
                    354:   return sel_getName (sel);
                    355: }
                    356: 
                    357: /*
                    358:  * Converts a C string to a SEL that can be used in perform: methods,
                    359:  * objc_msgSend, etc. 
                    360:  */
                    361: static inline SEL
                    362: SELUID (const STR str)
                    363: {
                    364:   return sel_getUid (str);
                    365: }
                    366: 
                    367: /*
                    368:  * Returns the class name of the object (or meta class name of a class
                    369:  * object), or some _nilName if obj is nil. 
                    370:  */
                    371: static inline const char *
                    372: NAMEOF (id obj)
                    373: {
                    374:   const char *name = 0;
                    375: 
                    376:   if (obj)
                    377:     {
                    378:       if (obj->class_pointer->info & CLS_CLASS)
                    379:        name = object_getClassName (obj);
                    380:       else if (((Class_t)obj)->class_pointer->info & CLS_META)
                    381:        name = class_getClassName ((Class_t)obj);
                    382:     }
                    383: 
                    384:   return name;
                    385: }
                    386: 
                    387: /*
                    388:  * These functions add and remove methods in a list from a class.  These
                    389:  * functions perform the actual work required for those functions.  
                    390:  *
                    391:  * The appropriate run-time is to provide the user callable functions to
                    392:  * perform these functions.  Typically those functions perform something
                    393:  * specific to their run-time type and call these functions to perform the 
                    394:  * actual work.
                    395:  */ 
                    396: void class_removeMethods (Class_t class, MethodList_t method_list);
                    397: 
                    398: /*
                    399:  * Find the named method in a linked list of methods. 
                    400:  */
                    401: Method_t searchForMethodInList (MethodList_t list, const char *name);
                    402: 
                    403: /*
                    404:  * printf is used if we're debugging.  If DEBUG isn't defined then this
                    405:  * def isn't defined thereby causing the compiler to eliminate the parameter
                    406:  * decl. 
                    407:  */
                    408: #ifdef DEBUG
                    409: #define DEBUG_PRINTF  printf
                    410: #else
                    411: #define DEBUG_PRINTF
                    412: #endif
                    413: 
                    414: 
                    415: /*
                    416:  * Function that dumps information about all of the classes to stdout. 
                    417:  */
                    418: void debug_dump_classes (void);
                    419: 
                    420: #endif /* not __objc_proto_INCLUDE_GNU */
                    421: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.