(root)/
gcc-13.2.0/
libobjc/
objc/
runtime.h
       1  /* GNU Objective-C Runtime API - Modern API
       2     Copyright (C) 2010-2023 Free Software Foundation, Inc.
       3     Contributed by Nicola Pero <nicola.pero@meta-innovation.com>
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify it
       8  under the terms of the GNU General Public License as published by the
       9  Free Software Foundation; either version 3, or (at your option) any
      10  later version.
      11  
      12  GCC is distributed in the hope that it will be useful, but WITHOUT
      13  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      15  License for more details.
      16  
      17  Under Section 7 of GPL version 3, you are granted additional
      18  permissions described in the GCC Runtime Library Exception, version
      19  3.1, as published by the Free Software Foundation.
      20  
      21  You should have received a copy of the GNU General Public License and
      22  a copy of the GCC Runtime Library Exception along with this program;
      23  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      24  <http://www.gnu.org/licenses/>.  */
      25  
      26  #ifndef __objc_runtime_INCLUDE_GNU
      27  #define __objc_runtime_INCLUDE_GNU
      28  
      29  /*
      30    This file declares the "modern" GNU Objective-C Runtime API.
      31  
      32    This API replaced the "traditional" GNU Objective-C Runtime API
      33    (which used to be declared in objc/objc-api.h) which is the one
      34    supported by older versions of the GNU Objective-C Runtime.  The
      35    "modern" API is very similar to the API used by the modern
      36    Apple/NeXT runtime.
      37  */
      38  #include "objc.h"
      39  #include "objc-decls.h"
      40  
      41  #ifdef __cplusplus
      42  extern "C" {
      43  #endif /* __cplusplus */
      44  
      45  /* An 'Ivar' represents an instance variable.  It holds information
      46     about the name, type and offset of the instance variable.  */
      47  typedef struct objc_ivar *Ivar;
      48  
      49  /* A 'Property' represents a property.  It holds information about the
      50     name of the property, and its attributes.
      51  
      52     Compatibility Note: the Apple/NeXT runtime defines this as
      53     objc_property_t, so we define it that way as well, but obviously
      54     Property is the right name.  */
      55  typedef struct objc_property *Property;
      56  typedef struct objc_property *objc_property_t;
      57  
      58  /* A 'Method' represents a method.  It holds information about the
      59     name, types and the IMP of the method.  */
      60  typedef struct objc_method *Method;
      61  
      62  /* A 'Category' represents a category.  It holds information about the
      63     name of the category, the class it belongs to, and the methods,
      64     protocols and such like provided by the category.  */
      65  typedef struct objc_category *Category;
      66  
      67  /* 'Protocol' is defined in objc/objc.h (which is included by this
      68     file).  */
      69  
      70  /* Method descriptor returned by introspective Object methods.  At the
      71     moment, this is really just the first part of the more complete
      72     objc_method structure used internally by the runtime.  (PS: In the
      73     GNU Objective-C Runtime, selectors already include a type, so an
      74     objc_method_description does not add much to a SEL.  But in other
      75     runtimes, that is not the case, which is why
      76     objc_method_description exists).  */
      77  struct objc_method_description
      78  {
      79    SEL name;      /* Selector (name and signature) */
      80    char *types;   /* Type encoding */
      81  };
      82  
      83  /* The following are used in encode strings to describe the type of
      84     Ivars and Methods.  */
      85  #define _C_ID       '@'
      86  #define _C_CLASS    '#'
      87  #define _C_SEL      ':'
      88  #define _C_CHR      'c'
      89  #define _C_UCHR     'C'
      90  #define _C_SHT      's'
      91  #define _C_USHT     'S'
      92  #define _C_INT      'i'
      93  #define _C_UINT     'I'
      94  #define _C_LNG      'l'
      95  #define _C_ULNG     'L'
      96  #define _C_LNG_LNG  'q'
      97  #define _C_ULNG_LNG 'Q'
      98  #define _C_FLT      'f'
      99  #define _C_DBL      'd'
     100  #define _C_LNG_DBL  'D'
     101  #define _C_BFLD     'b'
     102  #define _C_BOOL     'B'
     103  #define _C_VOID     'v'
     104  #define _C_UNDEF    '?'
     105  #define _C_PTR      '^'
     106  #define _C_CHARPTR  '*'
     107  #define _C_ARY_B    '['
     108  #define _C_ARY_E    ']'
     109  #define _C_UNION_B  '('
     110  #define _C_UNION_E  ')'
     111  #define _C_STRUCT_B '{'
     112  #define _C_STRUCT_E '}'
     113  #define _C_VECTOR   '!'
     114  #define _C_COMPLEX  'j'
     115  
     116  /* _C_ATOM is never generated by the compiler.  You can treat it as
     117     equivalent to "*".  */
     118  #define _C_ATOM     '%'
     119  
     120  /* The following are used in encode strings to describe some
     121     qualifiers of method and ivar types.  */
     122  #define _C_CONST	'r'
     123  #define _C_IN		'n'
     124  #define _C_INOUT	'N'
     125  #define _C_OUT      	'o'
     126  #define _C_BYCOPY	'O'
     127  #define _C_BYREF	'R'
     128  #define _C_ONEWAY	'V'
     129  #define _C_GCINVISIBLE	'|'
     130  
     131  /* The same when used as flags.  */
     132  #define _F_CONST	0x01
     133  #define _F_IN		0x01
     134  #define _F_OUT		0x02
     135  #define _F_INOUT	0x03
     136  #define _F_BYCOPY	0x04
     137  #define _F_BYREF	0x08
     138  #define _F_ONEWAY	0x10
     139  #define _F_GCINVISIBLE	0x20
     140  
     141  
     142  /** Implementation: the following functions are defined inline.  */
     143  
     144  /* Return the class of 'object', or Nil if the object is nil.  If
     145     'object' is a class, the meta class is returned; if 'object' is a
     146     meta class, the root meta class is returned (note that this is
     147     different from the traditional GNU Objective-C Runtime API function
     148     object_get_class(), which for a meta class would return the meta
     149     class itself).  This function is inline, so it is really fast and
     150     should be used instead of accessing object->class_pointer
     151     directly.  */
     152  static inline Class
     153  object_getClass (id object)
     154  {
     155    if (object != nil)
     156      return object->class_pointer;
     157    else
     158      return Nil;
     159  }
     160  
     161  
     162  /** Implementation: the following functions are in selector.c.  */
     163  
     164  /* Return the name of a given selector.  If 'selector' is NULL, return
     165     "<null selector>".  */
     166  objc_EXPORT const char *sel_getName (SEL selector);
     167  
     168  /* Return the type of a given selector.  Return NULL if selector is
     169     NULL.
     170  
     171     Compatibility Note: the Apple/NeXT runtime has untyped selectors,
     172     so it does not have this function, which is specific to the GNU
     173     Runtime.  */
     174  objc_EXPORT const char *sel_getTypeEncoding (SEL selector);
     175  
     176  /* This is the same as sel_registerName ().  Please use
     177     sel_registerName () instead.  */
     178  objc_EXPORT SEL sel_getUid (const char *name);
     179  
     180  /* Register a selector with a given name (but unspecified types).  If
     181     you know the types, it is better to call sel_registerTypedName().
     182     If a selector with this name and no types already exists, it is
     183     returned.  Note that this function should really be called
     184     'objc_registerSelector'.  Return NULL if 'name' is NULL.  */
     185  objc_EXPORT SEL sel_registerName (const char *name);
     186  
     187  /* Register a selector with a given name and types.  If a selector
     188     with this name and types already exists, it is returned.  Note that
     189     this function should really be called 'objc_registerTypedSelector',
     190     and it's called 'sel_registerTypedName' only for consistency with
     191     'sel_registerName'.  Return NULL if 'name' is NULL.
     192  
     193     Compatibility Note: the Apple/NeXT runtime has untyped selectors,
     194     so it does not have this function, which is specific to the GNU
     195     Runtime.  */
     196  objc_EXPORT SEL sel_registerTypedName (const char *name, const char *type);
     197  
     198  /* Return YES if first_selector is the same as second_selector, and NO
     199     if not.  */
     200  objc_EXPORT BOOL sel_isEqual (SEL first_selector, SEL second_selector);
     201  
     202  /* Return all the selectors with the supplied name.  In the GNU
     203     runtime, selectors are typed and there may be multiple selectors
     204     with the same name but a different type.  The return value of the
     205     function is a pointer to an area, allocated with malloc(), that
     206     contains all the selectors with the supplier name known to the
     207     runtime.  The list is terminated by NULL.  Optionally, if you pass
     208     a non-NULL 'numberOfReturnedSelectors' pointer, the unsigned int
     209     that it points to will be filled with the number of selectors
     210     returned.
     211  
     212     Compatibility Note: the Apple/NeXT runtime has untyped selectors,
     213     so it does not have this function, which is specific to the GNU
     214     Runtime.  */
     215  objc_EXPORT SEL * sel_copyTypedSelectorList (const char *name,
     216  					     unsigned int *numberOfReturnedSelectors);
     217  
     218  /* Return a selector with name 'name' and a non-zero type encoding, if
     219     there is a single selector with a type, and with that name,
     220     registered with the runtime.  If there is no such selector, or if
     221     there are multiple selectors with the same name but conflicting
     222     types, NULL is returned.  Return NULL if 'name' is NULL.
     223  
     224     This is useful if you have the name of the selector, and would
     225     really like to get a selector for it that includes the type
     226     encoding.  Unfortunately, if the program contains multiple selector
     227     with the same name but different types, sel_getTypedSelector cannot
     228     possibly know which one you need, and so will return NULL.
     229  
     230     Compatibility Note: the Apple/NeXT runtime has untyped selectors,
     231     so it does not have this function, which is specific to the GNU
     232     Runtime.  */
     233  objc_EXPORT SEL sel_getTypedSelector (const char *name);
     234  
     235  
     236  /** Implementation: the following functions are in objects.c.  */
     237  
     238  /* Create an instance of class 'class_', adding extraBytes to the size
     239     of the returned object.  This method allocates the appropriate
     240     amount of memory for the instance, initializes it to zero, then
     241     calls all the C++ constructors on appropriate C++ instance
     242     variables of the instance (if any) (TODO: The C++ constructors bit
     243     is not implemented yet).  */
     244  objc_EXPORT id class_createInstance (Class class_, size_t extraBytes);
     245  
     246  /* Copy an object and return the copy.  extraBytes should be identical
     247     to the extraBytes parameter that was passed when creating the
     248     original object.  */
     249  objc_EXPORT id object_copy (id object, size_t extraBytes);
     250  
     251  /* Dispose of an object.  This method calls the appropriate C++
     252     destructors on appropriate C++ instance variables of the instance
     253     (if any) (TODO: This is not implemented yet), then frees the memory
     254     for the instance.  */
     255  objc_EXPORT id object_dispose (id object);
     256  
     257  /* Return the name of the class of 'object'.  If 'object' is 'nil',
     258     returns "Nil".  */
     259  objc_EXPORT const char * object_getClassName (id object);
     260  
     261  /* Change the class of object to be class_.  Return the previous class
     262     of object.  This is currently not really thread-safe.  */
     263  objc_EXPORT Class object_setClass (id object, Class class_);
     264  
     265  
     266  /** Implementation: the following functions are in ivars.c.  */
     267  
     268  /* Return an instance variable given the class and the instance
     269     variable name.  This is an expensive function to call, so try to
     270     reuse the returned Ivar if you can.  */
     271  objc_EXPORT Ivar class_getInstanceVariable (Class class_, const char *name);
     272  
     273  /* Return a class variable given the class and the class variable
     274     name.  This is an expensive function to call, so try to reuse the
     275     returned Ivar if you can.  
     276     
     277     This function always returns NULL since class variables are
     278     currently unavailable in Objective-C.  */
     279  objc_EXPORT Ivar class_getClassVariable (Class class_, const char *name);
     280  
     281  /* If the object was created in class_createInstance() with some
     282     extraBytes, returns a pointer to them.  If it was not, then the
     283     returned pointer may make no sense.  */
     284  objc_EXPORT void * object_getIndexedIvars (id object);
     285  
     286  /* Get the value of an instance variable of type 'id'.  The function
     287     returns the instance variable.  To get the value of the instance
     288     variable, you should pass as 'returnValue' a pointer to an 'id';
     289     the value will be copied there.  Note that 'returnValue' is really
     290     a 'void *', not a 'void **'.  This function really works only with
     291     instance variables of type 'id'; for other types of instance
     292     variables, access directly the data at (char *)object +
     293     ivar_getOffset (ivar).  */
     294  objc_EXPORT Ivar object_getInstanceVariable (id object, const char *name, void **returnValue);
     295  
     296  /* Set the value of an instance variable.  The value to set is passed
     297     in 'newValue' (which really is an 'id', not a 'void *').  The
     298     function returns the instance variable.  This function really works
     299     only with instance variables of type 'id'; for other types of
     300     instance variables, access directly the data at (char *)object +
     301     ivar_getOffset (ivar).  */
     302  objc_EXPORT Ivar object_setInstanceVariable (id object, const char *name, void *newValue);
     303  
     304  /* Get the value of an instance variable of type 'id' of the object
     305     'object'.  This is faster than object_getInstanceVariable if you
     306     already have the instance variable because it avoids the expensive
     307     call to class_getInstanceVariable that is done by
     308     object_getInstanceVariable.  */
     309  objc_EXPORT id object_getIvar (id object, Ivar variable);
     310  
     311  /* Set the value of an instance variable of type 'id' of the object
     312     'object'.  This is faster than object_setInstanceVariable if you
     313     already have the instance variable because it avoids the expensive
     314     call to class_getInstanceVariable that is done by
     315     object_setInstanceVariable.  */
     316  objc_EXPORT void object_setIvar (id object, Ivar variable, id value);
     317  
     318  /* Return the name of the instance variable.  Return NULL if
     319     'variable' is NULL.  */
     320  objc_EXPORT const char * ivar_getName (Ivar variable);
     321  
     322  /* Return the offset of the instance variable from the start of the
     323     object data.  Return 0 if 'variable' is NULL.  */
     324  objc_EXPORT ptrdiff_t ivar_getOffset (Ivar variable);
     325  
     326  /* Return the type encoding of the variable.  Return NULL if
     327     'variable' is NULL.  */
     328  objc_EXPORT const char * ivar_getTypeEncoding (Ivar variable);
     329  
     330  /* Return all the instance variables of the class.  The return value
     331     of the function is a pointer to an area, allocated with malloc(),
     332     that contains all the instance variables of the class.  It does not
     333     include instance variables of superclasses.  The list is terminated
     334     by NULL.  Optionally, if you pass a non-NULL
     335     'numberOfReturnedIvars' pointer, the unsigned int that it points to
     336     will be filled with the number of instance variables returned.
     337     Return NULL for classes still in construction (ie, allocated using
     338     objc_allocatedClassPair() but not yet registered with the runtime
     339     using objc_registerClassPair()).  */
     340  objc_EXPORT Ivar * class_copyIvarList (Class class_, unsigned int *numberOfReturnedIvars);
     341  
     342  /* Add an instance variable with name 'ivar_name' to class 'class_',
     343     where 'class_' is a class in construction that has been created
     344     using objc_allocateClassPair() and has not been registered with the
     345     runtime using objc_registerClassPair() yet.  You cannot add
     346     instance variables to classes already registered with the runtime.
     347     'size' is the size of the instance variable, 'log_2_of_alignment'
     348     the alignment as a power of 2 (so 0 means alignment to a 1 byte
     349     boundary, 1 means alignment to a 2 byte boundary, 2 means alignment
     350     to a 4 byte boundary, etc), and 'type' the type encoding of the
     351     variable type.  You can use sizeof(), log2(__alignof__()) and
     352     @encode() to determine the right 'size', 'alignment' and 'type' for
     353     your instance variable.  For example, to add an instance variable
     354     name "my_variable" and of type 'id', you can use:
     355  
     356     class_addIvar (class, "my_variable", sizeof (id), log2 ( __alignof__ (id)),
     357                    @encode (id));
     358  
     359     Return YES if the variable was added, and NO if not.  In
     360     particular, return NO if 'class_' is Nil, or a meta-class or a
     361     class not in construction.  Return Nil also if 'ivar_name' or
     362     'type' is NULL, or 'size' is 0.
     363   */
     364  objc_EXPORT BOOL class_addIvar (Class class_, const char * ivar_name, size_t size,
     365  				unsigned char log_2_of_alignment, const char *type);
     366  
     367  /* Return the name of the property.  Return NULL if 'property' is
     368     NULL.  */
     369  objc_EXPORT const char * property_getName (Property property);
     370  
     371  /* Return the attributes of the property as a string.  Return NULL if
     372     'property' is NULL.  */
     373  objc_EXPORT const char * property_getAttributes (Property property);
     374  
     375  /* Return the property with name 'propertyName' of the class 'class_'.
     376     This function returns NULL if the required property cannot be
     377     found.  Return NULL if 'class_' or 'propertyName' is NULL.
     378  
     379     Note that the traditional ABI does not store the list of properties
     380     of a class in a compiled module, so the traditional ABI will always
     381     return NULL.  */
     382  objc_EXPORT Property class_getProperty (Class class_, const char *propertyName);
     383  
     384  /* Return all the properties of the class.  The return value
     385     of the function is a pointer to an area, allocated with malloc(),
     386     that contains all the properties of the class.  It does not
     387     include properties of superclasses.  The list is terminated
     388     by NULL.  Optionally, if you pass a non-NULL
     389     'numberOfReturnedIvars' pointer, the unsigned int that it points to
     390     will be filled with the number of properties returned.
     391  
     392     Note that the traditional ABI does not store the list of properties
     393     of a class in a compiled module, so the traditional ABI will always
     394     return an empty list.  */
     395  objc_EXPORT Property * class_copyPropertyList 
     396  (Class class_, unsigned int *numberOfReturnedProperties);
     397  
     398  /* Return the ivar layout for class 'class_'.
     399  
     400     At the moment this function always returns NULL.  */
     401  objc_EXPORT const char * class_getIvarLayout (Class class_);
     402  
     403  /* Return the weak ivar layout for class 'class_'.
     404  
     405     At the moment this function always returns NULL.  */
     406  objc_EXPORT const char * class_getWeakIvarLayout (Class class_);
     407  
     408  /* Set the ivar layout for class 'class_'.
     409  
     410     At the moment, this function does nothing.  */
     411  objc_EXPORT void class_setIvarLayout (Class class_, const char *layout);
     412  
     413  /* Set the weak ivar layout for class 'class_'.
     414  
     415     At the moment, this function does nothing.  With the GNU runtime,
     416     you should use class_ivar_set_gcinvisible () to hide variables from
     417     the Garbage Collector.  */
     418  objc_EXPORT void class_setWeakIvarLayout (Class class_, const char *layout);
     419  
     420  
     421  /** Implementation: the following functions are in class.c.  */
     422  
     423  /* Compatibility Note: The Apple/NeXT runtime does not have
     424     objc_get_unknown_class_handler and
     425     objc_setGetUnknownClassHandler().  They provide functionality that
     426     the traditional GNU Objective-C Runtime API used to provide via the
     427     _objc_lookup_class hook.  */
     428  
     429  /* An 'objc_get_unknown_class_handler' function is used by
     430     objc_getClass() to get a class that is currently unknown to the
     431     compiler.  You could use it for example to have the class loaded by
     432     dynamically loading a library.  'class_name' is the name of the
     433     class.  The function should return the Class object if it manages to
     434     load the class, and Nil if not.  */
     435  typedef Class (*objc_get_unknown_class_handler)(const char *class_name);
     436  
     437  /* Sets a new handler function for getting unknown classes (to be used
     438     by objc_getClass () and related), and returns the previous one.
     439     This function is not safe to call in a multi-threaded environment
     440     because other threads may be trying to use the get unknown class
     441     handler while you change it!  */
     442  objc_EXPORT 
     443  objc_get_unknown_class_handler
     444  objc_setGetUnknownClassHandler (objc_get_unknown_class_handler new_handler);
     445  
     446  /* Return the class with name 'name', if it is already registered with
     447     the runtime.  If it is not registered, and
     448     objc_setGetUnknownClassHandler() has been called to set a handler
     449     for unknown classes, the handler is called to give it a chance to
     450     load the class in some other way.  If the class is not known to the
     451     runtime and the handler is not set or returns Nil, objc_getClass()
     452     returns Nil.  */
     453  objc_EXPORT Class objc_getClass (const char *name);
     454  
     455  /* Return the class with name 'name', if it is already registered with
     456     the runtime.  Return Nil if not.  This function does not call the
     457     objc_get_unknown_class_handler function if the class is not
     458     found.  */
     459  objc_EXPORT Class objc_lookUpClass (const char *name);
     460  
     461  /* Return the meta class associated to the class with name 'name', if
     462     it is already registered with the runtime.  First, it finds the
     463     class using objc_getClass().  Then, it returns the associated meta
     464     class.  If the class could not be found using objc_getClass(),
     465     returns Nil.  */
     466  objc_EXPORT Class objc_getMetaClass (const char *name);
     467  
     468  /* This is identical to objc_getClass(), but if the class is not found,
     469     it aborts the process instead of returning Nil.  */
     470  objc_EXPORT Class objc_getRequiredClass (const char *name);
     471  
     472  /* If 'returnValue' is NULL, 'objc_getClassList' returns the number of
     473     classes currently registered with the runtime.  If 'returnValue' is
     474     not NULL, it should be a (Class *) pointer to an area of memory
     475     which can contain up to 'maxNumberOfClassesToReturn' Class records.
     476     'objc_getClassList' will fill the area pointed to by 'returnValue'
     477     with all the Classes registered with the runtime (or up to
     478     maxNumberOfClassesToReturn if there are more than
     479     maxNumberOfClassesToReturn).  The function return value is the
     480     number of classes actually returned in 'returnValue'.  */
     481  objc_EXPORT int objc_getClassList (Class *returnValue, int maxNumberOfClassesToReturn); 
     482  
     483  /* Compatibility Note: The Apple/NeXT runtime also has
     484  
     485      Class objc_getFutureClass (const char *name);
     486      void objc_setFutureClass (Class class_, const char *name);
     487  
     488     the documentation is unclear on what they are supposed to do, and
     489     the GNU Objective-C Runtime currently does not provide them.  */
     490  
     491  /* Return the name of the class 'class_', or the string "nil" if the
     492     class_ is Nil.  */
     493  objc_EXPORT const char * class_getName (Class class_);
     494  
     495  /* Return YES if 'class_' is a meta class, and NO if not.  If 'class_'
     496     is Nil, return NO.  */
     497  objc_EXPORT BOOL class_isMetaClass (Class class_);
     498  
     499  /* Return the superclass of 'class_'.  If 'class_' is Nil, or it is a
     500     root class, return Nil.  This function also works if 'class_' is a
     501     class being constructed, that is, a class returned by
     502     objc_allocateClassPair() but before it has been registered with the
     503     runtime using objc_registerClassPair().  */
     504  objc_EXPORT Class class_getSuperclass (Class class_);
     505  
     506  /* Return the 'version' number of the class, which is an integer that
     507     can be used to track changes in the class API, methods and
     508     variables.  If class_ is Nil, return 0.  If class_ is not Nil, the
     509     version is 0 unless class_setVersion() has been called to set a
     510     different one.
     511  
     512     Please note that internally the version is a long, but the API only
     513     allows you to set and retrieve int values.  */
     514  objc_EXPORT int class_getVersion (Class class_);
     515  
     516  /* Set the 'version' number of the class, which is an integer that can
     517     be used to track changes in the class API, methods and variables.
     518     If 'class_' is Nil, does nothing.
     519  
     520     This is typically used internally by "Foundation" libraries such as
     521     GNUstep Base to support serialization / deserialization of objects
     522     that work across changes in the classes.  If you are using such a
     523     library, you probably want to use their versioning API, which may
     524     be based on this one, but is integrated with the rest of the
     525     library.
     526  
     527     Please note that internally the version is a long, but the API only
     528     allows you to set and retrieve int values.  */
     529  objc_EXPORT void class_setVersion (Class class_, int version);
     530  
     531  /* Return the size in bytes (a byte is the size of a char) of an
     532     instance of the class.  If class_ is Nil, return 0; else it return
     533     a non-zero number (since the 'isa' instance variable is required
     534     for all classes).  */
     535  objc_EXPORT size_t class_getInstanceSize (Class class_);
     536  
     537  /* Change the implementation of the method.  It also searches all
     538     classes for any class implementing the method, and replaces the
     539     existing implementation with the new one.  For that to work,
     540     'method' must be a method returned by class_getInstanceMethod() or
     541     class_getClassMethod() as the matching is done by comparing the
     542     pointers; in that case, only the implementation in the class is
     543     modified.  Return the previous implementation that has been
     544     replaced.  If method or implementation is NULL, do nothing and
     545     return NULL.  */
     546  objc_EXPORT IMP
     547  method_setImplementation (Method method, IMP implementation);
     548  
     549  /* Swap the implementation of two methods in a single, atomic
     550     operation.  This is equivalent to getting the implementation of
     551     each method and then calling method_setImplementation() on the
     552     other one.  For this to work, the two methods must have been
     553     returned by class_getInstanceMethod() or class_getClassMethod().
     554     If 'method_a' or 'method_b' is NULL, do nothing.  */
     555  objc_EXPORT void
     556  method_exchangeImplementations (Method method_a, Method method_b);
     557  
     558  /* Create a new class/meta-class pair.  This function is called to
     559     create a new class at runtime.  The class is created with
     560     superclass 'superclass' (use 'Nil' to create a new root class) and
     561     name 'class_name'.  'extraBytes' can be used to specify some extra
     562     space for indexed variables to be added at the end of the class and
     563     meta-class objects (it is recommended that you set extraBytes to
     564     0).  Once you have created the class, it is not usable yet.  You
     565     need to add any instance variables (by using class_addIvar()), any
     566     instance methods (by using class_addMethod()) and any class methods
     567     (by using class_addMethod() on the meta-class, as in
     568     class_addMethod (object_getClass (class), method)) that are
     569     required, and then you need to call objc_registerClassPair() to
     570     activate the class.  If you need to create a hierarchy of classes,
     571     you need to create and register them one at a time.  You cannot
     572     create a new class using another class in construction as
     573     superclass.  Return Nil if 'class-name' is NULL or if a class with
     574     that name already exists or 'superclass' is a class still in
     575     construction.
     576  
     577     Implementation Note: in the GNU runtime, allocating a class pair
     578     only creates the structures for the class pair, but does not
     579     register anything with the runtime.  The class is registered with
     580     the runtime only when objc_registerClassPair() is called.  In
     581     particular, if a class is in construction, objc_getClass() will not
     582     find it, the superclass will not know about it,
     583     class_getSuperclass() will return Nil and another thread may
     584     allocate a class pair with the same name; the conflict will only be
     585     detected when the classes are registered with the runtime.
     586   */
     587  objc_EXPORT Class
     588  objc_allocateClassPair (Class super_class, const char *class_name, 
     589  			size_t extraBytes);
     590  
     591  /* Register a class pair that was created with
     592     objc_allocateClassPair().  After you register a class, you can no
     593     longer make changes to its instance variables, but you can start
     594     creating instances of it.  Do nothing if 'class_' is NULL or if it
     595     is not a class allocated by objc_allocateClassPair() and still in
     596     construction.  */
     597  objc_EXPORT void
     598  objc_registerClassPair (Class class_);
     599  
     600  /* Dispose of a class pair created using objc_allocateClassPair().
     601     Call this function if you started creating a new class with
     602     objc_allocateClassPair() but then want to abort the process.  You
     603     should not access 'class_' after calling this method.  Note that if
     604     'class_' has already been registered with the runtime via
     605     objc_registerClassPair(), this function does nothing; you can only
     606     dispose of class pairs that are still being constructed.  Do
     607     nothing if class is 'Nil' or if 'class_' is not a class being
     608     constructed.  */
     609  objc_EXPORT void
     610  objc_disposeClassPair (Class class_);
     611  
     612  /* Compatibility Note: The Apple/NeXT runtime has the function
     613     objc_duplicateClass () but it's undocumented.  The GNU runtime does
     614     not have it.  */
     615  
     616  
     617  /** Implementation: the following functions are in sendmsg.c.  */
     618  
     619  /* Return the instance method with selector 'selector' of class
     620     'class_', or NULL if the class (or one of its superclasses) does
     621     not implement the method.  Return NULL if class_ is Nil or selector
     622     is NULL.  Calling this function may trigger a call to
     623     +resolveInstanceMethod:, but does not return a forwarding
     624     function.  */
     625  objc_EXPORT Method class_getInstanceMethod (Class class_, SEL selector);
     626  
     627  /* Return the class method with selector 'selector' of class 'class_',
     628     or NULL if the class (or one of its superclasses) does not
     629     implement the method.  Return NULL if class_ is Nil or selector is
     630     NULL.  Calling this function may trigger a call to
     631     +resolveClassMethod:, but does not return a forwarding
     632     function.  */
     633  objc_EXPORT Method class_getClassMethod (Class class_, SEL selector);
     634  
     635  /* Return the IMP (pointer to the function implementing a method) for
     636     the instance method with selector 'selector' in class 'class_'.
     637     This is the same routine that is used while messaging, and should
     638     be very fast.  Note that you most likely would need to cast the
     639     return function pointer to a function pointer with the appropriate
     640     arguments and return type before calling it.  To get a class
     641     method, you can pass the meta-class as the class_ argument (ie, use
     642     class_getMethodImplementation (object_getClass (class_),
     643     selector)).  Return NULL if class_ is Nil or selector is NULL.
     644     This function first looks for an existing method; if it is not
     645     found, it calls +resolveClassMethod: or +resolveInstanceMethod:
     646     (depending on whether a class or instance method is being looked
     647     up) if it is implemented.  If the method returns YES, then it tries
     648     the look up again (the assumption being that +resolveClassMethod:
     649     or resolveInstanceMethod: will add the method using
     650     class_addMethod()).  If it is still not found, it returns a
     651     forwarding function.  */
     652  objc_EXPORT IMP class_getMethodImplementation (Class class_, SEL selector);
     653  
     654  /* Compatibility Note: the Apple/NeXT runtime has the function
     655     class_getMethodImplementation_stret () which currently does not
     656     exist on the GNU runtime because the messaging implementation is
     657     different.  */
     658  
     659  /* Return YES if class 'class_' has an instance method implementing
     660     selector 'selector', and NO if not.  Return NO if class_ is Nil or
     661     selector is NULL.  If you need to check a class method, use the
     662     meta-class as the class_ argument (ie, use class_respondsToSelector
     663     (object_getClass (class_), selector)).  */
     664  objc_EXPORT BOOL class_respondsToSelector (Class class_, SEL selector);
     665  
     666  /* Add a method to a class.  Use this function to add a new method to
     667     a class (potentially overriding a method with the same selector in
     668     the superclass); if you want to modify an existing method, use
     669     method_setImplementation() instead (or class_replaceMethod ()).
     670     This method adds an instance method to 'class_'; to add a class
     671     method, get the meta class first, then add the method to the meta
     672     class, that is, use
     673  
     674     class_addMethod (object_getClass (class_), selector,
     675     implementation, type);
     676  
     677     Return YES if the method was added, and NO if not.  Do nothing if
     678     one of the arguments is NULL.  */
     679  objc_EXPORT BOOL class_addMethod (Class class_, SEL selector, IMP implementation,
     680  				  const char *method_types);
     681  
     682  /* Replace a method in a class.  If the class already have a method
     683     with this 'selector', find it and use method_setImplementation() to
     684     replace the implementation with 'implementation' (method_types is
     685     ignored in that case).  If the class does not already have a method
     686     with this 'selector', call 'class_addMethod() to add it.
     687  
     688     Return the previous implementation of the method, or NULL if none
     689     was found.  Return NULL if any of the arguments is NULL.  */
     690  objc_EXPORT IMP class_replaceMethod (Class class_, SEL selector, IMP implementation,
     691  				     const char *method_types);
     692  
     693  
     694  /** Implementation: the following functions are in methods.c.  */
     695  
     696  /* Return the selector for method 'method'.  Return NULL if 'method'
     697     is NULL.
     698  
     699     This function is misnamed; it should be called
     700     'method_getSelector'.  To get the actual name, get the selector,
     701     then the name from the selector (ie, use sel_getName
     702     (method_getName (method))).  */
     703  objc_EXPORT SEL method_getName (Method method);
     704  
     705  /* Return the IMP of the method.  Return NULL if 'method' is NULL.  */
     706  objc_EXPORT IMP method_getImplementation (Method method);
     707  
     708  /* Return the type encoding of the method.  Return NULL if 'method' is
     709     NULL.  */
     710  objc_EXPORT const char * method_getTypeEncoding (Method method);
     711  
     712  /* Return a method description for the method.  Return NULL if
     713     'method' is NULL.  */
     714  objc_EXPORT struct objc_method_description * method_getDescription (Method method);
     715  
     716  /* Return all the instance methods of the class.  The return value of
     717     the function is a pointer to an area, allocated with malloc(), that
     718     contains all the instance methods of the class.  It does not
     719     include instance methods of superclasses.  The list is terminated
     720     by NULL.  Optionally, if you pass a non-NULL
     721     'numberOfReturnedMethods' pointer, the unsigned int that it points
     722     to will be filled with the number of instance methods returned.  To
     723     get the list of class methods, pass the meta-class in the 'class_'
     724     argument, (ie, use class_copyMethodList (object_getClass (class_),
     725     &numberOfReturnedMethods)).  */
     726  objc_EXPORT Method * class_copyMethodList (Class class_, unsigned int *numberOfReturnedMethods);
     727  
     728  
     729  /** Implementation: the following functions are in encoding.c.  */
     730  
     731  /* Return the number of arguments that the method 'method' expects.
     732     Note that all methods need two implicit arguments ('self' for the
     733     receiver, and '_cmd' for the selector).  Return 0 if 'method' is
     734     NULL.  */
     735  objc_EXPORT unsigned int method_getNumberOfArguments (Method method);
     736  
     737  /* Return the string encoding for the return type of method 'method'.
     738     The string is a standard zero-terminated string in an area of
     739     memory allocated with malloc(); you should free it with free() when
     740     you finish using it.  Return an empty string if method is NULL.  */
     741  objc_EXPORT char * method_copyReturnType (Method method);
     742  
     743  /* Return the string encoding for the argument type of method
     744     'method', argument number 'argumentNumber' ('argumentNumber' is 0
     745     for self, 1 for _cmd, and 2 or more for the additional arguments if
     746     any).  The string is a standard zero-terminated string in an area
     747     of memory allocated with malloc(); you should free it with free()
     748     when you finish using it.  Return an empty string if method is NULL
     749     or if 'argumentNumber' refers to a non-existing argument.  */
     750  objc_EXPORT char * method_copyArgumentType (Method method, unsigned int argumentNumber);
     751  
     752  /* Return the string encoding for the return type of method 'method'.
     753     The string is returned by copying it into the supplied
     754     'returnValue' string, which is of size 'returnValueSize'.  No more
     755     than 'returnValueSize' characters are copied; if the encoding is
     756     smaller than 'returnValueSize', the rest of 'returnValue' is filled
     757     with zeros.  If it is bigger, it is truncated (and would not be
     758     zero-terminated).  You should supply a big enough
     759     'returnValueSize'.  If the method is NULL, returnValue is set to a
     760     string of zeros.  */
     761  objc_EXPORT void method_getReturnType (Method method, char *returnValue, 
     762  				       size_t returnValueSize);
     763  
     764  /* Return the string encoding for the argument type of method
     765     'method', argument number 'argumentNumber' ('argumentNumber' is 0
     766     for self, 1 for _cmd, and 2 or more for the additional arguments if
     767     any).  The string is returned by copying it into the supplied
     768     'returnValue' string, which is of size 'returnValueSize'.  No more
     769     than 'returnValueSize' characters are copied; if the encoding is
     770     smaller than 'returnValueSize', the rest of 'returnValue' is filled
     771     with zeros.  If it is bigger, it is truncated (and would not be
     772     zero-terminated).  You should supply a big enough
     773     'returnValueSize'.  If the method is NULL, returnValue is set to a
     774     string of zeros.  */
     775  objc_EXPORT void method_getArgumentType (Method method, unsigned int argumentNumber,
     776  					 char *returnValue, size_t returnValueSize);
     777  
     778  
     779  /** Implementation: the following functions are in protocols.c.  */
     780  
     781  /* Return the protocol with name 'name', or nil if it the protocol is
     782     not known to the runtime.  */
     783  objc_EXPORT Protocol *objc_getProtocol (const char *name);
     784  
     785  /* Return all the protocols known to the runtime.  The return value of
     786     the function is a pointer to an area, allocated with malloc(), that
     787     contains all the protocols known to the runtime; the list is
     788     terminated by NULL.  You should free this area using free() once
     789     you no longer need it.  Optionally, if you pass a non-NULL
     790     'numberOfReturnedProtocols' pointer, the unsigned int that it
     791     points to will be filled with the number of protocols returned.  If
     792     there are no protocols known to the runtime, NULL is returned.  */
     793  objc_EXPORT Protocol **objc_copyProtocolList (unsigned int *numberOfReturnedProtocols);
     794  
     795  /* Add a protocol to a class, and return YES if it was done
     796     successfully, and NO if not.  At the moment, NO should only happen
     797     if class_ or protocol are nil, if the protocol is not a Protocol
     798     object or if the class already conforms to the protocol.  */
     799  objc_EXPORT BOOL class_addProtocol (Class class_, Protocol *protocol);
     800  
     801  /* Return YES if the class 'class_' conforms to Protocol 'protocol',
     802     and NO if not.  This function does not check superclasses; if you
     803     want to check for superclasses (in the way that [NSObject
     804     +conformsToProtocol:] does) you need to iterate over the class
     805     hierarchy using class_getSuperclass(), and call
     806     class_conformsToProtocol() for each of them.  */
     807  objc_EXPORT BOOL class_conformsToProtocol (Class class_, Protocol *protocol);
     808  
     809  /* Return all the protocols that the class conforms to.  The return
     810     value of the function is a pointer to an area, allocated with
     811     malloc(), that contains all the protocols formally adopted by the
     812     class.  It does not include protocols adopted by superclasses.  The
     813     list is terminated by NULL.  Optionally, if you pass a non-NULL
     814     'numberOfReturnedProtocols' pointer, the unsigned int that it
     815     points to will be filled with the number of protocols returned.
     816     This function does not return protocols that superclasses conform
     817     to.  */
     818  objc_EXPORT Protocol **class_copyProtocolList (Class class_, unsigned int *numberOfReturnedProtocols);
     819  
     820  /* Return YES if protocol 'protocol' conforms to protocol
     821     'anotherProtocol', and NO if not.  Note that if one of the two
     822     protocols is nil, it returns NO.  */
     823  objc_EXPORT BOOL protocol_conformsToProtocol (Protocol *protocol, Protocol *anotherProtocol);
     824  
     825  /* Return YES if protocol 'protocol' is the same as protocol
     826     'anotherProtocol', and 'NO' if not.  Note that it returns YES if
     827     the two protocols are both nil.  */
     828  objc_EXPORT BOOL protocol_isEqual (Protocol *protocol, Protocol *anotherProtocol);
     829  
     830  /* Return the name of protocol 'protocol'.  If 'protocol' is nil or is
     831     not a Protocol, return NULL.  */
     832  objc_EXPORT const char *protocol_getName (Protocol *protocol);
     833  
     834  /* Return the method description for the method with selector
     835     'selector' in protocol 'protocol'; if 'requiredMethod' is YES, the
     836     function searches the list of required methods; if NO, the list of
     837     optional methods.  If 'instanceMethod' is YES, the function search
     838     for an instance method; if NO, for a class method.  If there is no
     839     matching method, an objc_method_description structure with both
     840     name and types set to NULL is returned.  This function will only
     841     find methods that are directly declared in the protocol itself, not
     842     in other protocols that this protocol adopts.
     843  
     844     Note that the traditional ABI does not store the list of optional
     845     methods of a protocol in a compiled module, so the traditional ABI
     846     will always return (NULL, NULL) when requiredMethod == NO.  */
     847  objc_EXPORT struct objc_method_description protocol_getMethodDescription (Protocol *protocol, 
     848  									  SEL selector,
     849  									  BOOL requiredMethod,
     850  									  BOOL instanceMethod);
     851  
     852  /* Return the method descriptions of all the methods of the protocol.
     853     The return value of the function is a pointer to an area, allocated
     854     with malloc(), that contains all the method descriptions of the
     855     methods of the protocol.  It does not recursively include methods
     856     of the protocols adopted by this protocol.  The list is terminated
     857     by a NULL objc_method_description (one with both fields set to
     858     NULL).  Optionally, if you pass a non-NULL
     859     'numberOfReturnedMethods' pointer, the unsigned int that it points
     860     to will be filled with the number of properties returned.
     861  
     862     Note that the traditional ABI does not store the list of optional
     863     methods of a protocol in a compiled module, so the traditional ABI
     864     will always return an empty list if requiredMethod is set to
     865     NO.  */
     866  objc_EXPORT struct objc_method_description *protocol_copyMethodDescriptionList (Protocol *protocol,
     867  										BOOL requiredMethod,
     868  										BOOL instanceMethod,
     869  										unsigned int *numberOfReturnedMethods);
     870  
     871  /* Return the property with name 'propertyName' of the protocol
     872     'protocol'.  If 'requiredProperty' is YES, the function searches
     873     the list of required properties; if NO, the list of optional
     874     properties.  If 'instanceProperty' is YES, the function searches
     875     the list of instance properties; if NO, the list of class
     876     properties.  At the moment, optional properties and class
     877     properties are not part of the Objective-C language, so both
     878     'requiredProperty' and 'instanceProperty' should be set to YES.
     879     This function returns NULL if the required property cannot be
     880     found.
     881  
     882     Note that the traditional ABI does not store the list of properties
     883     of a protocol in a compiled module, so the traditional ABI will
     884     always return NULL.  */
     885  objc_EXPORT Property protocol_getProperty (Protocol *protocol, const char *propertyName, 
     886  					   BOOL requiredProperty, BOOL instanceProperty);
     887  
     888  /* Return all the properties of the protocol.  The return value of the
     889     function is a pointer to an area, allocated with malloc(), that
     890     contains all the properties of the protocol.  It does not
     891     recursively include properties of the protocols adopted by this
     892     protocol.  The list is terminated by NULL.  Optionally, if you pass
     893     a non-NULL 'numberOfReturnedProperties' pointer, the unsigned int
     894     that it points to will be filled with the number of properties
     895     returned.
     896  
     897     Note that the traditional ABI does not store the list of properties
     898     of a protocol in a compiled module, so the traditional ABI will
     899     always return NULL and store 0 in numberOfReturnedProperties.  */
     900  objc_EXPORT Property *protocol_copyPropertyList (Protocol *protocol, unsigned int *numberOfReturnedProperties);
     901  
     902  /* Return all the protocols that the protocol conforms to.  The return
     903     value of the function is a pointer to an area, allocated with
     904     malloc(), that contains all the protocols formally adopted by the
     905     protocol.  It does not recursively include protocols adopted by the
     906     protocols adopted by this protocol.  The list is terminated by
     907     NULL.  Optionally, if you pass a non-NULL
     908     'numberOfReturnedProtocols' pointer, the unsigned int that it
     909     points to will be filled with the number of protocols returned.  */
     910  objc_EXPORT Protocol **protocol_copyProtocolList (Protocol *protocol, unsigned int *numberOfReturnedProtocols);
     911  
     912  
     913  /** Implementation: the following hook is in init.c.  */
     914  
     915  /* This is a hook which is called by __objc_exec_class every time a
     916     class or a category is loaded into the runtime.  This may e.g. help
     917     a dynamic loader determine the classes that have been loaded when
     918     an object file is dynamically linked in.  */
     919  objc_EXPORT void (*_objc_load_callback)(Class _class, struct objc_category *category);
     920  
     921  
     922  /** Implementation: the following functions are in objc-foreach.c.  */
     923  
     924  /* 'objc_enumerationMutation()' is called when a collection is
     925     mutated while being "fast enumerated".  That is a hard error, and
     926     objc_enumerationMutation is called to deal with it.  'collection'
     927     is the collection object that was mutated during an enumeration.
     928  
     929     objc_enumerationMutation() will invoke the mutation handler if any
     930     is set.  Then, it will abort the program.
     931  
     932     Compatibility note: the Apple runtime will not abort the program
     933     after calling the mutation handler.  */
     934  objc_EXPORT void objc_enumerationMutation (id collection);
     935  
     936  /* 'objc_set_enumeration_mutation_handler' can be used to set a
     937     function that will be called (instead of aborting) when a fast
     938     enumeration is mutated during enumeration.  The handler will be
     939     called with the 'collection' being mutated as the only argument and
     940     it should not return; it should either exit the program, or could
     941     throw an exception.  The recommended implementation is to throw an
     942     exception - the user can then use exception handlers to deal with
     943     it.
     944  
     945     This function is not thread safe (other threads may be trying to
     946     invoke the enumeration mutation handler while you are changing it!)
     947     and should be called during during the program initialization
     948     before threads are started.  It is mostly reserved for "Foundation"
     949     libraries; in the case of GNUstep, GNUstep Base may be using this
     950     function to improve the standard enumeration mutation handling.
     951     You probably shouldn't use this function unless you are writing
     952     your own Foundation library.  */
     953  objc_EXPORT void objc_setEnumerationMutationHandler (void (*handler)(id));
     954  
     955  /* This structure (used during fast enumeration) is automatically
     956     defined by the compiler (it is as if this definition was always
     957     included in all Objective-C files).  Note that it is usually
     958     defined again with the name of NSFastEnumeration by "Foundation"
     959     libraries such as GNUstep Base.  And if NSFastEnumeration is
     960     defined, the compiler will use it instead of
     961     __objcFastEnumerationState when doing fast enumeration.  */
     962  /*
     963  struct __objcFastEnumerationState
     964  {
     965    unsigned long state;
     966    id            *itemsPtr;
     967    unsigned long *mutationsPtr;
     968    unsigned long extra[5];
     969  };
     970  */
     971  
     972  
     973  /* Compatibility Note: The Apple/NeXT runtime has the functions
     974     objc_copyImageNames (), class_getImageName () and
     975     objc_copyClassNamesForImage () but they are undocumented.  The GNU
     976     runtime does not have them at the moment.  */
     977  
     978  /* Compatibility Note: The Apple/NeXT runtime has the functions
     979     objc_setAssociatedObject (), objc_getAssociatedObject (),
     980     objc_removeAssociatedObjects () and the objc_AssociationPolicy type
     981     and related enum.  The GNU runtime does not have them yet.
     982     TODO: Implement them.  */
     983  
     984  /* Compatibility Note: The Apple/NeXT runtime has the function
     985     objc_setForwardHandler ().  The GNU runtime does not have it
     986     because messaging (and, in particular, forwarding) works in a
     987     different (incompatible) way with the GNU runtime.  If you need to
     988     customize message forwarding at the Objective-C runtime level (that
     989     is, if you are implementing your own "Foundation" library such as
     990     GNUstep Base on top of the Objective-C runtime), in objc/message.h
     991     there are hooks (that work in the framework of the GNU runtime) to
     992     do so.  */
     993  
     994  
     995  /** Implementation: the following functions are in memory.c.  */
     996  
     997  /* Traditional GNU Objective-C Runtime functions that are used for
     998     memory allocation and disposal.  These functions are used in the
     999     same way as you use malloc, realloc, calloc and free and make sure
    1000     that memory allocation works properly with the garbage
    1001     collector.
    1002  
    1003     Compatibility Note: these functions are not available with the
    1004     Apple/NeXT runtime.  */
    1005  
    1006  objc_EXPORT void *objc_malloc(size_t size);
    1007  
    1008  /* FIXME: Shouldn't the following be called objc_malloc_atomic ?  The
    1009     GC function is GC_malloc_atomic() which makes sense.
    1010   */
    1011  objc_EXPORT void *objc_atomic_malloc(size_t size);
    1012  
    1013  objc_EXPORT void *objc_realloc(void *mem, size_t size);
    1014  
    1015  objc_EXPORT void *objc_calloc(size_t nelem, size_t size);
    1016  
    1017  objc_EXPORT void objc_free(void *mem);
    1018  
    1019  
    1020  /** Implementation: the following functions are in gc.c.  */
    1021  
    1022  /* The GNU Objective-C Runtime has a different implementation of
    1023     garbage collection.
    1024  
    1025     Compatibility Note: these functions are not available with the
    1026     Apple/NeXT runtime.  */
    1027  
    1028  /* Mark the instance variable as inaccessible to the garbage
    1029     collector.  */
    1030  objc_EXPORT void class_ivar_set_gcinvisible (Class _class,
    1031  					     const char* ivarname,
    1032  					     BOOL gcInvisible);
    1033  
    1034  
    1035  /** Implementation: the following functions are in encoding.c.  */
    1036  
    1037  /* Traditional GNU Objective-C Runtime functions that are currently
    1038     used to implement method forwarding.
    1039  
    1040     Compatibility Note: these functions are not available with the
    1041     Apple/NeXT runtime.  */
    1042  
    1043  /* Return the size of a variable which has the specified 'type'
    1044     encoding.  */
    1045  objc_EXPORT int objc_sizeof_type (const char *type);
    1046  
    1047  /* Return the align of a variable which has the specified 'type'
    1048     encoding.  */
    1049  objc_EXPORT int objc_alignof_type (const char *type);
    1050  
    1051  /* Return the aligned size of a variable which has the specified
    1052     'type' encoding.  The aligned size is the size rounded up to the
    1053     nearest alignment.  */
    1054  objc_EXPORT int objc_aligned_size (const char *type);
    1055  
    1056  /* Return the promoted size of a variable which has the specified
    1057     'type' encoding.  This is the size rounded up to the nearest
    1058     integral of the wordsize, taken to be the size of a void *.  */
    1059  objc_EXPORT int objc_promoted_size (const char *type);
    1060  
    1061  
    1062  /* The following functions are used when parsing the type encoding of
    1063     methods, to skip over parts that are ignored.  They take as
    1064     argument a pointer to a location inside the type encoding of a
    1065     method (which is a string) and return a new pointer, pointing to a
    1066     new location inside the string after having skipped the unwanted
    1067     information.  */
    1068  
    1069  /* Skip some type qualifiers (_C_CONST, _C_IN, etc).  These may
    1070    eventually precede typespecs occurring in method prototype
    1071    encodings.  */
    1072  objc_EXPORT const char *objc_skip_type_qualifiers (const char *type);
    1073  
    1074  /* Skip one typespec element (_C_CLASS, _C_SEL, etc).  If the typespec
    1075    is prepended by type qualifiers, these are skipped as well.  */
    1076  objc_EXPORT const char *objc_skip_typespec (const char *type);
    1077  
    1078  /* Skip an offset.  */
    1079  objc_EXPORT const char *objc_skip_offset (const char *type);
    1080  
    1081  /* Skip an argument specification (ie, skipping a typespec, which may
    1082     include qualifiers, and an offset too).  */
    1083  objc_EXPORT const char *objc_skip_argspec (const char *type);
    1084  
    1085  /* Read type qualifiers (_C_CONST, _C_IN, etc) from string 'type'
    1086     (stopping at the first non-type qualifier found) and return an
    1087     unsigned int which is the logical OR of all the corresponding flags
    1088     (_F_CONST, _F_IN etc).  */
    1089  objc_EXPORT unsigned objc_get_type_qualifiers (const char *type);
    1090  
    1091  
    1092  /* Note that the following functions work for very simple structures,
    1093     but get easily confused by more complicated ones (for example,
    1094     containing vectors).  A better solution is required.  These
    1095     functions are likely to change in the next GCC release.  */
    1096  
    1097  /* The following three functions can be used to determine how a
    1098     structure is laid out by the compiler. For example:
    1099  
    1100    struct objc_struct_layout layout;
    1101    int i;
    1102  
    1103    objc_layout_structure (type, &layout);
    1104    while (objc_layout_structure_next_member (&layout))
    1105      {
    1106        int position, align;
    1107        const char *type;
    1108  
    1109        objc_layout_structure_get_info (&layout, &position, &align, &type);
    1110        printf ("element %d has offset %d, alignment %d\n",
    1111                i++, position, align);
    1112      }
    1113  
    1114    These functions are used by objc_sizeof_type and objc_alignof_type
    1115    functions to compute the size and alignment of structures. The
    1116    previous method of computing the size and alignment of a structure
    1117    was not working on some architectures, particularly on AIX, and in
    1118    the presence of bitfields inside the structure.  */
    1119  struct objc_struct_layout
    1120  {
    1121    const char *original_type;
    1122    const char *type;
    1123    const char *prev_type;
    1124    unsigned int record_size;
    1125    unsigned int record_align;
    1126  };
    1127  
    1128  objc_EXPORT void objc_layout_structure (const char *type,
    1129                              struct objc_struct_layout *layout);
    1130  objc_EXPORT BOOL  objc_layout_structure_next_member (struct objc_struct_layout *layout);
    1131  objc_EXPORT void objc_layout_finish_structure (struct objc_struct_layout *layout,
    1132  					       unsigned int *size,
    1133  					       unsigned int *align);
    1134  objc_EXPORT void objc_layout_structure_get_info (struct objc_struct_layout *layout,
    1135  						 unsigned int *offset,
    1136  						 unsigned int *align,
    1137  						 const char **type);
    1138  
    1139  #ifdef __cplusplus
    1140  }
    1141  #endif /* __cplusplus */
    1142  
    1143  #endif