76 lines · c
1#ifndef _OS_BASE_H2#define _OS_BASE_H3 4#define OS_CONSUME __attribute__((os_consumed))5#define OS_RETURNS_RETAINED __attribute__((os_returns_retained))6#define OS_RETURNS_RETAINED_ON_ZERO __attribute__((os_returns_retained_on_zero))7#define OS_RETURNS_RETAINED_ON_NONZERO __attribute__((os_returns_retained_on_non_zero))8#define OS_RETURNS_NOT_RETAINED __attribute__((os_returns_not_retained))9#define OS_CONSUMES_THIS __attribute__((os_consumes_this))10 11#define OSTypeID(type) (type::metaClass)12 13#define OSDynamicCast(type, inst) \14 ((type *) OSMetaClassBase::safeMetaCast((inst), OSTypeID(type)))15#define OSRequiredCast(type, inst) \16 ((type *) OSMetaClassBase::requiredMetaCast((inst), OSTypeID(type)))17 18#define OSTypeAlloc(type) ((type *) ((type::metaClass)->alloc()))19 20using size_t = decltype(sizeof(int));21 22typedef int kern_return_t;23struct IORPC {};24 25struct OSMetaClass;26 27struct OSMetaClassBase {28 static OSMetaClassBase *safeMetaCast(const OSMetaClassBase *inst,29 const OSMetaClass *meta);30 static OSMetaClassBase *requiredMetaCast(const OSMetaClassBase *inst,31 const OSMetaClass *meta);32 33 OSMetaClassBase *metaCast(const char *toMeta);34 35 virtual void retain() const;36 virtual void release() const;37 38 virtual void taggedRetain(const void * tag = nullptr) const;39 virtual void taggedRelease(const void * tag = nullptr) const;40 41 virtual void free();42 virtual ~OSMetaClassBase(){};43 44 kern_return_t Invoke(IORPC invoke);45};46 47typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase *self,48 const IORPC rpc);49 50struct OSObject : public OSMetaClassBase {51 virtual ~OSObject(){}52 53 unsigned int foo() { return 42; }54 55 virtual OS_RETURNS_NOT_RETAINED OSObject *identity();56 57 static OSObject *generateObject(int);58 59 static OSObject *getObject();60 static OSObject *GetObject();61 62 static void * operator new(size_t size);63 64 static const OSMetaClass * const metaClass;65};66 67struct OSMetaClass : public OSMetaClassBase {68 virtual OSObject * alloc() const;69 static OSObject * allocClassWithName(const char * name);70 static const OSMetaClass *copyMetaClassWithName(const char *name);71 void releaseMetaClass() const;72 virtual ~OSMetaClass(){}73};74 75#endif /* _OS_BASE_H */76