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