Overview
Comment: | runtime: Add helper functions for tagged pointers |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | tagged-pointers |
Files: | files | file ages | folders |
SHA3-256: |
a964d3dcb4638dcd21b834b0fbeda0d8 |
User & Date: | js on 2020-06-29 19:42:00 |
Other Links: | branch diff | manifest | tags |
Context
2020-06-29
| ||
20:30 | Add support for tagged pointers in object_getClass check-in: 8707dd73c4 user: js tags: tagged-pointers | |
19:42 | runtime: Add helper functions for tagged pointers check-in: a964d3dcb4 user: js tags: tagged-pointers | |
2020-06-28
| ||
15:39 | Remove OF_DIRECT(_MEMBERS) where it was too much check-in: 812a46b8f6 user: js tags: trunk | |
Changes
Modified src/runtime/Makefile from [19d76e27b3] to [578f05e231].
︙ | ︙ | |||
26 27 28 29 30 31 32 33 34 35 36 37 38 39 | misc.m \ property.m \ protocol.m \ selector.m \ sparsearray.m \ static-instances.m \ synchronized.m \ ${USE_SRCS_THREADS} SRCS_THREADS = threading.m \ ../mutex.m \ ../once.m \ ../tlskey.m INCLUDES = ObjFWRT.h includesubdir = ObjFWRT | > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | misc.m \ property.m \ protocol.m \ selector.m \ sparsearray.m \ static-instances.m \ synchronized.m \ tagged-pointer.m \ ${USE_SRCS_THREADS} SRCS_THREADS = threading.m \ ../mutex.m \ ../once.m \ ../tlskey.m INCLUDES = ObjFWRT.h includesubdir = ObjFWRT |
︙ | ︙ |
Modified src/runtime/ObjFWRT.h from [439a147585] to [419dceb932].
︙ | ︙ | |||
240 241 242 243 244 245 246 247 248 249 250 251 252 253 | objc_enumeration_mutation_handler_t _Nullable handler); extern id _Nullable objc_constructInstance(Class _Nullable class_, void *_Nullable bytes); extern void *_Nullable objc_destructInstance(id _Nullable object); extern void *_Null_unspecified objc_autoreleasePoolPush(void); extern void objc_autoreleasePoolPop(void *_Null_unspecified pool); extern id _Nullable _objc_rootAutorelease(id _Nullable object); /* * 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. */ | > > > > > | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | objc_enumeration_mutation_handler_t _Nullable handler); extern id _Nullable objc_constructInstance(Class _Nullable class_, void *_Nullable bytes); extern void *_Nullable objc_destructInstance(id _Nullable object); extern void *_Null_unspecified objc_autoreleasePoolPush(void); extern void objc_autoreleasePoolPop(void *_Null_unspecified pool); extern id _Nullable _objc_rootAutorelease(id _Nullable object); extern int_fast8_t objc_registerTaggedPointerClass(Class _Nonnull class); extern Class _Nullable object_getTaggedPointerClass(id _Nonnull object); extern uintptr_t object_getTaggedPointerValue(id _Nonnull object); extern id _Nullable objc_createTaggedPointer(uint_fast8_t class, uintptr_t value); /* * 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. */ |
︙ | ︙ |
Modified src/runtime/amiga-glue.m from [5dde941d59] to [bd99617da7].
︙ | ︙ | |||
795 796 797 798 799 800 801 | void __saveds glue_objc_hashtable_free PPC_PARAMS(struct objc_hashtable *table) { M68K_ARG(struct objc_hashtable *, table, a0) objc_hashtable_free(table); } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 | void __saveds glue_objc_hashtable_free PPC_PARAMS(struct objc_hashtable *table) { M68K_ARG(struct objc_hashtable *, table, a0) objc_hashtable_free(table); } int_fast8_t glue_objc_registerTaggedPointerClass PPC_PARAMS(Class class) { M68K_ARG(Class, class, a0) return objc_registerTaggedPointerClass(class); } Class glue_object_getTaggedPointerClass PPC_PARAMS(id object) { M68K_ARG(id, object, a0) return object_getTaggedPointerClass(object); } uintptr_t glue_object_getTaggedPointerValue PPC_PARAMS(id object) { M68K_ARG(id, object, a0) return object_getTaggedPointerValue(object); } id glue_objc_createTaggedPointer PPC_PARAMS(uint_fast8_t class, uintptr_t value) { M68K_ARG(uint_fast8_t, class, d0) M68K_ARG(uintptr_t, value, d1) return objc_createTaggedPointer(class, value); } |
Modified src/runtime/amiga-library.m from [3100a40497] to [ee22f330db].
︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 | extern void glue_objc_autoreleasePoolPop(void); extern id glue__objc_rootAutorelease(void); extern struct objc_hashtable *glue_objc_hashtable_new(void); extern void glue_objc_hashtable_set(void); extern void *glue_objc_hashtable_get(void); extern void glue_objc_hashtable_delete(void); extern void glue_objc_hashtable_free(void); #ifdef OF_MORPHOS const ULONG __abox__ = 1; #endif struct ExecBase *SysBase; struct objc_libc libc; FILE *stdout; | > > > > | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | extern void glue_objc_autoreleasePoolPop(void); extern id glue__objc_rootAutorelease(void); extern struct objc_hashtable *glue_objc_hashtable_new(void); extern void glue_objc_hashtable_set(void); extern void *glue_objc_hashtable_get(void); extern void glue_objc_hashtable_delete(void); extern void glue_objc_hashtable_free(void); extern int_fast8_t glue_objc_registerTaggedPointerClass(void); extern Class _Nullable glue_object_getTaggedPointerClass(void); extern uintptr_t glue_object_getTaggedPointerValue(void); extern id _Nullable glue_objc_createTaggedPointer(void); #ifdef OF_MORPHOS const ULONG __abox__ = 1; #endif struct ExecBase *SysBase; struct objc_libc libc; FILE *stdout; |
︙ | ︙ | |||
669 670 671 672 673 674 675 676 677 678 679 680 681 682 | (CONST_APTR)glue_objc_autoreleasePoolPop, (CONST_APTR)glue__objc_rootAutorelease, (CONST_APTR)glue_objc_hashtable_new, (CONST_APTR)glue_objc_hashtable_set, (CONST_APTR)glue_objc_hashtable_get, (CONST_APTR)glue_objc_hashtable_delete, (CONST_APTR)glue_objc_hashtable_free, (CONST_APTR)-1, #ifdef OF_MORPHOS (CONST_APTR)FUNCARRAY_END #endif }; #pragma GCC diagnostic pop | > > > > | 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 | (CONST_APTR)glue_objc_autoreleasePoolPop, (CONST_APTR)glue__objc_rootAutorelease, (CONST_APTR)glue_objc_hashtable_new, (CONST_APTR)glue_objc_hashtable_set, (CONST_APTR)glue_objc_hashtable_get, (CONST_APTR)glue_objc_hashtable_delete, (CONST_APTR)glue_objc_hashtable_free, (CONST_APTR)glue_objc_registerTaggedPointerClass, (CONST_APTR)glue_object_getTaggedPointerClass, (CONST_APTR)glue_object_getTaggedPointerValue, (CONST_APTR)glue_objc_createTaggedPointer, (CONST_APTR)-1, #ifdef OF_MORPHOS (CONST_APTR)FUNCARRAY_END #endif }; #pragma GCC diagnostic pop |
︙ | ︙ |
Modified src/runtime/amigaos3.sfd from [c645261c7f] to [bce272de78].
︙ | ︙ | |||
85 86 87 88 89 90 91 92 | id _Nullable glue__objc_rootAutorelease(id _Nullable object)(a0) * The following functions are private! Don't use! struct objc_hashtable *_Nonnull glue_objc_hashtable_new(objc_hashtable_hash_func hash, objc_hashtable_equal_func equal, uint32_t size)(a0,a1,d0) void glue_objc_hashtable_set(struct objc_hashtable *_Nonnull table, const void *_Nonnull key, const void *_Nonnull object)(a0,a1,a2) void *_Nullable glue_objc_hashtable_get(struct objc_hashtable *_Nonnull table, const void *_Nonnull key)(a0,a1) 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) ==end | > > > > > | 85 86 87 88 89 90 91 92 93 94 95 96 97 | id _Nullable glue__objc_rootAutorelease(id _Nullable object)(a0) * The following functions are private! Don't use! struct objc_hashtable *_Nonnull glue_objc_hashtable_new(objc_hashtable_hash_func hash, objc_hashtable_equal_func equal, uint32_t size)(a0,a1,d0) void glue_objc_hashtable_set(struct objc_hashtable *_Nonnull table, const void *_Nonnull key, const void *_Nonnull object)(a0,a1,a2) void *_Nullable glue_objc_hashtable_get(struct objc_hashtable *_Nonnull table, const void *_Nonnull key)(a0,a1) 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 int_fast8_t glue_objc_registerTaggedPointerClass(Class _Nonnull class_)(a0) Class _Nullable glue_object_getTaggedPointerClass(id _Nonnull object)(a0) uintptr_t glue_object_getTaggedPointerValue(id _Nonnull object)(a0) id _Nullable glue_objc_createTaggedPointer(uint_fast8_t class_, uintptr_t value)(d0,d1) ==end |
Modified src/runtime/linklib/linklib.m from [141357802d] to [8bd799cb5a].
︙ | ︙ | |||
703 704 705 706 707 708 709 | } void objc_hashtable_free(struct objc_hashtable *table) { glue_objc_hashtable_free(table); } | > > > > > > | 703 704 705 706 707 708 709 710 711 712 713 714 715 | } void objc_hashtable_free(struct objc_hashtable *table) { glue_objc_hashtable_free(table); } extern int_fast8_t objc_registerTaggedPointerClass(Class _Nonnull class); extern Class _Nullable object_getTaggedPointerClass(id _Nonnull object); extern uintptr_t object_getTaggedPointerValue(id _Nonnull object); extern id _Nullable objc_createTaggedPointer(uint_fast8_t class, uintptr_t value); |
Modified src/runtime/morphos-clib.h from [cfb2b6af7e] to [5d4187d2f7].
︙ | ︙ | |||
75 76 77 78 79 80 81 | const char *glue_property_getName(objc_property_t); char *glue_property_copyAttributeValue(objc_property_t, const char *); void *glue_objc_destructInstance(id); void *glue_objc_autoreleasePoolPush(void); void glue_objc_autoreleasePoolPop(void *); id glue__objc_rootAutorelease(id); /* The following functions are private! Don't use! */ | | | | | | > > > > > | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | const char *glue_property_getName(objc_property_t); char *glue_property_copyAttributeValue(objc_property_t, const char *); void *glue_objc_destructInstance(id); void *glue_objc_autoreleasePoolPush(void); void glue_objc_autoreleasePoolPop(void *); id glue__objc_rootAutorelease(id); /* The following functions are private! Don't use! */ struct objc_hashtable *glue_objc_hashtable_new(objc_hashtable_hash_func, objc_hashtable_equal_func, uint32_t); void glue_objc_hashtable_set(struct objc_hashtable *, const void *, const void *); void *glue_objc_hashtable_get(struct objc_hashtable *, const void *); void glue_objc_hashtable_delete(struct objc_hashtable *, const void *); void glue_objc_hashtable_free(struct objc_hashtable *); /* Public functions again */ int_fast8_t glue_objc_registerTaggedPointerClass(Class); Class _Nullable glue_object_getTaggedPointerClass(id); uintptr_t glue_object_getTaggedPointerValue(id); id glue_objc_createTaggedPointer(uint_fast8_t, uintptr_t); |
Modified src/runtime/morphos.fd from [f7d065769a] to [705f1d62db].
︙ | ︙ | |||
83 84 85 86 87 88 89 90 | glue__objc_rootAutorelease(object)(sysv,r12base) * The following functions are private! Don't use! glue_objc_hashtable_new(hash,equal,size)(sysv,r12base) glue_objc_hashtable_set(table,key,object)(sysv,r12base) glue_objc_hashtable_get(table,key)(sysv,r12base) glue_objc_hashtable_delete(table,key)(sysv,r12base) glue_objc_hashtable_free(table)(sysv,r12base) ##end | > > > > > | 83 84 85 86 87 88 89 90 91 92 93 94 95 | glue__objc_rootAutorelease(object)(sysv,r12base) * The following functions are private! Don't use! glue_objc_hashtable_new(hash,equal,size)(sysv,r12base) glue_objc_hashtable_set(table,key,object)(sysv,r12base) glue_objc_hashtable_get(table,key)(sysv,r12base) glue_objc_hashtable_delete(table,key)(sysv,r12base) glue_objc_hashtable_free(table)(sysv,r12base) * Public functions again glue_objc_registerTaggedPointerClass(class_)(sysv,r12base) glue_object_getTaggedPointerClass(object)(sysv,r12base) glue_object_getTaggedPointerValue(object)(sysv,r12base) glue_objc_createTaggedPointer(class_,value)(sysv,r12base) ##end |
Added src/runtime/tagged-pointer.m version [a10440bd9d].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019, 2020 * Jonathan Schleifer <js@nil.im> * * 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. */ #import "ObjFWRT.h" #import "private.h" #define NUM_TAGGED_POINTER_CLASSES 0x7F static Class taggedPointerClasses[NUM_TAGGED_POINTER_CLASSES]; static uint_fast8_t taggedPointerClassesCount; int_fast8_t objc_registerTaggedPointerClass(Class class) { uint_fast8_t i; objc_global_mutex_lock(); if (taggedPointerClassesCount == NUM_TAGGED_POINTER_CLASSES) { objc_global_mutex_unlock(); return -1; } i = taggedPointerClassesCount++; taggedPointerClasses[i] = class; objc_global_mutex_unlock(); return i; } Class object_getTaggedPointerClass(id object) { uintptr_t pointer = (uintptr_t)object; pointer &= 0x7E; pointer >>= 1; if (pointer >= NUM_TAGGED_POINTER_CLASSES) return Nil; return taggedPointerClasses[pointer]; } uintptr_t object_getTaggedPointerValue(id object) { uintptr_t pointer = (uintptr_t)object; pointer &= ~(uintptr_t)0xFF; pointer >>= 8; return pointer; } id objc_createTaggedPointer(uint_fast8_t class, uintptr_t value) { uintptr_t pointer; if (class >= NUM_TAGGED_POINTER_CLASSES) return nil; if (value > (UINTPTR_MAX >> 8)) return nil; pointer = (class << 1) | 1; pointer |= (value << 8); return (id)pointer; } |