| /* GNU Objective-C Runtime API - Modern API |
| Copyright (C) 2010-2022 Free Software Foundation, Inc. |
| Contributed by Nicola Pero <nicola.pero@meta-innovation.com> |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify it |
| under the terms of the GNU General Public License as published by the |
| Free Software Foundation; either version 3, or (at your option) any |
| later version. |
| |
| GCC is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
| License for more details. |
| |
| Under Section 7 of GPL version 3, you are granted additional |
| permissions described in the GCC Runtime Library Exception, version |
| 3.1, as published by the Free Software Foundation. |
| |
| You should have received a copy of the GNU General Public License and |
| a copy of the GCC Runtime Library Exception along with this program; |
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef __objc_runtime_INCLUDE_GNU |
| #define __objc_runtime_INCLUDE_GNU |
| |
| /* |
| This file declares the "modern" GNU Objective-C Runtime API. |
| |
| This API replaced the "traditional" GNU Objective-C Runtime API |
| (which used to be declared in objc/objc-api.h) which is the one |
| supported by older versions of the GNU Objective-C Runtime. The |
| "modern" API is very similar to the API used by the modern |
| Apple/NeXT runtime. |
| */ |
| #include "objc.h" |
| #include "objc-decls.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif /* __cplusplus */ |
| |
| /* An 'Ivar' represents an instance variable. It holds information |
| about the name, type and offset of the instance variable. */ |
| typedef struct objc_ivar *Ivar; |
| |
| /* A 'Property' represents a property. It holds information about the |
| name of the property, and its attributes. |
| |
| Compatibility Note: the Apple/NeXT runtime defines this as |
| objc_property_t, so we define it that way as well, but obviously |
| Property is the right name. */ |
| typedef struct objc_property *Property; |
| typedef struct objc_property *objc_property_t; |
| |
| /* A 'Method' represents a method. It holds information about the |
| name, types and the IMP of the method. */ |
| typedef struct objc_method *Method; |
| |
| /* A 'Category' represents a category. It holds information about the |
| name of the category, the class it belongs to, and the methods, |
| protocols and such like provided by the category. */ |
| typedef struct objc_category *Category; |
| |
| /* 'Protocol' is defined in objc/objc.h (which is included by this |
| file). */ |
| |
| /* Method descriptor returned by introspective Object methods. At the |
| moment, this is really just the first part of the more complete |
| objc_method structure used internally by the runtime. (PS: In the |
| GNU Objective-C Runtime, selectors already include a type, so an |
| objc_method_description does not add much to a SEL. But in other |
| runtimes, that is not the case, which is why |
| objc_method_description exists). */ |
| struct objc_method_description |
| { |
| SEL name; /* Selector (name and signature) */ |
| char *types; /* Type encoding */ |
| }; |
| |
| /* The following are used in encode strings to describe the type of |
| Ivars and Methods. */ |
| #define _C_ID '@' |
| #define _C_CLASS '#' |
| #define _C_SEL ':' |
| #define _C_CHR 'c' |
| #define _C_UCHR 'C' |
| #define _C_SHT 's' |
| #define _C_USHT 'S' |
| #define _C_INT 'i' |
| #define _C_UINT 'I' |
| #define _C_LNG 'l' |
| #define _C_ULNG 'L' |
| #define _C_LNG_LNG 'q' |
| #define _C_ULNG_LNG 'Q' |
| #define _C_FLT 'f' |
| #define _C_DBL 'd' |
| #define _C_LNG_DBL 'D' |
| #define _C_BFLD 'b' |
| #define _C_BOOL 'B' |
| #define _C_VOID 'v' |
| #define _C_UNDEF '?' |
| #define _C_PTR '^' |
| #define _C_CHARPTR '*' |
| #define _C_ARY_B '[' |
| #define _C_ARY_E ']' |
| #define _C_UNION_B '(' |
| #define _C_UNION_E ')' |
| #define _C_STRUCT_B '{' |
| #define _C_STRUCT_E '}' |
| #define _C_VECTOR '!' |
| #define _C_COMPLEX 'j' |
| |
| /* _C_ATOM is never generated by the compiler. You can treat it as |
| equivalent to "*". */ |
| #define _C_ATOM '%' |
| |
| /* The following are used in encode strings to describe some |
| qualifiers of method and ivar types. */ |
| #define _C_CONST 'r' |
| #define _C_IN 'n' |
| #define _C_INOUT 'N' |
| #define _C_OUT 'o' |
| #define _C_BYCOPY 'O' |
| #define _C_BYREF 'R' |
| #define _C_ONEWAY 'V' |
| #define _C_GCINVISIBLE '|' |
| |
| /* The same when used as flags. */ |
| #define _F_CONST 0x01 |
| #define _F_IN 0x01 |
| #define _F_OUT 0x02 |
| #define _F_INOUT 0x03 |
| #define _F_BYCOPY 0x04 |
| #define _F_BYREF 0x08 |
| #define _F_ONEWAY 0x10 |
| #define _F_GCINVISIBLE 0x20 |
| |
| |
| /** Implementation: the following functions are defined inline. */ |
| |
| /* Return the class of 'object', or Nil if the object is nil. If |
| 'object' is a class, the meta class is returned; if 'object' is a |
| meta class, the root meta class is returned (note that this is |
| different from the traditional GNU Objective-C Runtime API function |
| object_get_class(), which for a meta class would return the meta |
| class itself). This function is inline, so it is really fast and |
| should be used instead of accessing object->class_pointer |
| directly. */ |
| static inline Class |
| object_getClass (id object) |
| { |
| if (object != nil) |
| return object->class_pointer; |
| else |
| return Nil; |
| } |
| |
| |
| /** Implementation: the following functions are in selector.c. */ |
| |
| /* Return the name of a given selector. If 'selector' is NULL, return |
| "<null selector>". */ |
| objc_EXPORT const char *sel_getName (SEL selector); |
| |
| /* Return the type of a given selector. Return NULL if selector is |
| NULL. |
| |
| Compatibility Note: the Apple/NeXT runtime has untyped selectors, |
| so it does not have this function, which is specific to the GNU |
| Runtime. */ |
| objc_EXPORT const char *sel_getTypeEncoding (SEL selector); |
| |
| /* This is the same as sel_registerName (). Please use |
| sel_registerName () instead. */ |
| objc_EXPORT SEL sel_getUid (const char *name); |
| |
| /* Register a selector with a given name (but unspecified types). If |
| you know the types, it is better to call sel_registerTypedName(). |
| If a selector with this name and no types already exists, it is |
| returned. Note that this function should really be called |
| 'objc_registerSelector'. Return NULL if 'name' is NULL. */ |
| objc_EXPORT SEL sel_registerName (const char *name); |
| |
| /* Register a selector with a given name and types. If a selector |
| with this name and types already exists, it is returned. Note that |
| this function should really be called 'objc_registerTypedSelector', |
| and it's called 'sel_registerTypedName' only for consistency with |
| 'sel_registerName'. Return NULL if 'name' is NULL. |
| |
| Compatibility Note: the Apple/NeXT runtime has untyped selectors, |
| so it does not have this function, which is specific to the GNU |
| Runtime. */ |
| objc_EXPORT SEL sel_registerTypedName (const char *name, const char *type); |
| |
| /* Return YES if first_selector is the same as second_selector, and NO |
| if not. */ |
| objc_EXPORT BOOL sel_isEqual (SEL first_selector, SEL second_selector); |
| |
| /* Return all the selectors with the supplied name. In the GNU |
| runtime, selectors are typed and there may be multiple selectors |
| with the same name but a different type. The return value of the |
| function is a pointer to an area, allocated with malloc(), that |
| contains all the selectors with the supplier name known to the |
| runtime. The list is terminated by NULL. Optionally, if you pass |
| a non-NULL 'numberOfReturnedSelectors' pointer, the unsigned int |
| that it points to will be filled with the number of selectors |
| returned. |
| |
| Compatibility Note: the Apple/NeXT runtime has untyped selectors, |
| so it does not have this function, which is specific to the GNU |
| Runtime. */ |
| objc_EXPORT SEL * sel_copyTypedSelectorList (const char *name, |
| unsigned int *numberOfReturnedSelectors); |
| |
| /* Return a selector with name 'name' and a non-zero type encoding, if |
| there is a single selector with a type, and with that name, |
| registered with the runtime. If there is no such selector, or if |
| there are multiple selectors with the same name but conflicting |
| types, NULL is returned. Return NULL if 'name' is NULL. |
| |
| This is useful if you have the name of the selector, and would |
| really like to get a selector for it that includes the type |
| encoding. Unfortunately, if the program contains multiple selector |
| with the same name but different types, sel_getTypedSelector cannot |
| possibly know which one you need, and so will return NULL. |
| |
| Compatibility Note: the Apple/NeXT runtime has untyped selectors, |
| so it does not have this function, which is specific to the GNU |
| Runtime. */ |
| objc_EXPORT SEL sel_getTypedSelector (const char *name); |
| |
| |
| /** Implementation: the following functions are in objects.c. */ |
| |
| /* Create an instance of class 'class_', adding extraBytes to the size |
| of the returned object. This method allocates the appropriate |
| amount of memory for the instance, initializes it to zero, then |
| calls all the C++ constructors on appropriate C++ instance |
| variables of the instance (if any) (TODO: The C++ constructors bit |
| is not implemented yet). */ |
| objc_EXPORT id class_createInstance (Class class_, size_t extraBytes); |
| |
| /* Copy an object and return the copy. extraBytes should be identical |
| to the extraBytes parameter that was passed when creating the |
| original object. */ |
| objc_EXPORT id object_copy (id object, size_t extraBytes); |
| |
| /* Dispose of an object. This method calls the appropriate C++ |
| destructors on appropriate C++ instance variables of the instance |
| (if any) (TODO: This is not implemented yet), then frees the memory |
| for the instance. */ |
| objc_EXPORT id object_dispose (id object); |
| |
| /* Return the name of the class of 'object'. If 'object' is 'nil', |
| returns "Nil". */ |
| objc_EXPORT const char * object_getClassName (id object); |
| |
| /* Change the class of object to be class_. Return the previous class |
| of object. This is currently not really thread-safe. */ |
| objc_EXPORT Class object_setClass (id object, Class class_); |
| |
| |
| /** Implementation: the following functions are in ivars.c. */ |
| |
| /* Return an instance variable given the class and the instance |
| variable name. This is an expensive function to call, so try to |
| reuse the returned Ivar if you can. */ |
| objc_EXPORT Ivar class_getInstanceVariable (Class class_, const char *name); |
| |
| /* Return a class variable given the class and the class variable |
| name. This is an expensive function to call, so try to reuse the |
| returned Ivar if you can. |
| |
| This function always returns NULL since class variables are |
| currently unavailable in Objective-C. */ |
| objc_EXPORT Ivar class_getClassVariable (Class class_, const char *name); |
| |
| /* If the object was created in class_createInstance() with some |
| extraBytes, returns a pointer to them. If it was not, then the |
| returned pointer may make no sense. */ |
| objc_EXPORT void * object_getIndexedIvars (id object); |
| |
| /* Get the value of an instance variable of type 'id'. The function |
| returns the instance variable. To get the value of the instance |
| variable, you should pass as 'returnValue' a pointer to an 'id'; |
| the value will be copied there. Note that 'returnValue' is really |
| a 'void *', not a 'void **'. This function really works only with |
| instance variables of type 'id'; for other types of instance |
| variables, access directly the data at (char *)object + |
| ivar_getOffset (ivar). */ |
| objc_EXPORT Ivar object_getInstanceVariable (id object, const char *name, void **returnValue); |
| |
| /* Set the value of an instance variable. The value to set is passed |
| in 'newValue' (which really is an 'id', not a 'void *'). The |
| function returns the instance variable. This function really works |
| only with instance variables of type 'id'; for other types of |
| instance variables, access directly the data at (char *)object + |
| ivar_getOffset (ivar). */ |
| objc_EXPORT Ivar object_setInstanceVariable (id object, const char *name, void *newValue); |
| |
| /* Get the value of an instance variable of type 'id' of the object |
| 'object'. This is faster than object_getInstanceVariable if you |
| already have the instance variable because it avoids the expensive |
| call to class_getInstanceVariable that is done by |
| object_getInstanceVariable. */ |
| objc_EXPORT id object_getIvar (id object, Ivar variable); |
| |
| /* Set the value of an instance variable of type 'id' of the object |
| 'object'. This is faster than object_setInstanceVariable if you |
| already have the instance variable because it avoids the expensive |
| call to class_getInstanceVariable that is done by |
| object_setInstanceVariable. */ |
| objc_EXPORT void object_setIvar (id object, Ivar variable, id value); |
| |
| /* Return the name of the instance variable. Return NULL if |
| 'variable' is NULL. */ |
| objc_EXPORT const char * ivar_getName (Ivar variable); |
| |
| /* Return the offset of the instance variable from the start of the |
| object data. Return 0 if 'variable' is NULL. */ |
| objc_EXPORT ptrdiff_t ivar_getOffset (Ivar variable); |
| |
| /* Return the type encoding of the variable. Return NULL if |
| 'variable' is NULL. */ |
| objc_EXPORT const char * ivar_getTypeEncoding (Ivar variable); |
| |
| /* Return all the instance variables of the class. The return value |
| of the function is a pointer to an area, allocated with malloc(), |
| that contains all the instance variables of the class. It does not |
| include instance variables of superclasses. The list is terminated |
| by NULL. Optionally, if you pass a non-NULL |
| 'numberOfReturnedIvars' pointer, the unsigned int that it points to |
| will be filled with the number of instance variables returned. |
| Return NULL for classes still in construction (ie, allocated using |
| objc_allocatedClassPair() but not yet registered with the runtime |
| using objc_registerClassPair()). */ |
| objc_EXPORT Ivar * class_copyIvarList (Class class_, unsigned int *numberOfReturnedIvars); |
| |
| /* Add an instance variable with name 'ivar_name' to class 'class_', |
| where 'class_' is a class in construction that has been created |
| using objc_allocateClassPair() and has not been registered with the |
| runtime using objc_registerClassPair() yet. You cannot add |
| instance variables to classes already registered with the runtime. |
| 'size' is the size of the instance variable, 'log_2_of_alignment' |
| the alignment as a power of 2 (so 0 means alignment to a 1 byte |
| boundary, 1 means alignment to a 2 byte boundary, 2 means alignment |
| to a 4 byte boundary, etc), and 'type' the type encoding of the |
| variable type. You can use sizeof(), log2(__alignof__()) and |
| @encode() to determine the right 'size', 'alignment' and 'type' for |
| your instance variable. For example, to add an instance variable |
| name "my_variable" and of type 'id', you can use: |
| |
| class_addIvar (class, "my_variable", sizeof (id), log2 ( __alignof__ (id)), |
| @encode (id)); |
| |
| Return YES if the variable was added, and NO if not. In |
| particular, return NO if 'class_' is Nil, or a meta-class or a |
| class not in construction. Return Nil also if 'ivar_name' or |
| 'type' is NULL, or 'size' is 0. |
| */ |
| objc_EXPORT BOOL class_addIvar (Class class_, const char * ivar_name, size_t size, |
| unsigned char log_2_of_alignment, const char *type); |
| |
| /* Return the name of the property. Return NULL if 'property' is |
| NULL. */ |
| objc_EXPORT const char * property_getName (Property property); |
| |
| /* Return the attributes of the property as a string. Return NULL if |
| 'property' is NULL. */ |
| objc_EXPORT const char * property_getAttributes (Property property); |
| |
| /* Return the property with name 'propertyName' of the class 'class_'. |
| This function returns NULL if the required property cannot be |
| found. Return NULL if 'class_' or 'propertyName' is NULL. |
| |
| Note that the traditional ABI does not store the list of properties |
| of a class in a compiled module, so the traditional ABI will always |
| return NULL. */ |
| objc_EXPORT Property class_getProperty (Class class_, const char *propertyName); |
| |
| /* Return all the properties of the class. The return value |
| of the function is a pointer to an area, allocated with malloc(), |
| that contains all the properties of the class. It does not |
| include properties of superclasses. The list is terminated |
| by NULL. Optionally, if you pass a non-NULL |
| 'numberOfReturnedIvars' pointer, the unsigned int that it points to |
| will be filled with the number of properties returned. |
| |
| Note that the traditional ABI does not store the list of properties |
| of a class in a compiled module, so the traditional ABI will always |
| return an empty list. */ |
| objc_EXPORT Property * class_copyPropertyList |
| (Class class_, unsigned int *numberOfReturnedProperties); |
| |
| /* Return the ivar layout for class 'class_'. |
| |
| At the moment this function always returns NULL. */ |
| objc_EXPORT const char * class_getIvarLayout (Class class_); |
| |
| /* Return the weak ivar layout for class 'class_'. |
| |
| At the moment this function always returns NULL. */ |
| objc_EXPORT const char * class_getWeakIvarLayout (Class class_); |
| |
| /* Set the ivar layout for class 'class_'. |
| |
| At the moment, this function does nothing. */ |
| objc_EXPORT void class_setIvarLayout (Class class_, const char *layout); |
| |
| /* Set the weak ivar layout for class 'class_'. |
| |
| At the moment, this function does nothing. With the GNU runtime, |
| you should use class_ivar_set_gcinvisible () to hide variables from |
| the Garbage Collector. */ |
| objc_EXPORT void class_setWeakIvarLayout (Class class_, const char *layout); |
| |
| |
| /** Implementation: the following functions are in class.c. */ |
| |
| /* Compatibility Note: The Apple/NeXT runtime does not have |
| objc_get_unknown_class_handler and |
| objc_setGetUnknownClassHandler(). They provide functionality that |
| the traditional GNU Objective-C Runtime API used to provide via the |
| _objc_lookup_class hook. */ |
| |
| /* An 'objc_get_unknown_class_handler' function is used by |
| objc_getClass() to get a class that is currently unknown to the |
| compiler. You could use it for example to have the class loaded by |
| dynamically loading a library. 'class_name' is the name of the |
| class. The function should return the Class object if it manages to |
| load the class, and Nil if not. */ |
| typedef Class (*objc_get_unknown_class_handler)(const char *class_name); |
| |
| /* Sets a new handler function for getting unknown classes (to be used |
| by objc_getClass () and related), and returns the previous one. |
| This function is not safe to call in a multi-threaded environment |
| because other threads may be trying to use the get unknown class |
| handler while you change it! */ |
| objc_EXPORT |
| objc_get_unknown_class_handler |
| objc_setGetUnknownClassHandler (objc_get_unknown_class_handler new_handler); |
| |
| /* Return the class with name 'name', if it is already registered with |
| the runtime. If it is not registered, and |
| objc_setGetUnknownClassHandler() has been called to set a handler |
| for unknown classes, the handler is called to give it a chance to |
| load the class in some other way. If the class is not known to the |
| runtime and the handler is not set or returns Nil, objc_getClass() |
| returns Nil. */ |
| objc_EXPORT Class objc_getClass (const char *name); |
| |
| /* Return the class with name 'name', if it is already registered with |
| the runtime. Return Nil if not. This function does not call the |
| objc_get_unknown_class_handler function if the class is not |
| found. */ |
| objc_EXPORT Class objc_lookUpClass (const char *name); |
| |
| /* Return the meta class associated to the class with name 'name', if |
| it is already registered with the runtime. First, it finds the |
| class using objc_getClass(). Then, it returns the associated meta |
| class. If the class could not be found using objc_getClass(), |
| returns Nil. */ |
| objc_EXPORT Class objc_getMetaClass (const char *name); |
| |
| /* This is identical to objc_getClass(), but if the class is not found, |
| it aborts the process instead of returning Nil. */ |
| objc_EXPORT Class objc_getRequiredClass (const char *name); |
| |
| /* If 'returnValue' is NULL, 'objc_getClassList' returns the number of |
| classes currently registered with the runtime. If 'returnValue' is |
| not NULL, it should be a (Class *) pointer to an area of memory |
| which can contain up to 'maxNumberOfClassesToReturn' Class records. |
| 'objc_getClassList' will fill the area pointed to by 'returnValue' |
| with all the Classes registered with the runtime (or up to |
| maxNumberOfClassesToReturn if there are more than |
| maxNumberOfClassesToReturn). The function return value is the |
| number of classes actually returned in 'returnValue'. */ |
| objc_EXPORT int objc_getClassList (Class *returnValue, int maxNumberOfClassesToReturn); |
| |
| /* Compatibility Note: The Apple/NeXT runtime also has |
| |
| Class objc_getFutureClass (const char *name); |
| void objc_setFutureClass (Class class_, const char *name); |
| |
| the documentation is unclear on what they are supposed to do, and |
| the GNU Objective-C Runtime currently does not provide them. */ |
| |
| /* Return the name of the class 'class_', or the string "nil" if the |
| class_ is Nil. */ |
| objc_EXPORT const char * class_getName (Class class_); |
| |
| /* Return YES if 'class_' is a meta class, and NO if not. If 'class_' |
| is Nil, return NO. */ |
| objc_EXPORT BOOL class_isMetaClass (Class class_); |
| |
| /* Return the superclass of 'class_'. If 'class_' is Nil, or it is a |
| root class, return Nil. This function also works if 'class_' is a |
| class being constructed, that is, a class returned by |
| objc_allocateClassPair() but before it has been registered with the |
| runtime using objc_registerClassPair(). */ |
| objc_EXPORT Class class_getSuperclass (Class class_); |
| |
| /* Return the 'version' number of the class, which is an integer that |
| can be used to track changes in the class API, methods and |
| variables. If class_ is Nil, return 0. If class_ is not Nil, the |
| version is 0 unless class_setVersion() has been called to set a |
| different one. |
| |
| Please note that internally the version is a long, but the API only |
| allows you to set and retrieve int values. */ |
| objc_EXPORT int class_getVersion (Class class_); |
| |
| /* Set the 'version' number of the class, which is an integer that can |
| be used to track changes in the class API, methods and variables. |
| If 'class_' is Nil, does nothing. |
| |
| This is typically used internally by "Foundation" libraries such as |
| GNUstep Base to support serialization / deserialization of objects |
| that work across changes in the classes. If you are using such a |
| library, you probably want to use their versioning API, which may |
| be based on this one, but is integrated with the rest of the |
| library. |
| |
| Please note that internally the version is a long, but the API only |
| allows you to set and retrieve int values. */ |
| objc_EXPORT void class_setVersion (Class class_, int version); |
| |
| /* Return the size in bytes (a byte is the size of a char) of an |
| instance of the class. If class_ is Nil, return 0; else it return |
| a non-zero number (since the 'isa' instance variable is required |
| for all classes). */ |
| objc_EXPORT size_t class_getInstanceSize (Class class_); |
| |
| /* Change the implementation of the method. It also searches all |
| classes for any class implementing the method, and replaces the |
| existing implementation with the new one. For that to work, |
| 'method' must be a method returned by class_getInstanceMethod() or |
| class_getClassMethod() as the matching is done by comparing the |
| pointers; in that case, only the implementation in the class is |
| modified. Return the previous implementation that has been |
| replaced. If method or implementation is NULL, do nothing and |
| return NULL. */ |
| objc_EXPORT IMP |
| method_setImplementation (Method method, IMP implementation); |
| |
| /* Swap the implementation of two methods in a single, atomic |
| operation. This is equivalent to getting the implementation of |
| each method and then calling method_setImplementation() on the |
| other one. For this to work, the two methods must have been |
| returned by class_getInstanceMethod() or class_getClassMethod(). |
| If 'method_a' or 'method_b' is NULL, do nothing. */ |
| objc_EXPORT void |
| method_exchangeImplementations (Method method_a, Method method_b); |
| |
| /* Create a new class/meta-class pair. This function is called to |
| create a new class at runtime. The class is created with |
| superclass 'superclass' (use 'Nil' to create a new root class) and |
| name 'class_name'. 'extraBytes' can be used to specify some extra |
| space for indexed variables to be added at the end of the class and |
| meta-class objects (it is recommended that you set extraBytes to |
| 0). Once you have created the class, it is not usable yet. You |
| need to add any instance variables (by using class_addIvar()), any |
| instance methods (by using class_addMethod()) and any class methods |
| (by using class_addMethod() on the meta-class, as in |
| class_addMethod (object_getClass (class), method)) that are |
| required, and then you need to call objc_registerClassPair() to |
| activate the class. If you need to create a hierarchy of classes, |
| you need to create and register them one at a time. You cannot |
| create a new class using another class in construction as |
| superclass. Return Nil if 'class-name' is NULL or if a class with |
| that name already exists or 'superclass' is a class still in |
| construction. |
| |
| Implementation Note: in the GNU runtime, allocating a class pair |
| only creates the structures for the class pair, but does not |
| register anything with the runtime. The class is registered with |
| the runtime only when objc_registerClassPair() is called. In |
| particular, if a class is in construction, objc_getClass() will not |
| find it, the superclass will not know about it, |
| class_getSuperclass() will return Nil and another thread may |
| allocate a class pair with the same name; the conflict will only be |
| detected when the classes are registered with the runtime. |
| */ |
| objc_EXPORT Class |
| objc_allocateClassPair (Class super_class, const char *class_name, |
| size_t extraBytes); |
| |
| /* Register a class pair that was created with |
| objc_allocateClassPair(). After you register a class, you can no |
| longer make changes to its instance variables, but you can start |
| creating instances of it. Do nothing if 'class_' is NULL or if it |
| is not a class allocated by objc_allocateClassPair() and still in |
| construction. */ |
| objc_EXPORT void |
| objc_registerClassPair (Class class_); |
| |
| /* Dispose of a class pair created using objc_allocateClassPair(). |
| Call this function if you started creating a new class with |
| objc_allocateClassPair() but then want to abort the process. You |
| should not access 'class_' after calling this method. Note that if |
| 'class_' has already been registered with the runtime via |
| objc_registerClassPair(), this function does nothing; you can only |
| dispose of class pairs that are still being constructed. Do |
| nothing if class is 'Nil' or if 'class_' is not a class being |
| constructed. */ |
| objc_EXPORT void |
| objc_disposeClassPair (Class class_); |
| |
| /* Compatibility Note: The Apple/NeXT runtime has the function |
| objc_duplicateClass () but it's undocumented. The GNU runtime does |
| not have it. */ |
| |
| |
| /** Implementation: the following functions are in sendmsg.c. */ |
| |
| /* Return the instance method with selector 'selector' of class |
| 'class_', or NULL if the class (or one of its superclasses) does |
| not implement the method. Return NULL if class_ is Nil or selector |
| is NULL. Calling this function may trigger a call to |
| +resolveInstanceMethod:, but does not return a forwarding |
| function. */ |
| objc_EXPORT Method class_getInstanceMethod (Class class_, SEL selector); |
| |
| /* Return the class method with selector 'selector' of class 'class_', |
| or NULL if the class (or one of its superclasses) does not |
| implement the method. Return NULL if class_ is Nil or selector is |
| NULL. Calling this function may trigger a call to |
| +resolveClassMethod:, but does not return a forwarding |
| function. */ |
| objc_EXPORT Method class_getClassMethod (Class class_, SEL selector); |
| |
| /* Return the IMP (pointer to the function implementing a method) for |
| the instance method with selector 'selector' in class 'class_'. |
| This is the same routine that is used while messaging, and should |
| be very fast. Note that you most likely would need to cast the |
| return function pointer to a function pointer with the appropriate |
| arguments and return type before calling it. To get a class |
| method, you can pass the meta-class as the class_ argument (ie, use |
| class_getMethodImplementation (object_getClass (class_), |
| selector)). Return NULL if class_ is Nil or selector is NULL. |
| This function first looks for an existing method; if it is not |
| found, it calls +resolveClassMethod: or +resolveInstanceMethod: |
| (depending on whether a class or instance method is being looked |
| up) if it is implemented. If the method returns YES, then it tries |
| the look up again (the assumption being that +resolveClassMethod: |
| or resolveInstanceMethod: will add the method using |
| class_addMethod()). If it is still not found, it returns a |
| forwarding function. */ |
| objc_EXPORT IMP class_getMethodImplementation (Class class_, SEL selector); |
| |
| /* Compatibility Note: the Apple/NeXT runtime has the function |
| class_getMethodImplementation_stret () which currently does not |
| exist on the GNU runtime because the messaging implementation is |
| different. */ |
| |
| /* Return YES if class 'class_' has an instance method implementing |
| selector 'selector', and NO if not. Return NO if class_ is Nil or |
| selector is NULL. If you need to check a class method, use the |
| meta-class as the class_ argument (ie, use class_respondsToSelector |
| (object_getClass (class_), selector)). */ |
| objc_EXPORT BOOL class_respondsToSelector (Class class_, SEL selector); |
| |
| /* Add a method to a class. Use this function to add a new method to |
| a class (potentially overriding a method with the same selector in |
| the superclass); if you want to modify an existing method, use |
| method_setImplementation() instead (or class_replaceMethod ()). |
| This method adds an instance method to 'class_'; to add a class |
| method, get the meta class first, then add the method to the meta |
| class, that is, use |
| |
| class_addMethod (object_getClass (class_), selector, |
| implementation, type); |
| |
| Return YES if the method was added, and NO if not. Do nothing if |
| one of the arguments is NULL. */ |
| objc_EXPORT BOOL class_addMethod (Class class_, SEL selector, IMP implementation, |
| const char *method_types); |
| |
| /* Replace a method in a class. If the class already have a method |
| with this 'selector', find it and use method_setImplementation() to |
| replace the implementation with 'implementation' (method_types is |
| ignored in that case). If the class does not already have a method |
| with this 'selector', call 'class_addMethod() to add it. |
| |
| Return the previous implementation of the method, or NULL if none |
| was found. Return NULL if any of the arguments is NULL. */ |
| objc_EXPORT IMP class_replaceMethod (Class class_, SEL selector, IMP implementation, |
| const char *method_types); |
| |
| |
| /** Implementation: the following functions are in methods.c. */ |
| |
| /* Return the selector for method 'method'. Return NULL if 'method' |
| is NULL. |
| |
| This function is misnamed; it should be called |
| 'method_getSelector'. To get the actual name, get the selector, |
| then the name from the selector (ie, use sel_getName |
| (method_getName (method))). */ |
| objc_EXPORT SEL method_getName (Method method); |
| |
| /* Return the IMP of the method. Return NULL if 'method' is NULL. */ |
| objc_EXPORT IMP method_getImplementation (Method method); |
| |
| /* Return the type encoding of the method. Return NULL if 'method' is |
| NULL. */ |
| objc_EXPORT const char * method_getTypeEncoding (Method method); |
| |
| /* Return a method description for the method. Return NULL if |
| 'method' is NULL. */ |
| objc_EXPORT struct objc_method_description * method_getDescription (Method method); |
| |
| /* Return all the instance methods of the class. The return value of |
| the function is a pointer to an area, allocated with malloc(), that |
| contains all the instance methods of the class. It does not |
| include instance methods of superclasses. The list is terminated |
| by NULL. Optionally, if you pass a non-NULL |
| 'numberOfReturnedMethods' pointer, the unsigned int that it points |
| to will be filled with the number of instance methods returned. To |
| get the list of class methods, pass the meta-class in the 'class_' |
| argument, (ie, use class_copyMethodList (object_getClass (class_), |
| &numberOfReturnedMethods)). */ |
| objc_EXPORT Method * class_copyMethodList (Class class_, unsigned int *numberOfReturnedMethods); |
| |
| |
| /** Implementation: the following functions are in encoding.c. */ |
| |
| /* Return the number of arguments that the method 'method' expects. |
| Note that all methods need two implicit arguments ('self' for the |
| receiver, and '_cmd' for the selector). Return 0 if 'method' is |
| NULL. */ |
| objc_EXPORT unsigned int method_getNumberOfArguments (Method method); |
| |
| /* Return the string encoding for the return type of method 'method'. |
| The string is a standard zero-terminated string in an area of |
| memory allocated with malloc(); you should free it with free() when |
| you finish using it. Return an empty string if method is NULL. */ |
| objc_EXPORT char * method_copyReturnType (Method method); |
| |
| /* Return the string encoding for the argument type of method |
| 'method', argument number 'argumentNumber' ('argumentNumber' is 0 |
| for self, 1 for _cmd, and 2 or more for the additional arguments if |
| any). The string is a standard zero-terminated string in an area |
| of memory allocated with malloc(); you should free it with free() |
| when you finish using it. Return an empty string if method is NULL |
| or if 'argumentNumber' refers to a non-existing argument. */ |
| objc_EXPORT char * method_copyArgumentType (Method method, unsigned int argumentNumber); |
| |
| /* Return the string encoding for the return type of method 'method'. |
| The string is returned by copying it into the supplied |
| 'returnValue' string, which is of size 'returnValueSize'. No more |
| than 'returnValueSize' characters are copied; if the encoding is |
| smaller than 'returnValueSize', the rest of 'returnValue' is filled |
| with zeros. If it is bigger, it is truncated (and would not be |
| zero-terminated). You should supply a big enough |
| 'returnValueSize'. If the method is NULL, returnValue is set to a |
| string of zeros. */ |
| objc_EXPORT void method_getReturnType (Method method, char *returnValue, |
| size_t returnValueSize); |
| |
| /* Return the string encoding for the argument type of method |
| 'method', argument number 'argumentNumber' ('argumentNumber' is 0 |
| for self, 1 for _cmd, and 2 or more for the additional arguments if |
| any). The string is returned by copying it into the supplied |
| 'returnValue' string, which is of size 'returnValueSize'. No more |
| than 'returnValueSize' characters are copied; if the encoding is |
| smaller than 'returnValueSize', the rest of 'returnValue' is filled |
| with zeros. If it is bigger, it is truncated (and would not be |
| zero-terminated). You should supply a big enough |
| 'returnValueSize'. If the method is NULL, returnValue is set to a |
| string of zeros. */ |
| objc_EXPORT void method_getArgumentType (Method method, unsigned int argumentNumber, |
| char *returnValue, size_t returnValueSize); |
| |
| |
| /** Implementation: the following functions are in protocols.c. */ |
| |
| /* Return the protocol with name 'name', or nil if it the protocol is |
| not known to the runtime. */ |
| objc_EXPORT Protocol *objc_getProtocol (const char *name); |
| |
| /* Return all the protocols known to the runtime. The return value of |
| the function is a pointer to an area, allocated with malloc(), that |
| contains all the protocols known to the runtime; the list is |
| terminated by NULL. You should free this area using free() once |
| you no longer need it. Optionally, if you pass a non-NULL |
| 'numberOfReturnedProtocols' pointer, the unsigned int that it |
| points to will be filled with the number of protocols returned. If |
| there are no protocols known to the runtime, NULL is returned. */ |
| objc_EXPORT Protocol **objc_copyProtocolList (unsigned int *numberOfReturnedProtocols); |
| |
| /* Add a protocol to a class, and return YES if it was done |
| successfully, and NO if not. At the moment, NO should only happen |
| if class_ or protocol are nil, if the protocol is not a Protocol |
| object or if the class already conforms to the protocol. */ |
| objc_EXPORT BOOL class_addProtocol (Class class_, Protocol *protocol); |
| |
| /* Return YES if the class 'class_' conforms to Protocol 'protocol', |
| and NO if not. This function does not check superclasses; if you |
| want to check for superclasses (in the way that [NSObject |
| +conformsToProtocol:] does) you need to iterate over the class |
| hierarchy using class_getSuperclass(), and call |
| class_conformsToProtocol() for each of them. */ |
| objc_EXPORT BOOL class_conformsToProtocol (Class class_, Protocol *protocol); |
| |
| /* Return all the protocols that the class conforms to. The return |
| value of the function is a pointer to an area, allocated with |
| malloc(), that contains all the protocols formally adopted by the |
| class. It does not include protocols adopted by superclasses. The |
| list is terminated by NULL. Optionally, if you pass a non-NULL |
| 'numberOfReturnedProtocols' pointer, the unsigned int that it |
| points to will be filled with the number of protocols returned. |
| This function does not return protocols that superclasses conform |
| to. */ |
| objc_EXPORT Protocol **class_copyProtocolList (Class class_, unsigned int *numberOfReturnedProtocols); |
| |
| /* Return YES if protocol 'protocol' conforms to protocol |
| 'anotherProtocol', and NO if not. Note that if one of the two |
| protocols is nil, it returns NO. */ |
| objc_EXPORT BOOL protocol_conformsToProtocol (Protocol *protocol, Protocol *anotherProtocol); |
| |
| /* Return YES if protocol 'protocol' is the same as protocol |
| 'anotherProtocol', and 'NO' if not. Note that it returns YES if |
| the two protocols are both nil. */ |
| objc_EXPORT BOOL protocol_isEqual (Protocol *protocol, Protocol *anotherProtocol); |
| |
| /* Return the name of protocol 'protocol'. If 'protocol' is nil or is |
| not a Protocol, return NULL. */ |
| objc_EXPORT const char *protocol_getName (Protocol *protocol); |
| |
| /* Return the method description for the method with selector |
| 'selector' in protocol 'protocol'; if 'requiredMethod' is YES, the |
| function searches the list of required methods; if NO, the list of |
| optional methods. If 'instanceMethod' is YES, the function search |
| for an instance method; if NO, for a class method. If there is no |
| matching method, an objc_method_description structure with both |
| name and types set to NULL is returned. This function will only |
| find methods that are directly declared in the protocol itself, not |
| in other protocols that this protocol adopts. |
| |
| Note that the traditional ABI does not store the list of optional |
| methods of a protocol in a compiled module, so the traditional ABI |
| will always return (NULL, NULL) when requiredMethod == NO. */ |
| objc_EXPORT struct objc_method_description protocol_getMethodDescription (Protocol *protocol, |
| SEL selector, |
| BOOL requiredMethod, |
| BOOL instanceMethod); |
| |
| /* Return the method descriptions of all the methods of the protocol. |
| The return value of the function is a pointer to an area, allocated |
| with malloc(), that contains all the method descriptions of the |
| methods of the protocol. It does not recursively include methods |
| of the protocols adopted by this protocol. The list is terminated |
| by a NULL objc_method_description (one with both fields set to |
| NULL). Optionally, if you pass a non-NULL |
| 'numberOfReturnedMethods' pointer, the unsigned int that it points |
| to will be filled with the number of properties returned. |
| |
| Note that the traditional ABI does not store the list of optional |
| methods of a protocol in a compiled module, so the traditional ABI |
| will always return an empty list if requiredMethod is set to |
| NO. */ |
| objc_EXPORT struct objc_method_description *protocol_copyMethodDescriptionList (Protocol *protocol, |
| BOOL requiredMethod, |
| BOOL instanceMethod, |
| unsigned int *numberOfReturnedMethods); |
| |
| /* Return the property with name 'propertyName' of the protocol |
| 'protocol'. If 'requiredProperty' is YES, the function searches |
| the list of required properties; if NO, the list of optional |
| properties. If 'instanceProperty' is YES, the function searches |
| the list of instance properties; if NO, the list of class |
| properties. At the moment, optional properties and class |
| properties are not part of the Objective-C language, so both |
| 'requiredProperty' and 'instanceProperty' should be set to YES. |
| This function returns NULL if the required property cannot be |
| found. |
| |
| Note that the traditional ABI does not store the list of properties |
| of a protocol in a compiled module, so the traditional ABI will |
| always return NULL. */ |
| objc_EXPORT Property protocol_getProperty (Protocol *protocol, const char *propertyName, |
| BOOL requiredProperty, BOOL instanceProperty); |
| |
| /* Return all the properties of the protocol. The return value of the |
| function is a pointer to an area, allocated with malloc(), that |
| contains all the properties of the protocol. It does not |
| recursively include properties of the protocols adopted by this |
| protocol. The list is terminated by NULL. Optionally, if you pass |
| a non-NULL 'numberOfReturnedProperties' pointer, the unsigned int |
| that it points to will be filled with the number of properties |
| returned. |
| |
| Note that the traditional ABI does not store the list of properties |
| of a protocol in a compiled module, so the traditional ABI will |
| always return NULL and store 0 in numberOfReturnedProperties. */ |
| objc_EXPORT Property *protocol_copyPropertyList (Protocol *protocol, unsigned int *numberOfReturnedProperties); |
| |
| /* Return all the protocols that the protocol conforms to. The return |
| value of the function is a pointer to an area, allocated with |
| malloc(), that contains all the protocols formally adopted by the |
| protocol. It does not recursively include protocols adopted by the |
| protocols adopted by this protocol. The list is terminated by |
| NULL. Optionally, if you pass a non-NULL |
| 'numberOfReturnedProtocols' pointer, the unsigned int that it |
| points to will be filled with the number of protocols returned. */ |
| objc_EXPORT Protocol **protocol_copyProtocolList (Protocol *protocol, unsigned int *numberOfReturnedProtocols); |
| |
| |
| /** Implementation: the following hook is in init.c. */ |
| |
| /* This is a hook which is called by __objc_exec_class every time a |
| class or a category is loaded into the runtime. This may e.g. help |
| a dynamic loader determine the classes that have been loaded when |
| an object file is dynamically linked in. */ |
| objc_EXPORT void (*_objc_load_callback)(Class _class, struct objc_category *category); |
| |
| |
| /** Implementation: the following functions are in objc-foreach.c. */ |
| |
| /* 'objc_enumerationMutation()' is called when a collection is |
| mutated while being "fast enumerated". That is a hard error, and |
| objc_enumerationMutation is called to deal with it. 'collection' |
| is the collection object that was mutated during an enumeration. |
| |
| objc_enumerationMutation() will invoke the mutation handler if any |
| is set. Then, it will abort the program. |
| |
| Compatibility note: the Apple runtime will not abort the program |
| after calling the mutation handler. */ |
| objc_EXPORT void objc_enumerationMutation (id collection); |
| |
| /* 'objc_set_enumeration_mutation_handler' can be used to set a |
| function that will be called (instead of aborting) when a fast |
| enumeration is mutated during enumeration. The handler will be |
| called with the 'collection' being mutated as the only argument and |
| it should not return; it should either exit the program, or could |
| throw an exception. The recommended implementation is to throw an |
| exception - the user can then use exception handlers to deal with |
| it. |
| |
| This function is not thread safe (other threads may be trying to |
| invoke the enumeration mutation handler while you are changing it!) |
| and should be called during during the program initialization |
| before threads are started. It is mostly reserved for "Foundation" |
| libraries; in the case of GNUstep, GNUstep Base may be using this |
| function to improve the standard enumeration mutation handling. |
| You probably shouldn't use this function unless you are writing |
| your own Foundation library. */ |
| objc_EXPORT void objc_setEnumerationMutationHandler (void (*handler)(id)); |
| |
| /* This structure (used during fast enumeration) is automatically |
| defined by the compiler (it is as if this definition was always |
| included in all Objective-C files). Note that it is usually |
| defined again with the name of NSFastEnumeration by "Foundation" |
| libraries such as GNUstep Base. And if NSFastEnumeration is |
| defined, the compiler will use it instead of |
| __objcFastEnumerationState when doing fast enumeration. */ |
| /* |
| struct __objcFastEnumerationState |
| { |
| unsigned long state; |
| id *itemsPtr; |
| unsigned long *mutationsPtr; |
| unsigned long extra[5]; |
| }; |
| */ |
| |
| |
| /* Compatibility Note: The Apple/NeXT runtime has the functions |
| objc_copyImageNames (), class_getImageName () and |
| objc_copyClassNamesForImage () but they are undocumented. The GNU |
| runtime does not have them at the moment. */ |
| |
| /* Compatibility Note: The Apple/NeXT runtime has the functions |
| objc_setAssociatedObject (), objc_getAssociatedObject (), |
| objc_removeAssociatedObjects () and the objc_AssociationPolicy type |
| and related enum. The GNU runtime does not have them yet. |
| TODO: Implement them. */ |
| |
| /* Compatibility Note: The Apple/NeXT runtime has the function |
| objc_setForwardHandler (). The GNU runtime does not have it |
| because messaging (and, in particular, forwarding) works in a |
| different (incompatible) way with the GNU runtime. If you need to |
| customize message forwarding at the Objective-C runtime level (that |
| is, if you are implementing your own "Foundation" library such as |
| GNUstep Base on top of the Objective-C runtime), in objc/message.h |
| there are hooks (that work in the framework of the GNU runtime) to |
| do so. */ |
| |
| |
| /** Implementation: the following functions are in memory.c. */ |
| |
| /* Traditional GNU Objective-C Runtime functions that are used for |
| memory allocation and disposal. These functions are used in the |
| same way as you use malloc, realloc, calloc and free and make sure |
| that memory allocation works properly with the garbage |
| collector. |
| |
| Compatibility Note: these functions are not available with the |
| Apple/NeXT runtime. */ |
| |
| objc_EXPORT void *objc_malloc(size_t size); |
| |
| /* FIXME: Shouldn't the following be called objc_malloc_atomic ? The |
| GC function is GC_malloc_atomic() which makes sense. |
| */ |
| objc_EXPORT void *objc_atomic_malloc(size_t size); |
| |
| objc_EXPORT void *objc_realloc(void *mem, size_t size); |
| |
| objc_EXPORT void *objc_calloc(size_t nelem, size_t size); |
| |
| objc_EXPORT void objc_free(void *mem); |
| |
| |
| /** Implementation: the following functions are in gc.c. */ |
| |
| /* The GNU Objective-C Runtime has a different implementation of |
| garbage collection. |
| |
| Compatibility Note: these functions are not available with the |
| Apple/NeXT runtime. */ |
| |
| /* Mark the instance variable as inaccessible to the garbage |
| collector. */ |
| objc_EXPORT void class_ivar_set_gcinvisible (Class _class, |
| const char* ivarname, |
| BOOL gcInvisible); |
| |
| |
| /** Implementation: the following functions are in encoding.c. */ |
| |
| /* Traditional GNU Objective-C Runtime functions that are currently |
| used to implement method forwarding. |
| |
| Compatibility Note: these functions are not available with the |
| Apple/NeXT runtime. */ |
| |
| /* Return the size of a variable which has the specified 'type' |
| encoding. */ |
| objc_EXPORT int objc_sizeof_type (const char *type); |
| |
| /* Return the align of a variable which has the specified 'type' |
| encoding. */ |
| objc_EXPORT int objc_alignof_type (const char *type); |
| |
| /* Return the aligned size of a variable which has the specified |
| 'type' encoding. The aligned size is the size rounded up to the |
| nearest alignment. */ |
| objc_EXPORT int objc_aligned_size (const char *type); |
| |
| /* Return the promoted size of a variable which has the specified |
| 'type' encoding. This is the size rounded up to the nearest |
| integral of the wordsize, taken to be the size of a void *. */ |
| objc_EXPORT int objc_promoted_size (const char *type); |
| |
| |
| /* The following functions are used when parsing the type encoding of |
| methods, to skip over parts that are ignored. They take as |
| argument a pointer to a location inside the type encoding of a |
| method (which is a string) and return a new pointer, pointing to a |
| new location inside the string after having skipped the unwanted |
| information. */ |
| |
| /* Skip some type qualifiers (_C_CONST, _C_IN, etc). These may |
| eventually precede typespecs occurring in method prototype |
| encodings. */ |
| objc_EXPORT const char *objc_skip_type_qualifiers (const char *type); |
| |
| /* Skip one typespec element (_C_CLASS, _C_SEL, etc). If the typespec |
| is prepended by type qualifiers, these are skipped as well. */ |
| objc_EXPORT const char *objc_skip_typespec (const char *type); |
| |
| /* Skip an offset. */ |
| objc_EXPORT const char *objc_skip_offset (const char *type); |
| |
| /* Skip an argument specification (ie, skipping a typespec, which may |
| include qualifiers, and an offset too). */ |
| objc_EXPORT const char *objc_skip_argspec (const char *type); |
| |
| /* Read type qualifiers (_C_CONST, _C_IN, etc) from string 'type' |
| (stopping at the first non-type qualifier found) and return an |
| unsigned int which is the logical OR of all the corresponding flags |
| (_F_CONST, _F_IN etc). */ |
| objc_EXPORT unsigned objc_get_type_qualifiers (const char *type); |
| |
| |
| /* Note that the following functions work for very simple structures, |
| but get easily confused by more complicated ones (for example, |
| containing vectors). A better solution is required. These |
| functions are likely to change in the next GCC release. */ |
| |
| /* The following three functions can be used to determine how a |
| structure is laid out by the compiler. For example: |
| |
| struct objc_struct_layout layout; |
| int i; |
| |
| objc_layout_structure (type, &layout); |
| while (objc_layout_structure_next_member (&layout)) |
| { |
| int position, align; |
| const char *type; |
| |
| objc_layout_structure_get_info (&layout, &position, &align, &type); |
| printf ("element %d has offset %d, alignment %d\n", |
| i++, position, align); |
| } |
| |
| These functions are used by objc_sizeof_type and objc_alignof_type |
| functions to compute the size and alignment of structures. The |
| previous method of computing the size and alignment of a structure |
| was not working on some architectures, particularly on AIX, and in |
| the presence of bitfields inside the structure. */ |
| struct objc_struct_layout |
| { |
| const char *original_type; |
| const char *type; |
| const char *prev_type; |
| unsigned int record_size; |
| unsigned int record_align; |
| }; |
| |
| objc_EXPORT void objc_layout_structure (const char *type, |
| struct objc_struct_layout *layout); |
| objc_EXPORT BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout); |
| objc_EXPORT void objc_layout_finish_structure (struct objc_struct_layout *layout, |
| unsigned int *size, |
| unsigned int *align); |
| objc_EXPORT void objc_layout_structure_get_info (struct objc_struct_layout *layout, |
| unsigned int *offset, |
| unsigned int *align, |
| const char **type); |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif |