@@ -22,10 +22,17 @@ #define TAGGED_POINTER_BITS 4 #define NUM_TAGGED_POINTER_CLASSES (1 << (TAGGED_POINTER_BITS - 1)) Class objc_tagged_pointer_classes[NUM_TAGGED_POINTER_CLASSES]; static int taggedPointerClassesCount; +uintptr_t objc_tagged_pointer_secret; + +void +objc_setTaggedPointerSecret(uintptr_t secret) +{ + objc_tagged_pointer_secret = secret & ~(uintptr_t)1; +} int objc_registerTaggedPointerClass(Class class) { int i; @@ -46,11 +53,11 @@ } Class object_getTaggedPointerClass(id object) { - uintptr_t pointer = (uintptr_t)object; + uintptr_t pointer = (uintptr_t)object ^ objc_tagged_pointer_secret; pointer &= (1 << TAGGED_POINTER_BITS) - 1; pointer >>= 1; if (pointer >= NUM_TAGGED_POINTER_CLASSES) @@ -60,11 +67,11 @@ } uintptr_t object_getTaggedPointerValue(id object) { - uintptr_t pointer = (uintptr_t)object; + uintptr_t pointer = (uintptr_t)object ^ objc_tagged_pointer_secret; pointer >>= TAGGED_POINTER_BITS; return pointer; } @@ -81,7 +88,7 @@ return nil; pointer = (class << 1) | 1; pointer |= (value << TAGGED_POINTER_BITS); - return (id)pointer; + return (id)(pointer ^ objc_tagged_pointer_secret); }