Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -34,16 +34,17 @@ MORPHOS_LIB_OBJS_EXTRA = morphos-library.o ${LOOKUP_ASM_LOOKUP_ASM_A} include ../../buildsys.mk ${MORPHOS_LIB}: ppcinline.h -ppcinline.h: ObjFW-RT.fd ObjFW-RT.h +ppcinline.h: ObjFW-RT.fd protos.h cvinclude.pl \ --root ObjFW_RT \ --fd ObjFW-RT.fd \ --clib protos.h \ --inline $@ CPPFLAGS += -I. -I.. -I../.. \ + -DOF_COMPILING_OBJFW_RT \ -DOBJFW_RT_LIB_MAJOR=${OBJFW_RT_LIB_MAJOR} \ -DOBJFW_RT_LIB_MINOR=${OBJFW_RT_LIB_MINOR} LD = ${OBJC} Index: src/runtime/ObjFW-RT.fd ================================================================== --- src/runtime/ObjFW-RT.fd +++ src/runtime/ObjFW-RT.fd @@ -2,26 +2,26 @@ ##bias 30 ##public * Functions for the glue code objc_set_exit()(sysv,r12base) * Used by the compiler - these need glue code -__objc_exec_class()(sysv,r12base) -objc_msg_lookup()(sysv,r12base) -objc_msg_lookup_stret()(sysv,r12base) -objc_msg_lookup_super()(sysv,r12base) -objc_msg_lookup_super_stret()(sysv,r12base) -objc_lookUpClass()(sysv,r12base) -objc_getClass()(sysv,r12base) -objc_getRequiredClass()(sysv,r12base) -objc_exception_throw()(sysv,r12base) -objc_sync_enter()(sysv,r12base) -objc_sync_exit()(sysv,r12base) -objc_getProperty()(sysv,r12base) -objc_setProperty()(sysv,r12base) -objc_getPropertyStruct()(sysv,r12base) -objc_setPropertyStruct()(sysv,r12base) -objc_enumerationMutation()(sysv,r12base) +__objc_exec_class_inline()(sysv,r12base) +objc_msg_lookup_inline()(sysv,r12base) +objc_msg_lookup_stret_inline()(sysv,r12base) +objc_msg_lookup_super_inline()(sysv,r12base) +objc_msg_lookup_super_stret_inline()(sysv,r12base) +objc_lookUpClass_inline()(sysv,r12base) +objc_getClass_inline()(sysv,r12base) +objc_getRequiredClass_inline()(sysv,r12base) +objc_exception_throw_inline()(sysv,r12base) +objc_sync_enter_inline()(sysv,r12base) +objc_sync_exit_inline()(sysv,r12base) +objc_getProperty_inline()(sysv,r12base) +objc_setProperty_inline()(sysv,r12base) +objc_getPropertyStruct_inline()(sysv,r12base) +objc_setPropertyStruct_inline()(sysv,r12base) +objc_enumerationMutation_inline()(sysv,r12base) * Functions declared in ObjFW-RT.h sel_registerName()(sysv,r12base) sel_getName()(sysv,r12base) sel_isEqual()(sysv,r12base) objc_allocateClassPair()(sysv,r12base) @@ -46,8 +46,8 @@ protocol_isEqual()(sysv,r12base) protocol_conformsToProtocol()(sysv,r12base) objc_exit()(sysv,r12base) objc_setUncaughtExceptionHandler()(sysv,r12base) objc_setForwardHandler()(sysv,r12base) -objc_zero_weak_references()(sysv,r12base) objc_setEnumerationMutationHandler()(sysv,r12base) +objc_zero_weak_references()(sysv,r12base) ##end Index: src/runtime/ObjFW-RT.h ================================================================== --- src/runtime/ObjFW-RT.h +++ src/runtime/ObjFW-RT.h @@ -25,10 +25,12 @@ #endif #include #include #include + +#import "platform.h" #ifndef __has_feature # define __has_feature(x) 0 #endif @@ -197,22 +199,20 @@ struct objc_protocol_list *_Nullable next; long count; Protocol *__unsafe_unretained _Nonnull list[1]; }; -#ifdef __cplusplus +#if 1 /* !defined(OF_MORPHOS) || defined(OF_COMPILING_OBJFW_RT) */ +# ifdef __cplusplus extern "C" { -#endif +# endif extern SEL _Nonnull sel_registerName(const char *_Nonnull); extern const char *_Nonnull sel_getName(SEL _Nonnull); extern bool sel_isEqual(SEL _Nonnull, SEL _Nonnull); extern Class _Nonnull objc_allocateClassPair(Class _Nullable, const char *_Nonnull, size_t); extern void objc_registerClassPair(Class _Nonnull); -extern id _Nullable objc_lookUpClass(const char *_Nonnull); -extern id _Nullable objc_getClass(const char *_Nonnull); -extern id _Nonnull objc_getRequiredClass(const char *_Nonnull); extern unsigned int objc_getClassList(Class _Nonnull *_Nullable, unsigned int); extern Class _Nonnull *_Nonnull objc_copyClassList(unsigned int *_Nullable); extern bool class_isMetaClass(Class _Nullable); extern const char *_Nullable class_getName(Class _Nullable); extern Class _Nullable class_getSuperclass(Class _Nullable); @@ -238,14 +238,37 @@ extern void objc_exit(void); extern _Nullable objc_uncaught_exception_handler objc_setUncaughtExceptionHandler( objc_uncaught_exception_handler _Nullable); extern void objc_setForwardHandler(IMP _Nullable, IMP _Nullable); +extern void objc_setEnumerationMutationHandler( + objc_enumeration_mutation_handler _Nullable); extern void objc_zero_weak_references(id _Nonnull); +# ifdef __cplusplus +} +# endif +#else +# define BOOL EXEC_BOOL +# include +# undef BOOL +# ifdef __cplusplus +extern "C" { +# endif +extern struct Library *ObjFWRTBase; +# ifdef __cplusplus +} +# endif +# include "ppcinline.h" +#endif +#ifdef __cplusplus +extern "C" { +#endif /* * Used by the compiler, but can also be called manually. + * + * They need to be in the glue code for the MorphOS library. * * These declarations are also required to prevent Clang's implicit * declarations which include __declspec(dllimport) on Windows. */ struct objc_abi_module; @@ -254,10 +277,13 @@ extern IMP _Nonnull objc_msg_lookup_stret(id _Nullable, SEL _Nonnull); extern IMP _Nonnull objc_msg_lookup_super(struct objc_super *_Nonnull, SEL _Nonnull); extern IMP _Nonnull objc_msg_lookup_super_stret(struct objc_super *_Nonnull, SEL _Nonnull); +extern id _Nullable objc_lookUpClass(const char *_Nonnull); +extern id _Nullable objc_getClass(const char *_Nonnull); +extern id _Nonnull objc_getRequiredClass(const char *_Nonnull); extern void objc_exception_throw(id _Nullable); extern int objc_sync_enter(id _Nullable); extern int objc_sync_exit(id _Nullable); extern id _Nullable objc_getProperty(id _Nonnull, SEL _Nonnull, ptrdiff_t, BOOL); @@ -266,12 +292,10 @@ extern void objc_getPropertyStruct(void *_Nonnull, const void *_Nonnull, ptrdiff_t, BOOL, BOOL); extern void objc_setPropertyStruct(void *_Nonnull, const void *_Nonnull, ptrdiff_t, BOOL, BOOL); extern void objc_enumerationMutation(id _Nonnull); -extern void objc_setEnumerationMutationHandler( - objc_enumeration_mutation_handler _Nullable); #ifdef __cplusplus } #endif #endif Index: src/runtime/morphos-library.m ================================================================== --- src/runtime/morphos-library.m +++ src/runtime/morphos-library.m @@ -97,12 +97,12 @@ (ULONG)protocol_isEqual, (ULONG)protocol_conformsToProtocol, (ULONG)objc_exit, (ULONG)objc_setUncaughtExceptionHandler, (ULONG)objc_setForwardHandler, - (ULONG)objc_zero_weak_references, (ULONG)objc_setEnumerationMutationHandler, + (ULONG)objc_zero_weak_references, -1, FUNCARRAY_END }; static struct Library *lib_init(struct ObjFWRTBase *base, BPTR seg_list, Index: src/runtime/protos.h ================================================================== --- src/runtime/protos.h +++ src/runtime/protos.h @@ -14,18 +14,35 @@ * file. */ #error This file is only to generate ppcinline.h - do not use it! +/* + * Used by the glue code. + */ +void __objc_exec_class_inline(void *); +IMP objc_msg_lookup_inline(id, SEL); +IMP objc_msg_lookup_stret_inline(id, SEL); +IMP objc_msg_lookup_super_inline(struct objc_super *, SEL); +IMP objc_msg_lookup_super_stret_inline(struct objc_super *, SEL); +id objc_lookUpClass_inline(const char *); +id objc_getClass_inline(const char *); +id objc_getRequiredClass_inline(const char *); +void objc_exception_throw_inline(id); +int objc_sync_enter_inline(id); +int objc_sync_exit_inline(id); +id objc_getProperty_inline(id, SEL, ptrdiff_t, BOOL); +void objc_setProperty_inline(id, SEL, ptrdiff_t, id, BOOL, signed char); +void objc_getPropertyStruct_inline(void *, const void *, ptrdiff_t, BOOL, BOOL); +void objc_setPropertyStruct_inline(void *, const void *, ptrdiff_t, BOOL, BOOL); +void objc_enumerationMutation_inline(id); + SEL sel_registerName(const char *); const char *sel_getName(SEL); bool sel_isEqual(SEL, SEL); Class objc_allocateClassPair(Class, const char *, size_t); void objc_registerClassPair(Class); -id objc_lookUpClass(const char *); -id objc_getClass(const char *); -id objc_getRequiredClass(const char *); unsigned int objc_getClassList(Class *, unsigned int); Class *objc_copyClassList(unsigned int *); bool class_isMetaClass(Class); const char *class_getName(Class); Class class_getSuperclass(Class); @@ -45,24 +62,7 @@ bool protocol_conformsToProtocol(Protocol *, Protocol *); void objc_exit(void); objc_uncaught_exception_handler objc_setUncaughtExceptionHandler( objc_uncaught_exception_handler); void objc_setForwardHandler(IMP, IMP); -void objc_zero_weak_references(id); - -/* - * Used by the compiler, but can also be called manually. - */ -void __objc_exec_class(void *); -IMP objc_msg_lookup(id, SEL); -IMP objc_msg_lookup_stret(id, SEL); -IMP objc_msg_lookup_super(struct objc_super *, SEL); -IMP objc_msg_lookup_super_stret(struct objc_super *, SEL); -void objc_exception_throw(id); -int objc_sync_enter(id); -int objc_sync_exit(id); -id objc_getProperty(id, SEL, ptrdiff_t, BOOL); -void objc_setProperty(id, SEL, ptrdiff_t, id, BOOL, signed char); -void objc_getPropertyStruct(void *, const void *, ptrdiff_t, BOOL, BOOL); -void objc_setPropertyStruct(void *, const void *, ptrdiff_t, BOOL, BOOL); -void objc_enumerationMutation(id); void objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler); +void objc_zero_weak_references(id);