#if !defined(_OBJC_PRIVATE_H_)
#define _OBJC_PRIVATE_H_
#import <objc/objc-api.h>
OBJC_EXPORT void checkUniqueness();
#import "objc-config.h"
#import <pthread.h>
#import <errno.h>
#import <limits.h>
#import <unistd.h>
#define mutex_alloc() (pthread_mutex_t*)calloc(1, sizeof(pthread_mutex_t))
#define mutex_init(m) pthread_mutex_init(m, NULL)
#define mutex_lock(m) pthread_mutex_lock(m)
#define mutex_try_lock(m) (! pthread_mutex_trylock(m))
#define mutex_unlock(m) pthread_mutex_unlock(m)
#define mutex_clear(m)
#define mutex_t pthread_mutex_t*
#define mutex MUTEX_DEFINE_ERROR
#import <sys/time.h>
#import <stdlib.h>
#import <stdarg.h>
#import <stdio.h>
#import <string.h>
#import <ctype.h>
#import <objc/objc-runtime.h>
#import <malloc/malloc.h>
#import <mach-o/loader.h>
typedef struct mach_header headerType;
#import <objc/Protocol.h>
typedef struct _ProtocolTemplate { @defs(Protocol) } ProtocolTemplate;
typedef struct _NXConstantStringTemplate {
Class isa;
void *characters;
unsigned int _length;
} NXConstantStringTemplate;
#define OBJC_CONSTANT_STRING_PTR NXConstantStringTemplate*
#define OBJC_CONSTANT_STRING_DEREF &
#define OBJC_PROTOCOL_PTR ProtocolTemplate*
#define OBJC_PROTOCOL_DEREF .
typedef struct {
uint32_t version; uint32_t flags;
} objc_image_info;
#define OBJC_IMAGE_IS_REPLACEMENT (1<<0)
#define OBJC_IMAGE_SUPPORTS_GC (1<<1)
#define _objcHeaderIsReplacement(h) ((h)->info && ((h)->info->flags & OBJC_IMAGE_IS_REPLACEMENT))
#define _objcHeaderSupportsGC(h) ((h)->info && ((h)->info->flags & OBJC_IMAGE_SUPPORTS_GC))
OBJC_EXPORT headerType ** _getObjcHeaders();
OBJC_EXPORT Module _getObjcModules(const headerType *head, int *nmodules);
OBJC_EXPORT Class * _getObjcClassRefs(headerType *head, int *nclasses);
OBJC_EXPORT const struct segment_command *getsegbynamefromheader(const headerType *head, const char *segname);
OBJC_EXPORT const char * _getObjcHeaderName(const headerType *head);
OBJC_EXPORT objc_image_info * _getObjcImageInfo(const headerType *head, uint32_t *size);
OBJC_EXPORT ptrdiff_t _getImageSlide(const headerType *header);
void _objc_resolve_categories_for_class (struct objc_class * cls);
#define trace(a, b, c, d) do {} while (0)
OBJC_EXPORT ProtocolTemplate * _getObjcProtocols(headerType *head, int *nprotos);
OBJC_EXPORT NXConstantStringTemplate *_getObjcStringObjects(headerType *head, int *nstrs);
OBJC_EXPORT SEL * _getObjcMessageRefs(headerType *head, int *nmess);
#define END_OF_METHODS_LIST ((struct objc_method_list*)-1)
typedef struct _header_info
{
const headerType * mhdr;
Module mod_ptr; unsigned int mod_count;
unsigned long image_slide;
const struct segment_command * objcSegmentHeader; objc_image_info * info; struct _header_info * next;
} header_info;
OBJC_EXPORT header_info *_objc_headerStart ();
OBJC_EXPORT int _objcModuleCount();
OBJC_EXPORT const char *_objcModuleNameAtIndex(int i);
OBJC_EXPORT Class objc_getOrigClass (const char *name);
OBJC_EXPORT const char *__S(_nameForHeader) (const headerType*);
OBJC_EXPORT SEL sel_registerNameNoLock(const char *str, BOOL copy);
OBJC_EXPORT void sel_lock(void);
OBJC_EXPORT void sel_unlock(void);
OBJC_EXPORT malloc_zone_t *_objc_internal_zone(void);
OBJC_EXPORT void *_malloc_internal(size_t size);
OBJC_EXPORT void *_calloc_internal(size_t count, size_t size);
OBJC_EXPORT void *_realloc_internal(void *ptr, size_t size);
OBJC_EXPORT char *_strdup_internal(const char *str);
OBJC_EXPORT void _free_internal(void *ptr);
OBJC_EXPORT BOOL class_respondsToMethod(Class, SEL);
OBJC_EXPORT IMP class_lookupMethod(Class, SEL);
OBJC_EXPORT IMP lookupNamedMethodInMethodList(struct objc_method_list *mlist, const char *meth_name);
OBJC_EXPORT void _objc_insertMethods(struct objc_class *cls, struct objc_method_list *mlist);
OBJC_EXPORT void _objc_removeMethods(struct objc_class *cls, struct objc_method_list *mlist);
OBJC_EXPORT IMP _cache_getImp(Class cls, SEL sel);
OBJC_EXPORT Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp);
OBJC_EXPORT IMP _class_lookupMethodAndLoadCache(Class, SEL);
OBJC_EXPORT id _objc_msgForward (id self, SEL sel, ...);
OBJC_EXPORT volatile void _objc_fatal(const char *fmt, ...);
OBJC_EXPORT volatile void _objc_error(id, const char *, va_list);
OBJC_EXPORT volatile void __objc_error(id, const char *, ...);
OBJC_EXPORT void _objc_inform(const char *fmt, ...);
OBJC_EXPORT void _objc_syslog(const char *fmt, ...);
OBJC_EXPORT Class _objc_getFreedObjectClass (void);
#ifndef OBJC_INSTRUMENTED
OBJC_EXPORT const struct objc_cache emptyCache;
#else
OBJC_EXPORT struct objc_cache emptyCache;
#endif
OBJC_EXPORT void _objc_flush_caches (Class cls);
#define MUTEX_TYPE pthread_mutex_t*
#define OBJC_DECLARE_LOCK(MTX) pthread_mutex_t MTX = PTHREAD_MUTEX_INITIALIZER
OBJC_EXPORT pthread_mutex_t classLock;
OBJC_EXPORT pthread_mutex_t methodListLock;
OBJC_EXPORT id _objc_nilReceiver;
OBJC_EXPORT id _objc_setNilReceiver(id newNilReceiver);
OBJC_EXPORT id _objc_getNilReceiver(void);
OBJC_EXPORT SEL cxx_construct_sel;
OBJC_EXPORT SEL cxx_destruct_sel;
OBJC_EXPORT const char *cxx_construct_name;
OBJC_EXPORT const char *cxx_destruct_name;
OBJC_EXPORT BOOL object_cxxConstruct(id obj);
OBJC_EXPORT void object_cxxDestruct(id obj);
OBJC_EXPORT void gc_init(BOOL on);
OBJC_EXPORT void rtp_init(void);
OBJC_EXPORT id objc_assign_strongCast_gc(id val, id *dest);
OBJC_EXPORT id objc_assign_global_gc(id val, id *dest);
OBJC_EXPORT id objc_assign_ivar_gc(id value, id dest, unsigned int offset);
OBJC_EXPORT id objc_assign_strongCast_non_gc(id value, id *dest);
OBJC_EXPORT id objc_assign_global_non_gc(id value, id *dest);
OBJC_EXPORT id objc_assign_ivar_non_gc(id value, id dest, unsigned int offset);
#if defined(__ppc__)
OBJC_EXPORT size_t objc_write_branch(void *entry, void *target);
#endif
OBJC_EXPORT void _class_setInfo(struct objc_class *cls, long set);
OBJC_EXPORT void _class_clearInfo(struct objc_class *cls, long clear);
OBJC_EXPORT void _class_changeInfo(struct objc_class *cls, long set, long clear);
OBJC_EXPORT int secure_open(const char *filename, int flags, uid_t euid);
typedef struct {
long addressOffset;
long selectorOffset;
} FixupEntry;
static inline int selEqual( SEL s1, SEL s2 ) {
return (s1 == s2);
}
#define OBJC_LOCK(MUTEX) mutex_lock (MUTEX)
#define OBJC_UNLOCK(MUTEX) mutex_unlock (MUTEX)
#define OBJC_TRYLOCK(MUTEX) mutex_try_lock (MUTEX)
#if !defined(SEG_OBJC)
#define SEG_OBJC "__OBJC"
#endif
OBJC_EXPORT int PrintImages; OBJC_EXPORT int PrintLoading; OBJC_EXPORT int PrintConnecting; OBJC_EXPORT int PrintRTP; OBJC_EXPORT int PrintGC; OBJC_EXPORT int PrintSharing; OBJC_EXPORT int PrintCxxCtors;
OBJC_EXPORT int UseInternalZone; OBJC_EXPORT int AllowInterposing;
OBJC_EXPORT int DebugUnload; OBJC_EXPORT int DebugFragileSuperclasses;
OBJC_EXPORT int ForceGC; OBJC_EXPORT int ForceNoGC; OBJC_EXPORT int CheckFinalizers;
OBJC_EXPORT BOOL UseGC;
static __inline__ int _objc_strcmp(const unsigned char *s1, const unsigned char *s2) {
unsigned char c1, c2;
for ( ; (c1 = *s1) == (c2 = *s2); s1++, s2++)
if (c1 == '\0')
return 0;
return (c1 - c2);
}
static __inline__ unsigned int _objc_strhash(const unsigned char *s) {
unsigned int hash = 0;
for (;;) {
int a = *s++;
if (0 == a) break;
hash += (hash << 8) + a;
}
return hash;
}
OBJC_EXPORT pthread_key_t _objc_pthread_key;
typedef struct {
struct _objc_initializing_classes *initializingClasses;
} _objc_pthread_data;
#define ISCLASS(cls) ((((struct objc_class *) cls)->info & CLS_CLASS) != 0)
#define ISMETA(cls) ((((struct objc_class *) cls)->info & CLS_META) != 0)
#define GETMETA(cls) (ISMETA(cls) ? ((struct objc_class *) cls) : ((struct objc_class *) cls)->isa)
#define ISINITIALIZED(cls) ((((volatile long)GETMETA(cls)->info) & CLS_INITIALIZED) != 0)
#define ISINITIALIZING(cls) ((((volatile long)GETMETA(cls)->info) & CLS_INITIALIZING) != 0)
#define NOBSS __attribute__((section("__DATA,__data")))
#define CLS_HAS_LOAD_METHOD 0x8000L
#endif