Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -131,11 +131,11 @@ [Whether we are compiling for the Nintendo 3DS]) AC_SUBST(MAP_LDFLAGS, ['-Wl,-Map,$@.map']) ]) CPP="$OBJCPP" -CPPFLAGS="$CPPFLAGS $OBJCPPFLAGS" +CPPFLAGS="$CPPFLAGS $OBJCPPFLAGS -DOF_COMPILING_OBJFW" OBJCFLAGS="$OBJCFLAGS -Wall -fexceptions -fobjc-exceptions -funwind-tables" OBJCFLAGS="$OBJCFLAGS -fconstant-string-class=OFConstantString" case "$OBJC" in *clang*) Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -174,9 +174,9 @@ ${ENCODINGS_ENCODINGS_LIB_A} \ ${FORWARDING_FORWARDING_LIB_A} include ../buildsys.mk -CPPFLAGS += -I. -I.. -Iexceptions -Iruntime -DOF_COMPILING_OBJFW +CPPFLAGS += -I. -I.. -Iexceptions -Iruntime LD = ${OBJC} LDFLAGS += ${REEXPORT_RUNTIME} LIBS += -Lruntime ${RUNTIME_LIBS} Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -24,11 +24,11 @@ #import "OFAllocFailedException.h" #import "OFInitializationFailedException.h" #if defined(OF_OBJFW_RUNTIME) -# import "runtime-private.h" +# import "runtime/private.h" #endif #ifdef OF_HAVE_ATOMIC_OPS # import "atomic.h" #endif Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -45,11 +45,11 @@ #import "OFOutOfRangeException.h" #if defined(OF_APPLE_RUNTIME) && __OBJC2__ # import #elif defined(OF_OBJFW_RUNTIME) -# import "runtime.h" +# import "ObjFW-RT.h" #endif #ifdef OF_WINDOWS # include #endif Index: src/encodings/Makefile ================================================================== --- src/encodings/Makefile +++ src/encodings/Makefile @@ -5,6 +5,6 @@ SRCS = ${ENCODINGS_SRCS} include ../../buildsys.mk -CPPFLAGS += -I. -I.. -I../.. -I../runtime -I../exceptions -DOF_COMPILING_OBJFW +CPPFLAGS += -I. -I.. -I../.. -I../runtime -I../exceptions Index: src/exceptions/Makefile ================================================================== --- src/exceptions/Makefile +++ src/exceptions/Makefile @@ -68,6 +68,6 @@ INCLUDES = ${SRCS:.m=.h} include ../../buildsys.mk -CPPFLAGS += -I. -I.. -I../.. -I../runtime -DOF_COMPILING_OBJFW +CPPFLAGS += -I. -I.. -I../.. -I../runtime Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -31,11 +31,15 @@ #include #include "platform.h" #ifdef OF_OBJFW_RUNTIME -# import "runtime.h" +# ifdef OF_COMPILING_OBJFW +# import "ObjFW-RT.h" +# else +# import +# endif #endif #ifdef OF_APPLE_RUNTIME # import # import # import Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -24,11 +24,12 @@ static-instances.m \ synchronized.m \ ${USE_SRCS_THREADS} SRCS_THREADS = threading.m \ ../threading.m -INCLUDES = runtime.h +INCLUDES = ObjFW-RT.h +includesubdir = ObjFW-RT OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_A} LIB_OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_LIB_A} MORPHOS_LIB_OBJS_EXTRA = morphos-library.o ${LOOKUP_ASM_LOOKUP_ASM_A} ADDED src/runtime/ObjFW-RT.h Index: src/runtime/ObjFW-RT.h ================================================================== --- src/runtime/ObjFW-RT.h +++ src/runtime/ObjFW-RT.h @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __OBJFW_RUNTIME_H__ +#define __OBJFW_RUNTIME_H__ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include + +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +#ifndef __has_attribute +# define __has_attribute(x) 0 +#endif + +#if __has_feature(objc_arc) +# define OBJC_UNSAFE_UNRETAINED __unsafe_unretained +#else +# define OBJC_UNSAFE_UNRETAINED +#endif + +#if __has_feature(nullability) +# define OBJC_NONNULL _Nonnull +# define OBJC_NULLABLE _Nullable +#else +# define OBJC_NONNULL +# define OBJC_NULLABLE +#endif + +#if __has_attribute(__objc_root_class__) +# define OBJC_ROOT_CLASS __attribute__((__objc_root_class__)) +#else +# define OBJC_ROOT_CLASS +#endif + +#define Nil (Class)0 +#define nil (id)0 +#define YES (BOOL)1 +#define NO (BOOL)0 + +typedef struct objc_class *Class; +typedef struct objc_object *id; +typedef const struct objc_selector *SEL; +typedef signed char BOOL; +typedef id OBJC_NULLABLE (*IMP)(id OBJC_NONNULL, SEL OBJC_NONNULL, ...); +typedef void (*objc_uncaught_exception_handler)(id OBJC_NULLABLE); +typedef void (*objc_enumeration_mutation_handler)(id OBJC_NONNULL); + +struct objc_class { + Class OBJC_NONNULL isa; + Class OBJC_NULLABLE superclass; + const char *OBJC_NONNULL name; + unsigned long version; + unsigned long info; + long instance_size; + struct objc_ivar_list *OBJC_NULLABLE ivars; + struct objc_method_list *OBJC_NULLABLE methodlist; + struct objc_dtable *OBJC_NULLABLE dtable; + Class OBJC_NONNULL *OBJC_NULLABLE subclass_list; + void *OBJC_NULLABLE sibling_class; + struct objc_protocol_list *OBJC_NULLABLE protocols; + void *OBJC_NULLABLE gc_object_type; + unsigned long abi_version; + int32_t *OBJC_NONNULL *OBJC_NULLABLE ivar_offsets; + struct objc_property_list *OBJC_NULLABLE properties; +}; + +enum objc_class_info { + OBJC_CLASS_INFO_CLASS = 0x001, + OBJC_CLASS_INFO_METACLASS = 0x002, + OBJC_CLASS_INFO_NEW_ABI = 0x010, + OBJC_CLASS_INFO_SETUP = 0x100, + OBJC_CLASS_INFO_LOADED = 0x200, + OBJC_CLASS_INFO_DTABLE = 0x400, + OBJC_CLASS_INFO_INITIALIZED = 0x800 +}; + +struct objc_object { + Class OBJC_NONNULL isa; +}; + +struct objc_selector { + uintptr_t uid; + const char *OBJC_NULLABLE types; +}; + +struct objc_super { + id OBJC_UNSAFE_UNRETAINED OBJC_NULLABLE self; + Class OBJC_NONNULL cls; +}; + +struct objc_method { + struct objc_selector sel; + IMP OBJC_NONNULL imp; +}; + +struct objc_method_list { + struct objc_method_list *OBJC_NULLABLE next; + unsigned int count; + struct objc_method methods[1]; +}; + +struct objc_category { + const char *OBJC_NONNULL category_name; + const char *OBJC_NONNULL class_name; + struct objc_method_list *OBJC_NULLABLE instance_methods; + struct objc_method_list *OBJC_NULLABLE class_methods; + struct objc_protocol_list *OBJC_NULLABLE protocols; +}; + +struct objc_ivar { + const char *OBJC_NONNULL name; + const char *OBJC_NONNULL type; + unsigned int offset; +}; + +struct objc_ivar_list { + unsigned int count; + struct objc_ivar ivars[1]; +}; + +enum objc_property_attributes { + OBJC_PROPERTY_READONLY = 0x01, + OBJC_PROPERTY_GETTER = 0x02, + OBJC_PROPERTY_ASSIGN = 0x04, + OBJC_PROPERTY_READWRITE = 0x08, + OBJC_PROPERTY_RETAIN = 0x10, + OBJC_PROPERTY_COPY = 0x20, + OBJC_PROPERTY_NONATOMIC = 0x40, + OBJC_PROPERTY_SETTER = 0x80 +}; + +enum objc_property_extended_attributes { + OBJC_PROPERTY_SYNTHESIZE = 0x1, + OBJC_PROPERTY_DYNAMIC = 0x2, + OBJC_PROPERTY_PROTOCOL = 0x3, + OBJC_PROPERTY_ATOMIC = 0x4, + OBJC_PROPERTY_WEAK = 0x8, + OBJC_PROPERTY_STRONG = 0x10, + OBJC_PROPERTY_UNSAFE_UNRETAINED = 0x20 +}; + +struct objc_property { + const char *OBJC_NONNULL name; + unsigned char attributes, extended_attributes; + struct { + const char *OBJC_NULLABLE name; + const char *OBJC_NULLABLE type; + } getter, setter; +}; + +struct objc_property_list { + unsigned int count; + struct objc_property_list *OBJC_NULLABLE next; + struct objc_property properties[1]; +}; + +#ifdef __OBJC__ +OBJC_ROOT_CLASS +@interface Protocol +{ +@public +#else +typedef struct { +#endif + Class OBJC_NONNULL isa; + const char *OBJC_NONNULL name; + struct objc_protocol_list *OBJC_NULLABLE protocol_list; + struct objc_abi_method_description_list *OBJC_NULLABLE instance_methods; + struct objc_abi_method_description_list *OBJC_NULLABLE class_methods; +#ifdef __OBJC__ +} +@end +#else +} Protocol; +#endif + +struct objc_protocol_list { + struct objc_protocol_list *OBJC_NULLABLE next; + long count; + Protocol *OBJC_UNSAFE_UNRETAINED OBJC_NONNULL list[1]; +}; + +#ifdef __cplusplus +extern "C" { +#endif +extern SEL OBJC_NONNULL sel_registerName(const char *OBJC_NONNULL); +extern const char *OBJC_NONNULL sel_getName(SEL OBJC_NONNULL); +extern bool sel_isEqual(SEL OBJC_NONNULL, SEL OBJC_NONNULL); +extern Class OBJC_NONNULL objc_allocateClassPair(Class OBJC_NULLABLE, + const char *OBJC_NONNULL, size_t); +extern void objc_registerClassPair(Class OBJC_NONNULL); +extern id OBJC_NULLABLE objc_lookUpClass(const char *OBJC_NONNULL); +extern id OBJC_NULLABLE objc_getClass(const char *OBJC_NONNULL); +extern id OBJC_NONNULL objc_getRequiredClass(const char *OBJC_NONNULL); +extern unsigned int objc_getClassList(Class OBJC_NONNULL *OBJC_NULLABLE, + unsigned int); +extern Class OBJC_NONNULL *OBJC_NONNULL objc_copyClassList( + unsigned int *OBJC_NULLABLE); +extern bool class_isMetaClass(Class OBJC_NULLABLE); +extern const char *OBJC_NONNULL class_getName(Class OBJC_NULLABLE); +extern Class OBJC_NULLABLE class_getSuperclass(Class OBJC_NULLABLE); +extern unsigned long class_getInstanceSize(Class OBJC_NULLABLE); +extern bool class_respondsToSelector(Class OBJC_NULLABLE, SEL OBJC_NONNULL); +extern bool class_conformsToProtocol(Class OBJC_NULLABLE, + Protocol *OBJC_NONNULL); +extern IMP OBJC_NULLABLE class_getMethodImplementation(Class OBJC_NULLABLE, + SEL OBJC_NONNULL); +extern IMP OBJC_NULLABLE class_getMethodImplementation_stret( + Class OBJC_NULLABLE, SEL OBJC_NONNULL); +extern const char *OBJC_NULLABLE class_getMethodTypeEncoding( + Class OBJC_NULLABLE, SEL OBJC_NONNULL); +extern bool class_addMethod(Class OBJC_NONNULL, SEL OBJC_NONNULL, + IMP OBJC_NONNULL, const char *OBJC_NULLABLE); +extern IMP OBJC_NULLABLE class_replaceMethod(Class OBJC_NONNULL, + SEL OBJC_NONNULL, IMP OBJC_NONNULL, const char *OBJC_NULLABLE); +extern Class OBJC_NULLABLE object_getClass(id OBJC_NULLABLE); +extern Class OBJC_NULLABLE object_setClass(id OBJC_NULLABLE, + Class OBJC_NONNULL); +extern const char *OBJC_NONNULL object_getClassName(id OBJC_NULLABLE); +extern const char *OBJC_NONNULL protocol_getName(Protocol *OBJC_NONNULL); +extern bool protocol_isEqual(Protocol *OBJC_NONNULL, Protocol *OBJC_NONNULL); +extern bool protocol_conformsToProtocol(Protocol *OBJC_NONNULL, + Protocol *OBJC_NONNULL); +extern void objc_exit(void); +extern OBJC_NULLABLE objc_uncaught_exception_handler + objc_setUncaughtExceptionHandler( + objc_uncaught_exception_handler OBJC_NULLABLE); +extern void objc_setForwardHandler(IMP OBJC_NULLABLE, IMP OBJC_NULLABLE); +extern void objc_zero_weak_references(id OBJC_NONNULL); + +/* + * Used by the compiler, but can also be called manually. + * + * These declarations are also required to prevent Clang's implicit + * declarations which include __declspec(dllimport) on Windows. + */ +struct objc_abi_module; +extern void __objc_exec_class(void *OBJC_NONNULL); +extern IMP OBJC_NONNULL objc_msg_lookup(id OBJC_NULLABLE, SEL OBJC_NONNULL); +extern IMP OBJC_NONNULL objc_msg_lookup_stret(id OBJC_NULLABLE, + SEL OBJC_NONNULL); +extern IMP OBJC_NONNULL objc_msg_lookup_super(struct objc_super *OBJC_NONNULL, + SEL OBJC_NONNULL); +extern IMP OBJC_NONNULL objc_msg_lookup_super_stret( + struct objc_super *OBJC_NONNULL, SEL OBJC_NONNULL); +extern void objc_exception_throw(id OBJC_NULLABLE); +extern int objc_sync_enter(id OBJC_NULLABLE); +extern int objc_sync_exit(id OBJC_NULLABLE); +extern id OBJC_NULLABLE objc_getProperty(id OBJC_NONNULL, SEL OBJC_NONNULL, + ptrdiff_t, BOOL); +extern void objc_setProperty(id OBJC_NONNULL, SEL OBJC_NONNULL, ptrdiff_t, + id OBJC_NULLABLE, BOOL, signed char); +extern void objc_getPropertyStruct(void *OBJC_NONNULL, const void *OBJC_NONNULL, + ptrdiff_t, BOOL, BOOL); +extern void objc_setPropertyStruct(void *OBJC_NONNULL, const void *OBJC_NONNULL, + ptrdiff_t, BOOL, BOOL); +extern void objc_enumerationMutation(id OBJC_NONNULL); +extern void objc_setEnumerationMutationHandler( + objc_enumeration_mutation_handler OBJC_NULLABLE); +#ifdef __cplusplus +} +#endif + +#undef OBJC_NONNULL +#undef OBJC_NULLABLE +#undef OBJC_UNSAFE_UNRETAINED +#undef OBJC_ROOT_CLASS + +#endif Index: src/runtime/arc.m ================================================================== --- src/runtime/arc.m +++ src/runtime/arc.m @@ -14,12 +14,12 @@ * file. */ #include "config.h" -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #ifdef OF_HAVE_THREADS # import "threading.h" #endif Index: src/runtime/category.m ================================================================== --- src/runtime/category.m +++ src/runtime/category.m @@ -18,12 +18,12 @@ #include #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" static struct objc_hashtable *categories = NULL; static void register_selectors(struct objc_abi_category *cat) Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -21,12 +21,12 @@ #include #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" static struct objc_hashtable *classes = NULL; static unsigned classes_cnt = 0; static Class *load_queue = NULL; static size_t load_queue_cnt = 0; Index: src/runtime/dtable.m ================================================================== --- src/runtime/dtable.m +++ src/runtime/dtable.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" static struct objc_dtable_level2 *empty_level2 = NULL; #ifdef OF_SELUID24 static struct objc_dtable_level3 *empty_level3 = NULL; #endif Index: src/runtime/exception.m ================================================================== --- src/runtime/exception.m +++ src/runtime/exception.m @@ -18,12 +18,12 @@ #include #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #import "macros.h" #ifdef OF_HAVE_THREADS # include "threading.h" #endif Index: src/runtime/hashtable.m ================================================================== --- src/runtime/hashtable.m +++ src/runtime/hashtable.m @@ -20,12 +20,12 @@ #include #include #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" struct objc_hashtable_bucket objc_deleted_bucket; uint32_t objc_hash_string(const void *str_) Index: src/runtime/init.m ================================================================== --- src/runtime/init.m +++ src/runtime/init.m @@ -14,12 +14,12 @@ * file. */ #include "config.h" -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" void __objc_exec_class(void *module_) { struct objc_abi_module *module = module_; Index: src/runtime/lookup.m ================================================================== --- src/runtime/lookup.m +++ src/runtime/lookup.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #import "macros.h" @interface DummyObject { Class isa; Index: src/runtime/misc.m ================================================================== --- src/runtime/misc.m +++ src/runtime/misc.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#include "runtime.h" -#include "runtime-private.h" +#include "ObjFW-RT.h" +#include "private.h" static objc_enumeration_mutation_handler enumeration_mutation_handler = NULL; void objc_enumerationMutation(id obj) Index: src/runtime/morphos-library.m ================================================================== --- src/runtime/morphos-library.m +++ src/runtime/morphos-library.m @@ -14,11 +14,11 @@ * file. */ #include "config.h" -#import "runtime.h" +#import "ObjFW-RT.h" #import "macros.h" #define BOOL EXEC_BOOL #include #include @@ -69,11 +69,11 @@ (ULONG)objc_getProperty, (ULONG)objc_setProperty, (ULONG)objc_getPropertyStruct, (ULONG)objc_setPropertyStruct, (ULONG)objc_enumerationMutation, - /* Functions declared in runtime.h */ + /* Functions declared in ObjFW-RT.h */ (ULONG)sel_registerName, (ULONG)sel_getName, (ULONG)sel_isEqual, (ULONG)objc_allocateClassPair, (ULONG)objc_registerClassPair, ADDED src/runtime/private.h Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +#if defined(__has_feature) && __has_feature(nullability) +# define OBJC_NONNULL _Nonnull +# define OBJC_NULLABLE _Nullable +#else +# define OBJC_NONNULL +# define OBJC_NULLABLE +#endif + +struct objc_abi_class { + struct objc_abi_class *OBJC_NONNULL metaclass; + const char *OBJC_NULLABLE superclass; + const char *OBJC_NONNULL name; + unsigned long version; + unsigned long info; + long instance_size; + void *OBJC_NULLABLE ivars; + struct objc_abi_method_list *OBJC_NULLABLE methodlist; + void *OBJC_NULLABLE dtable; + void *OBJC_NULLABLE subclass_list; + void *OBJC_NULLABLE sibling_class; + void *OBJC_NULLABLE protocols; + void *OBJC_NULLABLE gc_object_type; + long abi_version; + int32_t *OBJC_NONNULL *OBJC_NULLABLE ivar_offsets; + void *OBJC_NULLABLE properties; +}; + +struct objc_abi_selector { + const char *OBJC_NONNULL name; + const char *OBJC_NULLABLE types; +}; + +struct objc_abi_method { + struct objc_abi_selector sel; + IMP OBJC_NONNULL imp; +}; + +struct objc_abi_method_list { + struct objc_abi_method_list *OBJC_NULLABLE next; + unsigned int count; + struct objc_abi_method methods[1]; +}; + +struct objc_abi_category { + const char *OBJC_NONNULL category_name; + const char *OBJC_NONNULL class_name; + struct objc_abi_method_list *OBJC_NULLABLE instance_methods; + struct objc_abi_method_list *OBJC_NULLABLE class_methods; + struct objc_protocol_list *OBJC_NULLABLE protocols; +}; + +struct objc_abi_method_description { + const char *OBJC_NONNULL name; + const char *OBJC_NONNULL types; +}; + +struct objc_abi_method_description_list { + int count; + struct objc_abi_method_description list[1]; +}; + +struct objc_abi_static_instances { + const char *OBJC_NONNULL class_name; + id OBJC_NULLABLE instances[1]; +}; + +struct objc_abi_symtab { + unsigned long unknown; + struct objc_abi_selector *OBJC_NULLABLE sel_refs; + uint16_t cls_def_cnt; + uint16_t cat_def_cnt; + void *OBJC_NONNULL defs[1]; +}; + +struct objc_abi_module { + unsigned long version; /* 9 = non-fragile */ + unsigned long size; + const char *OBJC_NULLABLE name; + struct objc_abi_symtab *OBJC_NONNULL symtab; +}; + +struct objc_hashtable_bucket { + const void *OBJC_NONNULL key, *OBJC_NONNULL obj; + uint32_t hash; +}; + +struct objc_hashtable { + uint32_t (*OBJC_NONNULL hash)(const void *OBJC_NONNULL key); + bool (*OBJC_NONNULL equal)(const void *OBJC_NONNULL key1, + const void *OBJC_NONNULL key2); + uint32_t count, size; + struct objc_hashtable_bucket *OBJC_NONNULL *OBJC_NULLABLE data; +}; + +struct objc_sparsearray { + struct objc_sparsearray_data { + void *OBJC_NULLABLE next[256]; + } *OBJC_NONNULL data; + uint8_t index_size; +}; + +struct objc_dtable { + struct objc_dtable_level2 { +#ifdef OF_SELUID24 + struct objc_dtable_level3 { + IMP OBJC_NULLABLE buckets[256]; + } *OBJC_NONNULL buckets[256]; +#else + IMP OBJC_NULLABLE buckets[256]; +#endif + } *OBJC_NONNULL buckets[256]; +}; + +extern void objc_register_all_categories(struct objc_abi_symtab *OBJC_NONNULL); +extern struct objc_category *OBJC_NULLABLE *OBJC_NULLABLE + objc_categories_for_class(Class OBJC_NONNULL); +extern void objc_unregister_all_categories(void); +extern void objc_initialize_class(Class OBJC_NONNULL); +extern void objc_update_dtable(Class OBJC_NONNULL); +extern void objc_register_all_classes(struct objc_abi_symtab *OBJC_NONNULL); +extern Class OBJC_NULLABLE objc_classname_to_class(const char *OBJC_NONNULL, + bool); +extern void objc_unregister_class(Class OBJC_NONNULL); +extern void objc_unregister_all_classes(void); +extern uint32_t objc_hash_string(const void *OBJC_NONNULL); +extern bool objc_equal_string(const void *OBJC_NONNULL, + const void *OBJC_NONNULL); +extern struct objc_hashtable *OBJC_NONNULL objc_hashtable_new( + uint32_t (*OBJC_NONNULL)(const void *OBJC_NONNULL), + bool (*OBJC_NONNULL)(const void *OBJC_NONNULL, const void *OBJC_NONNULL), + uint32_t); +extern struct objc_hashtable_bucket objc_deleted_bucket; +extern void objc_hashtable_set(struct objc_hashtable *OBJC_NONNULL, + const void *OBJC_NONNULL, const void *OBJC_NONNULL); +extern void *OBJC_NULLABLE objc_hashtable_get( + struct objc_hashtable *OBJC_NONNULL, const void *OBJC_NONNULL); +extern void objc_hashtable_delete(struct objc_hashtable *OBJC_NONNULL, + const void *OBJC_NONNULL); +extern void objc_hashtable_free(struct objc_hashtable *OBJC_NONNULL); +extern void objc_register_selector(struct objc_abi_selector *OBJC_NONNULL); +extern void objc_register_all_selectors(struct objc_abi_symtab *OBJC_NONNULL); +extern void objc_unregister_all_selectors(void); +extern struct objc_sparsearray *OBJC_NONNULL objc_sparsearray_new(uint8_t); +extern void *OBJC_NULLABLE objc_sparsearray_get( + struct objc_sparsearray *OBJC_NONNULL, uintptr_t); +extern void objc_sparsearray_set(struct objc_sparsearray *OBJC_NONNULL, + uintptr_t, void *OBJC_NULLABLE); +extern void objc_sparsearray_free(struct objc_sparsearray *OBJC_NONNULL); +extern struct objc_dtable *OBJC_NONNULL objc_dtable_new(void); +extern void objc_dtable_copy(struct objc_dtable *OBJC_NONNULL, + struct objc_dtable *OBJC_NONNULL); +extern void objc_dtable_set(struct objc_dtable *OBJC_NONNULL, uint32_t, + IMP OBJC_NULLABLE); +extern void objc_dtable_free(struct objc_dtable *OBJC_NONNULL); +extern void objc_dtable_cleanup(void); +extern void objc_init_static_instances(struct objc_abi_symtab *OBJC_NONNULL); +extern void objc_forget_pending_static_instances(void); +#ifdef OF_HAVE_THREADS +extern void objc_global_mutex_lock(void); +extern void objc_global_mutex_unlock(void); +extern void objc_global_mutex_free(void); +#else +# define objc_global_mutex_lock() +# define objc_global_mutex_unlock() +# define objc_global_mutex_free() +#endif + +static inline IMP OBJC_NULLABLE +objc_dtable_get(const struct objc_dtable *OBJC_NONNULL dtable, uint32_t idx) +{ +#ifdef OF_SELUID24 + uint8_t i = idx >> 16; + uint8_t j = idx >> 8; + uint8_t k = idx; + + return dtable->buckets[i]->buckets[j]->buckets[k]; +#else + uint8_t i = idx >> 8; + uint8_t j = idx; + + return dtable->buckets[i]->buckets[j]; +#endif +} + +#if defined(OF_ELF) +# if defined(OF_X86_64) || defined(OF_X86) || defined(OF_POWERPC) || \ + defined(OF_ARM64) || defined(OF_ARM) || \ + defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ + defined(OF_SPARC64) || defined(OF_SPARC) +# define OF_ASM_LOOKUP +# endif +#elif defined(OF_MACH_O) +# if defined(OF_X86_64) || defined(OF_POWERPC) +# define OF_ASM_LOOKUP +# endif +#elif defined(OF_WINDOWS) +# if defined(OF_X86_64) || defined(OF_X86) +# define OF_ASM_LOOKUP +# endif +#endif + +#define OBJC_ERROR(...) \ + { \ + fprintf(stderr, "[objc @ " __FILE__ ":%d] ", __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + fputs("\n", stderr); \ + abort(); \ + } + +#undef OBJC_NONNULL +#undef OBJC_NULLABLE Index: src/runtime/property.m ================================================================== --- src/runtime/property.m +++ src/runtime/property.m @@ -16,12 +16,12 @@ #include "config.h" #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #import "OFObject.h" #ifdef OF_HAVE_THREADS # import "threading.h" Index: src/runtime/protocol.m ================================================================== --- src/runtime/protocol.m +++ src/runtime/protocol.m @@ -16,12 +16,12 @@ #include "config.h" #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" @implementation Protocol @end const char * DELETED src/runtime/runtime-private.h Index: src/runtime/runtime-private.h ================================================================== --- src/runtime/runtime-private.h +++ src/runtime/runtime-private.h @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -#if defined(__has_feature) && __has_feature(nullability) -# define OBJC_NONNULL _Nonnull -# define OBJC_NULLABLE _Nullable -#else -# define OBJC_NONNULL -# define OBJC_NULLABLE -#endif - -struct objc_abi_class { - struct objc_abi_class *OBJC_NONNULL metaclass; - const char *OBJC_NULLABLE superclass; - const char *OBJC_NONNULL name; - unsigned long version; - unsigned long info; - long instance_size; - void *OBJC_NULLABLE ivars; - struct objc_abi_method_list *OBJC_NULLABLE methodlist; - void *OBJC_NULLABLE dtable; - void *OBJC_NULLABLE subclass_list; - void *OBJC_NULLABLE sibling_class; - void *OBJC_NULLABLE protocols; - void *OBJC_NULLABLE gc_object_type; - long abi_version; - int32_t *OBJC_NONNULL *OBJC_NULLABLE ivar_offsets; - void *OBJC_NULLABLE properties; -}; - -struct objc_abi_selector { - const char *OBJC_NONNULL name; - const char *OBJC_NULLABLE types; -}; - -struct objc_abi_method { - struct objc_abi_selector sel; - IMP OBJC_NONNULL imp; -}; - -struct objc_abi_method_list { - struct objc_abi_method_list *OBJC_NULLABLE next; - unsigned int count; - struct objc_abi_method methods[1]; -}; - -struct objc_abi_category { - const char *OBJC_NONNULL category_name; - const char *OBJC_NONNULL class_name; - struct objc_abi_method_list *OBJC_NULLABLE instance_methods; - struct objc_abi_method_list *OBJC_NULLABLE class_methods; - struct objc_protocol_list *OBJC_NULLABLE protocols; -}; - -struct objc_abi_method_description { - const char *OBJC_NONNULL name; - const char *OBJC_NONNULL types; -}; - -struct objc_abi_method_description_list { - int count; - struct objc_abi_method_description list[1]; -}; - -struct objc_abi_static_instances { - const char *OBJC_NONNULL class_name; - id OBJC_NULLABLE instances[1]; -}; - -struct objc_abi_symtab { - unsigned long unknown; - struct objc_abi_selector *OBJC_NULLABLE sel_refs; - uint16_t cls_def_cnt; - uint16_t cat_def_cnt; - void *OBJC_NONNULL defs[1]; -}; - -struct objc_abi_module { - unsigned long version; /* 9 = non-fragile */ - unsigned long size; - const char *OBJC_NULLABLE name; - struct objc_abi_symtab *OBJC_NONNULL symtab; -}; - -struct objc_hashtable_bucket { - const void *OBJC_NONNULL key, *OBJC_NONNULL obj; - uint32_t hash; -}; - -struct objc_hashtable { - uint32_t (*OBJC_NONNULL hash)(const void *OBJC_NONNULL key); - bool (*OBJC_NONNULL equal)(const void *OBJC_NONNULL key1, - const void *OBJC_NONNULL key2); - uint32_t count, size; - struct objc_hashtable_bucket *OBJC_NONNULL *OBJC_NULLABLE data; -}; - -struct objc_sparsearray { - struct objc_sparsearray_data { - void *OBJC_NULLABLE next[256]; - } *OBJC_NONNULL data; - uint8_t index_size; -}; - -struct objc_dtable { - struct objc_dtable_level2 { -#ifdef OF_SELUID24 - struct objc_dtable_level3 { - IMP OBJC_NULLABLE buckets[256]; - } *OBJC_NONNULL buckets[256]; -#else - IMP OBJC_NULLABLE buckets[256]; -#endif - } *OBJC_NONNULL buckets[256]; -}; - -extern void objc_register_all_categories(struct objc_abi_symtab *OBJC_NONNULL); -extern struct objc_category *OBJC_NULLABLE *OBJC_NULLABLE - objc_categories_for_class(Class OBJC_NONNULL); -extern void objc_unregister_all_categories(void); -extern void objc_initialize_class(Class OBJC_NONNULL); -extern void objc_update_dtable(Class OBJC_NONNULL); -extern void objc_register_all_classes(struct objc_abi_symtab *OBJC_NONNULL); -extern Class OBJC_NULLABLE objc_classname_to_class(const char *OBJC_NONNULL, - bool); -extern void objc_unregister_class(Class OBJC_NONNULL); -extern void objc_unregister_all_classes(void); -extern uint32_t objc_hash_string(const void *OBJC_NONNULL); -extern bool objc_equal_string(const void *OBJC_NONNULL, - const void *OBJC_NONNULL); -extern struct objc_hashtable *OBJC_NONNULL objc_hashtable_new( - uint32_t (*OBJC_NONNULL)(const void *OBJC_NONNULL), - bool (*OBJC_NONNULL)(const void *OBJC_NONNULL, const void *OBJC_NONNULL), - uint32_t); -extern struct objc_hashtable_bucket objc_deleted_bucket; -extern void objc_hashtable_set(struct objc_hashtable *OBJC_NONNULL, - const void *OBJC_NONNULL, const void *OBJC_NONNULL); -extern void *OBJC_NULLABLE objc_hashtable_get( - struct objc_hashtable *OBJC_NONNULL, const void *OBJC_NONNULL); -extern void objc_hashtable_delete(struct objc_hashtable *OBJC_NONNULL, - const void *OBJC_NONNULL); -extern void objc_hashtable_free(struct objc_hashtable *OBJC_NONNULL); -extern void objc_register_selector(struct objc_abi_selector *OBJC_NONNULL); -extern void objc_register_all_selectors(struct objc_abi_symtab *OBJC_NONNULL); -extern void objc_unregister_all_selectors(void); -extern struct objc_sparsearray *OBJC_NONNULL objc_sparsearray_new(uint8_t); -extern void *OBJC_NULLABLE objc_sparsearray_get( - struct objc_sparsearray *OBJC_NONNULL, uintptr_t); -extern void objc_sparsearray_set(struct objc_sparsearray *OBJC_NONNULL, - uintptr_t, void *OBJC_NULLABLE); -extern void objc_sparsearray_free(struct objc_sparsearray *OBJC_NONNULL); -extern struct objc_dtable *OBJC_NONNULL objc_dtable_new(void); -extern void objc_dtable_copy(struct objc_dtable *OBJC_NONNULL, - struct objc_dtable *OBJC_NONNULL); -extern void objc_dtable_set(struct objc_dtable *OBJC_NONNULL, uint32_t, - IMP OBJC_NULLABLE); -extern void objc_dtable_free(struct objc_dtable *OBJC_NONNULL); -extern void objc_dtable_cleanup(void); -extern void objc_init_static_instances(struct objc_abi_symtab *OBJC_NONNULL); -extern void objc_forget_pending_static_instances(void); -#ifdef OF_HAVE_THREADS -extern void objc_global_mutex_lock(void); -extern void objc_global_mutex_unlock(void); -extern void objc_global_mutex_free(void); -#else -# define objc_global_mutex_lock() -# define objc_global_mutex_unlock() -# define objc_global_mutex_free() -#endif - -static inline IMP OBJC_NULLABLE -objc_dtable_get(const struct objc_dtable *OBJC_NONNULL dtable, uint32_t idx) -{ -#ifdef OF_SELUID24 - uint8_t i = idx >> 16; - uint8_t j = idx >> 8; - uint8_t k = idx; - - return dtable->buckets[i]->buckets[j]->buckets[k]; -#else - uint8_t i = idx >> 8; - uint8_t j = idx; - - return dtable->buckets[i]->buckets[j]; -#endif -} - -#if defined(OF_ELF) -# if defined(OF_X86_64) || defined(OF_X86) || defined(OF_POWERPC) || \ - defined(OF_ARM64) || defined(OF_ARM) || \ - defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ - defined(OF_SPARC64) || defined(OF_SPARC) -# define OF_ASM_LOOKUP -# endif -#elif defined(OF_MACH_O) -# if defined(OF_X86_64) || defined(OF_POWERPC) -# define OF_ASM_LOOKUP -# endif -#elif defined(OF_WINDOWS) -# if defined(OF_X86_64) || defined(OF_X86) -# define OF_ASM_LOOKUP -# endif -#endif - -#define OBJC_ERROR(...) \ - { \ - fprintf(stderr, "[objc @ " __FILE__ ":%d] ", __LINE__); \ - fprintf(stderr, __VA_ARGS__); \ - fputs("\n", stderr); \ - abort(); \ - } - -#undef OBJC_NONNULL -#undef OBJC_NULLABLE DELETED src/runtime/runtime.h Index: src/runtime/runtime.h ================================================================== --- src/runtime/runtime.h +++ src/runtime/runtime.h @@ -1,293 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __OBJFW_RUNTIME_H__ -#define __OBJFW_RUNTIME_H__ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#include -#include -#include - -#ifndef __has_feature -# define __has_feature(x) 0 -#endif - -#ifndef __has_attribute -# define __has_attribute(x) 0 -#endif - -#if __has_feature(objc_arc) -# define OBJC_UNSAFE_UNRETAINED __unsafe_unretained -#else -# define OBJC_UNSAFE_UNRETAINED -#endif - -#if __has_feature(nullability) -# define OBJC_NONNULL _Nonnull -# define OBJC_NULLABLE _Nullable -#else -# define OBJC_NONNULL -# define OBJC_NULLABLE -#endif - -#if __has_attribute(__objc_root_class__) -# define OBJC_ROOT_CLASS __attribute__((__objc_root_class__)) -#else -# define OBJC_ROOT_CLASS -#endif - -#define Nil (Class)0 -#define nil (id)0 -#define YES (BOOL)1 -#define NO (BOOL)0 - -typedef struct objc_class *Class; -typedef struct objc_object *id; -typedef const struct objc_selector *SEL; -typedef signed char BOOL; -typedef id OBJC_NULLABLE (*IMP)(id OBJC_NONNULL, SEL OBJC_NONNULL, ...); -typedef void (*objc_uncaught_exception_handler)(id OBJC_NULLABLE); -typedef void (*objc_enumeration_mutation_handler)(id OBJC_NONNULL); - -struct objc_class { - Class OBJC_NONNULL isa; - Class OBJC_NULLABLE superclass; - const char *OBJC_NONNULL name; - unsigned long version; - unsigned long info; - long instance_size; - struct objc_ivar_list *OBJC_NULLABLE ivars; - struct objc_method_list *OBJC_NULLABLE methodlist; - struct objc_dtable *OBJC_NULLABLE dtable; - Class OBJC_NONNULL *OBJC_NULLABLE subclass_list; - void *OBJC_NULLABLE sibling_class; - struct objc_protocol_list *OBJC_NULLABLE protocols; - void *OBJC_NULLABLE gc_object_type; - unsigned long abi_version; - int32_t *OBJC_NONNULL *OBJC_NULLABLE ivar_offsets; - struct objc_property_list *OBJC_NULLABLE properties; -}; - -enum objc_class_info { - OBJC_CLASS_INFO_CLASS = 0x001, - OBJC_CLASS_INFO_METACLASS = 0x002, - OBJC_CLASS_INFO_NEW_ABI = 0x010, - OBJC_CLASS_INFO_SETUP = 0x100, - OBJC_CLASS_INFO_LOADED = 0x200, - OBJC_CLASS_INFO_DTABLE = 0x400, - OBJC_CLASS_INFO_INITIALIZED = 0x800 -}; - -struct objc_object { - Class OBJC_NONNULL isa; -}; - -struct objc_selector { - uintptr_t uid; - const char *OBJC_NULLABLE types; -}; - -struct objc_super { - id OBJC_UNSAFE_UNRETAINED OBJC_NULLABLE self; - Class OBJC_NONNULL cls; -}; - -struct objc_method { - struct objc_selector sel; - IMP OBJC_NONNULL imp; -}; - -struct objc_method_list { - struct objc_method_list *OBJC_NULLABLE next; - unsigned int count; - struct objc_method methods[1]; -}; - -struct objc_category { - const char *OBJC_NONNULL category_name; - const char *OBJC_NONNULL class_name; - struct objc_method_list *OBJC_NULLABLE instance_methods; - struct objc_method_list *OBJC_NULLABLE class_methods; - struct objc_protocol_list *OBJC_NULLABLE protocols; -}; - -struct objc_ivar { - const char *OBJC_NONNULL name; - const char *OBJC_NONNULL type; - unsigned int offset; -}; - -struct objc_ivar_list { - unsigned int count; - struct objc_ivar ivars[1]; -}; - -enum objc_property_attributes { - OBJC_PROPERTY_READONLY = 0x01, - OBJC_PROPERTY_GETTER = 0x02, - OBJC_PROPERTY_ASSIGN = 0x04, - OBJC_PROPERTY_READWRITE = 0x08, - OBJC_PROPERTY_RETAIN = 0x10, - OBJC_PROPERTY_COPY = 0x20, - OBJC_PROPERTY_NONATOMIC = 0x40, - OBJC_PROPERTY_SETTER = 0x80 -}; - -enum objc_property_extended_attributes { - OBJC_PROPERTY_SYNTHESIZE = 0x1, - OBJC_PROPERTY_DYNAMIC = 0x2, - OBJC_PROPERTY_PROTOCOL = 0x3, - OBJC_PROPERTY_ATOMIC = 0x4, - OBJC_PROPERTY_WEAK = 0x8, - OBJC_PROPERTY_STRONG = 0x10, - OBJC_PROPERTY_UNSAFE_UNRETAINED = 0x20 -}; - -struct objc_property { - const char *OBJC_NONNULL name; - unsigned char attributes, extended_attributes; - struct { - const char *OBJC_NULLABLE name; - const char *OBJC_NULLABLE type; - } getter, setter; -}; - -struct objc_property_list { - unsigned int count; - struct objc_property_list *OBJC_NULLABLE next; - struct objc_property properties[1]; -}; - -#ifdef __OBJC__ -OBJC_ROOT_CLASS -@interface Protocol -{ -@public -#else -typedef struct { -#endif - Class OBJC_NONNULL isa; - const char *OBJC_NONNULL name; - struct objc_protocol_list *OBJC_NULLABLE protocol_list; - struct objc_abi_method_description_list *OBJC_NULLABLE instance_methods; - struct objc_abi_method_description_list *OBJC_NULLABLE class_methods; -#ifdef __OBJC__ -} -@end -#else -} Protocol; -#endif - -struct objc_protocol_list { - struct objc_protocol_list *OBJC_NULLABLE next; - long count; - Protocol *OBJC_UNSAFE_UNRETAINED OBJC_NONNULL list[1]; -}; - -#ifdef __cplusplus -extern "C" { -#endif -extern SEL OBJC_NONNULL sel_registerName(const char *OBJC_NONNULL); -extern const char *OBJC_NONNULL sel_getName(SEL OBJC_NONNULL); -extern bool sel_isEqual(SEL OBJC_NONNULL, SEL OBJC_NONNULL); -extern Class OBJC_NONNULL objc_allocateClassPair(Class OBJC_NULLABLE, - const char *OBJC_NONNULL, size_t); -extern void objc_registerClassPair(Class OBJC_NONNULL); -extern id OBJC_NULLABLE objc_lookUpClass(const char *OBJC_NONNULL); -extern id OBJC_NULLABLE objc_getClass(const char *OBJC_NONNULL); -extern id OBJC_NONNULL objc_getRequiredClass(const char *OBJC_NONNULL); -extern unsigned int objc_getClassList(Class OBJC_NONNULL *OBJC_NULLABLE, - unsigned int); -extern Class OBJC_NONNULL *OBJC_NONNULL objc_copyClassList( - unsigned int *OBJC_NULLABLE); -extern bool class_isMetaClass(Class OBJC_NULLABLE); -extern const char *OBJC_NONNULL class_getName(Class OBJC_NULLABLE); -extern Class OBJC_NULLABLE class_getSuperclass(Class OBJC_NULLABLE); -extern unsigned long class_getInstanceSize(Class OBJC_NULLABLE); -extern bool class_respondsToSelector(Class OBJC_NULLABLE, SEL OBJC_NONNULL); -extern bool class_conformsToProtocol(Class OBJC_NULLABLE, - Protocol *OBJC_NONNULL); -extern IMP OBJC_NULLABLE class_getMethodImplementation(Class OBJC_NULLABLE, - SEL OBJC_NONNULL); -extern IMP OBJC_NULLABLE class_getMethodImplementation_stret( - Class OBJC_NULLABLE, SEL OBJC_NONNULL); -extern const char *OBJC_NULLABLE class_getMethodTypeEncoding( - Class OBJC_NULLABLE, SEL OBJC_NONNULL); -extern bool class_addMethod(Class OBJC_NONNULL, SEL OBJC_NONNULL, - IMP OBJC_NONNULL, const char *OBJC_NULLABLE); -extern IMP OBJC_NULLABLE class_replaceMethod(Class OBJC_NONNULL, - SEL OBJC_NONNULL, IMP OBJC_NONNULL, const char *OBJC_NULLABLE); -extern Class OBJC_NULLABLE object_getClass(id OBJC_NULLABLE); -extern Class OBJC_NULLABLE object_setClass(id OBJC_NULLABLE, - Class OBJC_NONNULL); -extern const char *OBJC_NONNULL object_getClassName(id OBJC_NULLABLE); -extern const char *OBJC_NONNULL protocol_getName(Protocol *OBJC_NONNULL); -extern bool protocol_isEqual(Protocol *OBJC_NONNULL, Protocol *OBJC_NONNULL); -extern bool protocol_conformsToProtocol(Protocol *OBJC_NONNULL, - Protocol *OBJC_NONNULL); -extern void objc_exit(void); -extern OBJC_NULLABLE objc_uncaught_exception_handler - objc_setUncaughtExceptionHandler( - objc_uncaught_exception_handler OBJC_NULLABLE); -extern void objc_setForwardHandler(IMP OBJC_NULLABLE, IMP OBJC_NULLABLE); -extern void objc_zero_weak_references(id OBJC_NONNULL); - -/* - * Used by the compiler, but can also be called manually. - * - * These declarations are also required to prevent Clang's implicit - * declarations which include __declspec(dllimport) on Windows. - */ -struct objc_abi_module; -extern void __objc_exec_class(void *OBJC_NONNULL); -extern IMP OBJC_NONNULL objc_msg_lookup(id OBJC_NULLABLE, SEL OBJC_NONNULL); -extern IMP OBJC_NONNULL objc_msg_lookup_stret(id OBJC_NULLABLE, - SEL OBJC_NONNULL); -extern IMP OBJC_NONNULL objc_msg_lookup_super(struct objc_super *OBJC_NONNULL, - SEL OBJC_NONNULL); -extern IMP OBJC_NONNULL objc_msg_lookup_super_stret( - struct objc_super *OBJC_NONNULL, SEL OBJC_NONNULL); -extern void objc_exception_throw(id OBJC_NULLABLE); -extern int objc_sync_enter(id OBJC_NULLABLE); -extern int objc_sync_exit(id OBJC_NULLABLE); -extern id OBJC_NULLABLE objc_getProperty(id OBJC_NONNULL, SEL OBJC_NONNULL, - ptrdiff_t, BOOL); -extern void objc_setProperty(id OBJC_NONNULL, SEL OBJC_NONNULL, ptrdiff_t, - id OBJC_NULLABLE, BOOL, signed char); -extern void objc_getPropertyStruct(void *OBJC_NONNULL, const void *OBJC_NONNULL, - ptrdiff_t, BOOL, BOOL); -extern void objc_setPropertyStruct(void *OBJC_NONNULL, const void *OBJC_NONNULL, - ptrdiff_t, BOOL, BOOL); -extern void objc_enumerationMutation(id OBJC_NONNULL); -extern void objc_setEnumerationMutationHandler( - objc_enumeration_mutation_handler OBJC_NULLABLE); -#ifdef __cplusplus -} -#endif - -#undef OBJC_NONNULL -#undef OBJC_NULLABLE -#undef OBJC_UNSAFE_UNRETAINED -#undef OBJC_ROOT_CLASS - -#endif Index: src/runtime/selector.m ================================================================== --- src/runtime/selector.m +++ src/runtime/selector.m @@ -18,12 +18,12 @@ #include #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #import "macros.h" #ifdef OF_SELUID24 # define SEL_MAX 0xFFFFFF Index: src/runtime/sparsearray.m ================================================================== --- src/runtime/sparsearray.m +++ src/runtime/sparsearray.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" struct objc_sparsearray * objc_sparsearray_new(uint8_t index_size) { struct objc_sparsearray *sparsearray; Index: src/runtime/static-instances.m ================================================================== --- src/runtime/static-instances.m +++ src/runtime/static-instances.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" static struct objc_abi_static_instances **static_instances = NULL; static size_t static_instances_cnt = 0; void Index: src/runtime/synchronized.m ================================================================== --- src/runtime/synchronized.m +++ src/runtime/synchronized.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #ifdef OF_HAVE_THREADS # import "threading.h" static struct lock_s { Index: src/runtime/threading.m ================================================================== --- src/runtime/threading.m +++ src/runtime/threading.m @@ -17,12 +17,12 @@ #include "config.h" #include #include -#import "runtime.h" -#import "runtime-private.h" +#import "ObjFW-RT.h" +#import "private.h" #import "threading.h" static of_rmutex_t global_mutex; static of_once_t once_control = OF_ONCE_INIT; Index: tests/OFBlockTests.m ================================================================== --- tests/OFBlockTests.m +++ tests/OFBlockTests.m @@ -19,11 +19,11 @@ #import "OFBlock.h" #import "OFString.h" #import "OFAutoreleasePool.h" #if defined(OF_OBJFW_RUNTIME) -# include "runtime.h" +# include "ObjFW-RT.h" #elif defined(OF_APPLE_RUNTIME) # include #endif #import "TestsAppDelegate.h" Index: tests/plugin/TestPlugin.m ================================================================== --- tests/plugin/TestPlugin.m +++ tests/plugin/TestPlugin.m @@ -17,11 +17,11 @@ #include "config.h" #import "TestPlugin.h" #ifdef OF_OBJFW_RUNTIME -# import "runtime-private.h" +# import "runtime/private.h" OF_DESTRUCTOR() { objc_unregister_class(objc_getClass("TestPlugin")); }