You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.3 KiB
C
70 lines
2.3 KiB
C
#if defined(__clang__) && !defined(__OBJC_RUNTIME_INTERNAL__)
|
|
#pragma clang system_header
|
|
#endif
|
|
|
|
#ifndef __OBJC_SLOT_H_INCLUDED__
|
|
#define __OBJC_SLOT_H_INCLUDED__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* The objc_slot structure is used to permit safe IMP caching. It is returned
|
|
* by the new lookup APIs. When you call `objc_slot_lookup_version`, the final
|
|
* parameter is used to return either the current value of
|
|
* `objc_method_cache_version` or 0 if the slot is uncacheable. You can then
|
|
* store this value along with a pointer to the `objc_slot2`. If the returned
|
|
* value is equal to the current value of `objc_method_cache_version` then it
|
|
* is safe to call the method from the `method` field of the slot directly.
|
|
*/
|
|
struct objc_slot2
|
|
{
|
|
IMP method;
|
|
} OBJC_NONPORTABLE;
|
|
|
|
/**
|
|
* A counter that is incremented whenever one or more cached slots become
|
|
* invalid, for example if a subclass loads a category containing methods that
|
|
* were inherited from the superclass.
|
|
*
|
|
* Caching is disabled on targets without native 64-bit atomics support such
|
|
* as PowerPC 32-bit.
|
|
*/
|
|
#if defined(__powerpc__) && !defined(__powerpc64__)
|
|
#else
|
|
#if defined(__clang__)
|
|
OBJC_PUBLIC extern _Atomic(uint64_t) objc_method_cache_version;
|
|
#endif
|
|
#endif
|
|
|
|
/**
|
|
* Legacy cache structure. This is no longer maintained in the runtime and is
|
|
* now exported only in the compatibility interfaces. Slots of this form are
|
|
* never cacheable.
|
|
*/
|
|
struct objc_slot
|
|
{
|
|
/** The class to which this slot is attached (used internally). */
|
|
Class owner;
|
|
/** The class for which this slot was cached. Note that this can be
|
|
* modified by different cache owners, in different threads. Doing so may
|
|
* cause some cache misses, but if different methods are sending messages
|
|
* to the same object and sharing a cached slot then it may also improve
|
|
* cache hits. Profiling is probably required here. */
|
|
Class cachedFor;
|
|
/** The (typed) selector for the method identified by this slot. */
|
|
const char *types;
|
|
/** The current version. This changes if the method changes or if a
|
|
* subclass overrides this method, potentially invalidating this cache. */
|
|
int version;
|
|
/** The method pointer for this method. */
|
|
IMP method;
|
|
/** Selector for this method. */
|
|
SEL selector;
|
|
} OBJC_NONPORTABLE;
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // __OBJC_SLOT_H_INCLUDED__
|