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