1/* 2 * This module is used in the unittests for object identity. 3 */ 4#include "Python.h" 5#include "pyobjc-api.h" 6 7#import <Foundation/Foundation.h> 8 9@interface OC_TestIdentity : NSObject 10{ 11 NSObject* storedObject; 12 int isClassic; 13} 14 15-(NSObject*)storedObject; 16-(void)setStoredClassicObject:(NSObject*)object; 17-(void)setStoredObject:(NSObject*)object; 18-(void)dealloc; 19 20-(void)setStoredObjectToResultOf:(SEL)aSelector on:(NSObject*)object; 21-(void)setStoredObjectToInteger:(int)value; 22-(void)setStoredObjectToUnsignedInteger:(unsigned int)value; 23-(void)setStoredObjectToLongLong:(long long)value; 24-(void)setStoredObjectToUnsignedLongLong:(unsigned long long)value; 25-(void)setStoredObjectToDouble:(double)value; 26-(void)setStoredObjectToFloat:(float)value; 27 28-(int)isSameObjectAsStored:(NSObject*)value; 29-(void)setStoredObjectToAProtocol; 30-(void)setStoredObjectAnInstanceOf:(Class) cls; 31-(void)setStoredObjectAnInstanceOfClassic:(Class) cls; 32 33-(void)writeStoredObjectToFile:(NSString*)fname; 34 35@end 36 37@implementation OC_TestIdentity 38-(void)dealloc 39{ 40 if (isClassic) { 41 /* pass, we could call free but why bother? */ 42 } else { 43 [storedObject release]; 44 } 45 [super dealloc]; 46} 47 48-(NSObject*)storedObject 49{ 50 if (isClassic) { 51 return storedObject; 52 } else { 53 return [[storedObject retain] autorelease]; 54 } 55} 56 57-(void)setStoredObject:(NSObject*)object 58{ 59 if (!isClassic) { 60 [storedObject release]; 61 } 62 [object retain]; 63 storedObject = object; 64 isClassic = 0; 65} 66 67-(void)setStoredClassicObject:(NSObject*)object; 68{ 69 if (!isClassic) { 70 [storedObject release]; 71 } 72 storedObject = object; 73 isClassic = 1; 74} 75 76-(void)setStoredObjectToResultOf:(SEL)aSelector on:(NSObject*)object 77{ 78 [self setStoredObject: [object performSelector: aSelector]]; 79} 80 81-(void)setStoredObjectToInteger:(int)value 82{ 83 [self setStoredObject: [NSNumber numberWithInt: value]]; 84} 85 86-(void)setStoredObjectToUnsignedInteger:(unsigned int)value 87{ 88 [self setStoredObject: [NSNumber numberWithUnsignedInt: value]]; 89} 90 91-(void)setStoredObjectToLongLong:(long long)value 92{ 93 [self setStoredObject: [NSNumber numberWithLongLong: value]]; 94} 95 96-(void)setStoredObjectToUnsignedLongLong:(unsigned long long)value 97{ 98 [self setStoredObject: [NSNumber numberWithUnsignedLongLong: value]]; 99} 100 101-(void)setStoredObjectToDouble:(double)value 102{ 103 [self setStoredObject: [NSNumber numberWithDouble: value]]; 104} 105 106-(void)setStoredObjectToFloat:(float)value 107{ 108 [self setStoredObject: [NSNumber numberWithFloat: value]]; 109} 110 111-(int)isSameObjectAsStored:(NSObject*)value 112{ 113 return value == storedObject; 114} 115 116-(void)setStoredObjectToAProtocol 117{ 118 [self setStoredClassicObject: (NSObject*)@protocol(NSObject) ]; 119} 120 121-(void)setStoredObjectAnInstanceOf:(Class) cls 122{ 123 [self setStoredObject: [[cls alloc] init]]; 124} 125-(void)setStoredObjectAnInstanceOfClassic:(Class)cls 126{ 127 [self setStoredClassicObject:[cls new]]; 128} 129 130-(void)writeStoredObjectToFile:(NSString*)fname 131{ 132 [(NSArray*)storedObject writeToFile:fname atomically:YES]; 133} 134 135@end 136 137static PyMethodDef mod_methods[] = { 138 { 0, 0, 0, 0 } 139}; 140 141#if PY_VERSION_HEX >= 0x03000000 142 143static struct PyModuleDef mod_module = { 144 PyModuleDef_HEAD_INIT, 145 "identity", 146 NULL, 147 0, 148 mod_methods, 149 NULL, 150 NULL, 151 NULL, 152 NULL 153}; 154 155#define INITERROR() return NULL 156#define INITDONE() return m 157 158PyObject* PyInit_identity(void); 159 160PyObject* 161PyInit_identity(void) 162 163#else 164 165#define INITERROR() return 166#define INITDONE() return 167 168void initidentity(void); 169 170void 171initidentity(void) 172#endif 173{ 174 PyObject* m; 175 176#if PY_VERSION_HEX >= 0x03000000 177 m = PyModule_Create(&mod_module); 178#else 179 m = Py_InitModule4("identity", mod_methods, 180 NULL, NULL, PYTHON_API_VERSION); 181#endif 182 if (!m) { 183 INITERROR(); 184 } 185 186 if (PyObjC_ImportAPI(m) < 0) { 187 INITERROR(); 188 } 189 if (PyModule_AddObject(m, "OC_TestIdentity", 190 PyObjCClass_New([OC_TestIdentity class])) < 0) { 191 INITERROR(); 192 } 193 194 INITDONE(); 195} 196