objc-runtime-new.h [plain text]
#ifndef _OBJC_RUNTIME_NEW_H
#define _OBJC_RUNTIME_NEW_H
__BEGIN_DECLS
#define RO_META (1<<0)
#define RO_ROOT (1<<1)
#define RO_HAS_CXX_STRUCTORS (1<<2)
#define RO_HIDDEN (1<<4)
#define RO_EXCEPTION (1<<5)
#define RO_IS_ARR (1<<7)
#define RO_FROM_BUNDLE (1<<29)
#define RO_FUTURE (1<<30)
#define RO_REALIZED (1<<31)
#define RW_REALIZED (1<<31)
#define RW_FUTURE (1<<30)
#define RW_INITIALIZED (1<<29)
#define RW_INITIALIZING (1<<28)
#define RW_COPIED_RO (1<<27)
#define RW_CONSTRUCTING (1<<26)
#define RW_CONSTRUCTED (1<<25)
#define RW_FINALIZE_ON_MAIN_THREAD (1<<24)
#define RW_LOADED (1<<23)
#define RW_SPECIALIZED_VTABLE (1<<22)
#define RW_INSTANCES_HAVE_ASSOCIATED_OBJECTS (1<<21)
#define RW_HAS_CXX_STRUCTORS (1<<20)
#define RW_HAS_INSTANCE_SPECIFIC_LAYOUT (1 << 19)
#define RW_HAS_IVAR_RELEASER (1<<18)
#define RW_HAS_CUSTOM_RR (1<<17)
struct method_t {
SEL name;
const char *types;
IMP imp;
struct SortBySELAddress :
public std::binary_function<const method_t&,
const method_t&, bool>
{
bool operator() (const method_t& lhs,
const method_t& rhs)
{ return lhs.name < rhs.name; }
};
};
typedef struct method_list_t {
uint32_t entsize_NEVER_USE; uint32_t count;
method_t first;
uint32_t getEntsize() const {
return entsize_NEVER_USE & ~(uint32_t)3;
}
uint32_t getCount() const {
return count;
}
method_t& get(uint32_t i) const {
return *(method_t *)((uint8_t *)&first + i*getEntsize());
}
struct method_iterator {
uint32_t entsize;
uint32_t index; method_t* method;
typedef std::random_access_iterator_tag iterator_category;
typedef method_t value_type;
typedef ptrdiff_t difference_type;
typedef method_t* pointer;
typedef method_t& reference;
method_iterator() { }
method_iterator(const method_list_t& mlist, uint32_t start = 0)
: entsize(mlist.getEntsize())
, index(start)
, method(&mlist.get(start))
{ }
const method_iterator& operator += (ptrdiff_t count) {
method = (method_t*)((uint8_t *)method + count*entsize);
index += (int32_t)count;
return *this;
}
const method_iterator& operator -= (ptrdiff_t count) {
method = (method_t*)((uint8_t *)method - count*entsize);
index -= (int32_t)count;
return *this;
}
const method_iterator operator + (ptrdiff_t count) const {
return method_iterator(*this) += count;
}
const method_iterator operator - (ptrdiff_t count) const {
return method_iterator(*this) -= count;
}
method_iterator& operator ++ () { *this += 1; return *this; }
method_iterator& operator -- () { *this -= 1; return *this; }
method_iterator operator ++ (int) {
method_iterator result(*this); *this += 1; return result;
}
method_iterator operator -- (int) {
method_iterator result(*this); *this -= 1; return result;
}
ptrdiff_t operator - (const method_iterator& rhs) const {
return (ptrdiff_t)this->index - (ptrdiff_t)rhs.index;
}
method_t& operator * () const { return *method; }
method_t* operator -> () const { return method; }
operator method_t& () const { return *method; }
bool operator == (const method_iterator& rhs) {
return this->method == rhs.method;
}
bool operator != (const method_iterator& rhs) {
return this->method != rhs.method;
}
bool operator < (const method_iterator& rhs) {
return this->method < rhs.method;
}
bool operator > (const method_iterator& rhs) {
return this->method > rhs.method;
}
};
method_iterator begin() const { return method_iterator(*this, 0); }
method_iterator end() const { return method_iterator(*this, getCount()); }
} method_list_t;
typedef struct ivar_t {
uintptr_t *offset;
const char *name;
const char *type;
uint32_t alignment __attribute__((deprecated));
uint32_t size;
} ivar_t;
typedef struct ivar_list_t {
uint32_t entsize;
uint32_t count;
ivar_t first;
} ivar_list_t;
typedef struct objc_property {
const char *name;
const char *attributes;
} property_t;
typedef struct property_list_t {
uint32_t entsize;
uint32_t count;
property_t first;
} property_list_t;
typedef uintptr_t protocol_ref_t;
typedef struct protocol_t {
id isa;
const char *name;
struct protocol_list_t *protocols;
method_list_t *instanceMethods;
method_list_t *classMethods;
method_list_t *optionalInstanceMethods;
method_list_t *optionalClassMethods;
property_list_t *instanceProperties;
} protocol_t;
typedef struct protocol_list_t {
uintptr_t count;
protocol_ref_t list[0]; } protocol_list_t;
typedef struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize;
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout;
const char * name;
const method_list_t * baseMethods;
const protocol_list_t * baseProtocols;
const ivar_list_t * ivars;
const uint8_t * weakIvarLayout;
const property_list_t *baseProperties;
} class_ro_t;
typedef struct class_rw_t {
uint32_t flags;
uint32_t version;
const class_ro_t *ro;
method_list_t **methods;
struct chained_property_list *properties;
const protocol_list_t ** protocols;
struct class_t *firstSubclass;
struct class_t *nextSiblingClass;
} class_rw_t;
#define CLASS_FAST_FLAGS_VIA_RW_DATA 0
typedef struct class_t {
struct class_t *isa;
struct class_t *superclass;
Cache cache;
IMP *vtable;
uintptr_t data_NEVER_USE;
class_rw_t *data() const {
#if CLASS_FAST_FLAGS_VIA_RW_DATA
return (class_rw_t *)(data_NEVER_USE & ~3UL);
#else
return (class_rw_t *)data_NEVER_USE;
#endif
}
void setData(class_rw_t *newData) {
#if CLASS_FAST_FLAGS_VIA_RW_DATA
uintptr_t flags = (uintptr_t)data_NEVER_USE & 3UL;
data_NEVER_USE = (uintptr_t)newData | flags;
#else
data_NEVER_USE = (uintptr_t)newData;
#endif
}
bool hasCustomRR() const {
#if CLASS_FAST_FLAGS_VIA_RW_DATA
return data_NEVER_USE & 1UL;
#else
return (data()->flags & RW_HAS_CUSTOM_RR);
#endif
}
void setHasCustomRR();
void unsetHasCustomRR();
bool hasIvarReleaser() const {
return (data()->flags & RW_HAS_IVAR_RELEASER);
}
void setHasIvarReleaser();
bool isRootClass() const {
return superclass == NULL;
}
bool isRootMetaclass() const {
return isa == this;
}
} class_t;
typedef struct category_t {
const char *name;
struct class_t *cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceProperties;
} category_t;
struct objc_super2 {
id receiver;
Class current_class;
};
typedef struct {
IMP imp;
SEL sel;
} message_ref_t;
__END_DECLS
#endif