1#include <Python.h>
2#include "pyobjc-api.h"
3
4#import <Foundation/Foundation.h>
5
6@interface OCTestBlock : NSObject {}
7
8#if (PyObjC_BUILD_RELEASE >= 1006) && (__GNUC__ >= 4 && __GNUC_MINOR__ >= 2)
9
10-(int(^)(void))getIntBlock;
11-(double(^)(double,double))getFloatBlock;
12-(void)callIntBlock:(void(^)(int))block withValue:(int)value;
13-(double)callDoubleBlock:(double(^)(double, double))block withValue:(double)v1 andValue:(double)v2;
14#endif
15
16@end
17
18@implementation OCTestBlock
19
20#if PyObjC_BUILD_RELEASE >= 1006 && (__GNUC__ >= 4 && __GNUC_MINOR__ >= 2)
21
22-(int(^)(void))getIntBlock
23{
24	return [[^{ return 42; } copy] autorelease];
25}
26
27-(double(^)(double,double))getFloatBlock
28{
29	return [[^(double a, double b) { return a + b; } copy] autorelease];
30}
31
32-(void)callIntBlock:(void(^)(int))block withValue:(int)value
33{
34	block(value);
35}
36
37-(double)callDoubleBlock: (double(^)(double, double))block withValue:(double)v1 andValue:(double)v2
38{
39	return block(v1, v2);
40}
41#endif
42
43@end
44
45
46static PyMethodDef mod_methods[] = {
47	        { 0, 0, 0, 0 }
48};
49
50#if PY_VERSION_HEX >= 0x03000000
51
52static struct PyModuleDef mod_module = {
53	PyModuleDef_HEAD_INIT,
54	"block",
55	NULL,
56	0,
57	mod_methods,
58	NULL,
59	NULL,
60	NULL,
61	NULL
62};
63
64#define INITERROR() return NULL
65#define INITDONE() return m
66
67PyObject* PyInit_block(void);
68
69PyObject*
70PyInit_block(void)
71
72#else
73
74#define INITERROR() return
75#define INITDONE() return
76
77void initblock(void);
78
79void
80initblock(void)
81#endif
82{
83	PyObject* m;
84
85#if PY_VERSION_HEX >= 0x03000000
86	m = PyModule_Create(&mod_module);
87#else
88	m = Py_InitModule4("block", mod_methods,
89		NULL, NULL, PYTHON_API_VERSION);
90#endif
91	if (!m) {
92		INITERROR();
93	}
94
95	if (PyObjC_ImportAPI(m) < 0) {
96		INITERROR();
97	}
98
99	if (PyModule_AddObject(m, "OCTestBlock",
100	    PyObjCClass_New([OCTestBlock class])) < 0) {
101		INITERROR();
102	}
103
104	INITDONE();
105}
106