Index: src/runtime/ObjFWRT.h ================================================================== --- src/runtime/ObjFWRT.h +++ src/runtime/ObjFWRT.h @@ -627,19 +627,11 @@ * @brief Returns whether the specified object is a tagged pointer. * * @param object The object to inspect * @return Whether the specified object is a tagged pointer */ -static inline bool -object_isTaggedPointer(id _Nullable object) -{ - uintptr_t pointer = (uintptr_t)object; - - return pointer & 1; -} - -extern Class _Nullable object_getTaggedPointerClass(id _Nonnull object); +extern bool object_isTaggedPointer(id _Nullable object); /*! * @brief Returns the value of the specified tagged pointer. * * @param object The object whose tagged pointer value should be returned Index: src/runtime/amiga-glue.m ================================================================== --- src/runtime/amiga-glue.m +++ src/runtime/amiga-glue.m @@ -813,10 +813,18 @@ { M68K_ARG(Class, class, a0) return objc_registerTaggedPointerClass(class); } + +bool __saveds +glue_object_isTaggedPointer PPC_PARAMS(id object) +{ + M68K_ARG(id, object, a0) + + return object_isTaggedPointer(object); +} Class __saveds glue_object_getTaggedPointerClass PPC_PARAMS(id object) { M68K_ARG(id, object, a0) Index: src/runtime/amiga-library.m ================================================================== --- src/runtime/amiga-library.m +++ src/runtime/amiga-library.m @@ -147,13 +147,14 @@ extern void *glue_objc_hashtable_get(void); extern void glue_objc_hashtable_delete(void); extern void glue_objc_hashtable_free(void); extern void glue_objc_setTaggedPointerSecret(void); extern int glue_objc_registerTaggedPointerClass(void); -extern Class _Nullable glue_object_getTaggedPointerClass(void); +extern bool glue_object_isTaggedPointer(void); +extern Class glue_object_getTaggedPointerClass(void); extern uintptr_t glue_object_getTaggedPointerValue(void); -extern id _Nullable glue_objc_createTaggedPointer(void); +extern id glue_objc_createTaggedPointer(void); #ifdef OF_MORPHOS const ULONG __abox__ = 1; #endif struct ExecBase *SysBase; @@ -678,10 +679,11 @@ (CONST_APTR)glue_objc_hashtable_get, (CONST_APTR)glue_objc_hashtable_delete, (CONST_APTR)glue_objc_hashtable_free, (CONST_APTR)glue_objc_setTaggedPointerSecret, (CONST_APTR)glue_objc_registerTaggedPointerClass, + (CONST_APTR)glue_object_isTaggedPointer, (CONST_APTR)glue_object_getTaggedPointerClass, (CONST_APTR)glue_object_getTaggedPointerValue, (CONST_APTR)glue_objc_createTaggedPointer, (CONST_APTR)-1, #ifdef OF_MORPHOS Index: src/runtime/amigaos3.sfd ================================================================== --- src/runtime/amigaos3.sfd +++ src/runtime/amigaos3.sfd @@ -90,9 +90,10 @@ void glue_objc_hashtable_delete(struct objc_hashtable *_Nonnull table, const void *_Nonnull key)(a0,a1) void glue_objc_hashtable_free(struct objc_hashtable *_Nonnull table)(a0) * Public functions again void glue_objc_setTaggedPointerSecret(uintptr_t secret)(d0) int glue_objc_registerTaggedPointerClass(Class _Nonnull class_)(a0) +bool glue_object_isTaggedPointer(id _Nullable object)(a0) Class _Nullable glue_object_getTaggedPointerClass(id _Nonnull object)(a0) uintptr_t glue_object_getTaggedPointerValue(id _Nonnull object)(a0) id _Nullable glue_objc_createTaggedPointer(int class_, uintptr_t value)(d0,d1) ==end Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -717,10 +717,16 @@ int objc_registerTaggedPointerClass(Class class) { return glue_objc_registerTaggedPointerClass(class); } + +bool +object_isTaggedPointer(id object) +{ + return glue_object_isTaggedPointer(object); +} Class object_getTaggedPointerClass(id object) { return glue_object_getTaggedPointerClass(object); Index: src/runtime/morphos-clib.h ================================================================== --- src/runtime/morphos-clib.h +++ src/runtime/morphos-clib.h @@ -85,8 +85,9 @@ void glue_objc_hashtable_delete(struct objc_hashtable *, const void *); void glue_objc_hashtable_free(struct objc_hashtable *); /* Public functions again */ void glue_objc_setTaggedPointerSecret(uintptr_t); int glue_objc_registerTaggedPointerClass(Class); +bool glue_object_isTaggedPointer(id); Class _Nullable glue_object_getTaggedPointerClass(id); uintptr_t glue_object_getTaggedPointerValue(id); id glue_objc_createTaggedPointer(int, uintptr_t); Index: src/runtime/morphos.fd ================================================================== --- src/runtime/morphos.fd +++ src/runtime/morphos.fd @@ -88,9 +88,10 @@ glue_objc_hashtable_delete(table,key)(sysv,r12base) glue_objc_hashtable_free(table)(sysv,r12base) * Public functions again glue_objc_setTaggedPointerSecret(secret)(sysv,r12base) glue_objc_registerTaggedPointerClass(class_)(sysv,r12base) +glue_object_isTaggedPointer(object)(sysv,r12base) glue_object_getTaggedPointerClass(object)(sysv,r12base) glue_object_getTaggedPointerValue(object)(sysv,r12base) glue_objc_createTaggedPointer(class_,value)(sysv,r12base) ##end Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -307,10 +307,11 @@ extern void objc_dtable_free(struct objc_dtable *_Nonnull); extern void objc_dtable_cleanup(void); extern void objc_init_static_instances(struct objc_symtab *_Nonnull); extern void objc_forget_pending_static_instances(void); extern void objc_zero_weak_references(id _Nonnull); +extern Class _Nullable object_getTaggedPointerClass(id _Nonnull); #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 Index: src/runtime/tagged-pointer.m ================================================================== --- src/runtime/tagged-pointer.m +++ src/runtime/tagged-pointer.m @@ -49,10 +49,18 @@ objc_global_mutex_unlock(); return i; } + +bool +object_isTaggedPointer(id object) +{ + uintptr_t pointer = (uintptr_t)object; + + return pointer & 1; +} Class object_getTaggedPointerClass(id object) { uintptr_t pointer = (uintptr_t)object ^ objc_tagged_pointer_secret; Index: tests/RuntimeTests.m ================================================================== --- tests/RuntimeTests.m +++ tests/RuntimeTests.m @@ -99,15 +99,15 @@ TEST(@"Tagged pointers", (cid1 = objc_registerTaggedPointerClass([OFString class])) != -1 && (cid2 = objc_registerTaggedPointerClass([OFNumber class])) != -1 && (object = objc_createTaggedPointer(cid2, (uintptr_t)value)) && - object_getTaggedPointerClass(object) == [OFNumber class] && + object_getClass(object) == [OFNumber class] && [object class] == [OFNumber class] && object_getTaggedPointerValue(object) == value && objc_createTaggedPointer(cid2, UINTPTR_MAX >> 4) != nil && objc_createTaggedPointer(cid2, (UINTPTR_MAX >> 4) + 1) == nil) #endif objc_autoreleasePoolPop(pool); } @end