taggedNSPointers.m 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // TEST_CFLAGS -framework Foundation
  2. #include "test.h"
  3. #include <objc/runtime.h>
  4. #import <Foundation/Foundation.h>
  5. #if OBJC_HAVE_TAGGED_POINTERS
  6. void testTaggedNumber()
  7. {
  8. NSNumber *taggedNS = [NSNumber numberWithInt: 1234];
  9. CFNumberRef taggedCF = (__bridge CFNumberRef)taggedNS;
  10. int result;
  11. testassert( CFGetTypeID(taggedCF) == CFNumberGetTypeID() );
  12. testassert(_objc_getClassForTag(OBJC_TAG_NSNumber) == [taggedNS class]);
  13. CFNumberGetValue(taggedCF, kCFNumberIntType, &result);
  14. testassert(result == 1234);
  15. testassert(_objc_isTaggedPointer(taggedCF));
  16. testassert(_objc_getTaggedPointerTag(taggedCF) == OBJC_TAG_NSNumber);
  17. testassert(_objc_makeTaggedPointer(_objc_getTaggedPointerTag(taggedCF), _objc_getTaggedPointerValue(taggedCF)) == taggedCF);
  18. // do some generic object-y things to the taggedPointer instance
  19. CFRetain(taggedCF);
  20. CFRelease(taggedCF);
  21. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  22. [dict setObject: taggedNS forKey: @"fred"];
  23. testassert(taggedNS == [dict objectForKey: @"fred"]);
  24. [dict setObject: @"bob" forKey: taggedNS];
  25. testassert([@"bob" isEqualToString: [dict objectForKey: taggedNS]]);
  26. NSNumber *iM88 = [NSNumber numberWithInt:-88];
  27. NSNumber *i12346 = [NSNumber numberWithInt: 12346];
  28. NSNumber *i12347 = [NSNumber numberWithInt: 12347];
  29. NSArray *anArray = [NSArray arrayWithObjects: iM88, i12346, i12347, nil];
  30. testassert([anArray count] == 3);
  31. testassert([anArray indexOfObject: i12346] == 1);
  32. NSSet *aSet = [NSSet setWithObjects: iM88, i12346, i12347, nil];
  33. testassert([aSet count] == 3);
  34. testassert([aSet containsObject: i12346]);
  35. [taggedNS performSelector: @selector(intValue)];
  36. testassert(![taggedNS isProxy]);
  37. testassert([taggedNS isKindOfClass: [NSNumber class]]);
  38. testassert([taggedNS respondsToSelector: @selector(intValue)]);
  39. (void)[taggedNS description];
  40. }
  41. int main()
  42. {
  43. PUSH_POOL {
  44. testTaggedNumber(); // should be tested by CF... our tests are wrong, wrong, wrong.
  45. } POP_POOL;
  46. succeed(__FILE__);
  47. }
  48. // OBJC_HAVE_TAGGED_POINTERS
  49. #else
  50. // not OBJC_HAVE_TAGGED_POINTERS
  51. // Tagged pointers not supported. Crash if an NSNumber actually
  52. // is a tagged pointer (which means this test is out of date).
  53. int main()
  54. {
  55. PUSH_POOL {
  56. testassert(*(void **)(__bridge void *)[NSNumber numberWithInt:1234]);
  57. } POP_POOL;
  58. succeed(__FILE__);
  59. }
  60. #endif