1/* 2 * XXX: PyObjC_TestOutputInitializer is a class that can't be created 3 * from Python but ends up in some fun places like NSAttributedString 4 */ 5 6#include <Python.h> 7#include <pyobjc-api.h> 8 9#import <Foundation/Foundation.h> 10 11#ifndef GNU_RUNTIME 12#include <objc/objc-runtime.h> 13#endif 14 15@interface PyObjC_TestOutputInitializer: NSObject 16{ 17 int _priv; 18} 19 20-(instancetype)initWithBooleanOutput:(BOOL *)outBool; 21-(BOOL)isInitialized; 22@end 23 24@implementation PyObjC_TestOutputInitializer 25-(instancetype)initWithBooleanOutput:(BOOL *)outBool 26{ 27 self = [self init]; 28 *outBool = YES; 29 _priv = YES; 30 return self; 31} 32 33-(BOOL)isInitialized 34{ 35 return _priv; 36} 37@end 38 39/* Python glue */ 40static PyMethodDef mod_methods[] = { 41 { 0, 0, 0, 0 } 42}; 43 44#if PY_VERSION_HEX >= 0x03000000 45 46static struct PyModuleDef mod_module = { 47 PyModuleDef_HEAD_INIT, 48 "testoutputinitializer", 49 NULL, 50 0, 51 mod_methods, 52 NULL, 53 NULL, 54 NULL, 55 NULL 56}; 57 58#define INITERROR() return NULL 59#define INITDONE() return m 60 61PyObject* PyInit_testoutputinitializer(void); 62 63PyObject* 64PyInit_testoutputinitializer(void) 65 66#else 67 68#define INITERROR() return 69#define INITDONE() return 70 71void inittestoutputinitializer(void); 72 73void 74inittestoutputinitializer(void) 75#endif 76{ 77 PyObject* m; 78 79#if PY_VERSION_HEX >= 0x03000000 80 m = PyModule_Create(&mod_module); 81#else 82 m = Py_InitModule4("testoutputinitializer", mod_methods, 83 NULL, NULL, PYTHON_API_VERSION); 84#endif 85 if (!m) { 86 INITERROR(); 87 } 88 89 if (PyObjC_ImportAPI(m) < 0) { 90 INITERROR(); 91 } 92 93 if (PyModule_AddObject(m, "PyObjC_TestOutputInitializer", 94 PyObjCClass_New([PyObjC_TestOutputInitializer class])) < 0) { 95 INITERROR(); 96 } 97 INITDONE(); 98} 99