1#include "pyobjc.h" 2 3static NSMapTable* python_proxies = NULL; 4static NSMapTable* objc_proxies = NULL; 5 6int PyObjC_InitProxyRegistry(void) 7{ 8 python_proxies = NSCreateMapTable( 9 PyObjCUtil_PointerKeyCallBacks, 10 PyObjCUtil_PointerValueCallBacks, 11 0); 12 if (python_proxies == NULL) { 13 PyErr_SetString(PyExc_RuntimeError, 14 "Cannot create NSMapTable for python_proxies"); 15 return -1; 16 } 17 18 objc_proxies = NSCreateMapTable( 19 PyObjCUtil_PointerKeyCallBacks, 20 PyObjCUtil_PointerValueCallBacks, 21 0); 22 if (objc_proxies == NULL) { 23 PyErr_SetString(PyExc_RuntimeError, 24 "Cannot create NSMapTable for objc_proxies"); 25 return -1; 26 } 27 return 0; 28} 29 30int PyObjC_RegisterPythonProxy(id original, PyObject* proxy) 31{ 32 NSMapInsert(python_proxies, original, proxy); 33 return 0; 34} 35 36int PyObjC_RegisterObjCProxy(PyObject* original, id proxy) 37{ 38 NSMapInsert(objc_proxies, original, proxy); 39 return 0; 40} 41 42void PyObjC_UnregisterPythonProxy(id original, PyObject* proxy) 43{ 44 PyObject* v; 45 46 if (original == nil) return; 47 48 v = NSMapGet(python_proxies, original); 49 if (v == proxy) { 50 NSMapRemove(python_proxies, original); 51 } 52} 53 54void PyObjC_UnregisterObjCProxy(PyObject* original, id proxy) 55{ 56 id v; 57 58 if (original == NULL) return; 59 60 v = NSMapGet(objc_proxies, original); 61 if (v == proxy) { 62 NSMapRemove(objc_proxies, original); 63 } 64} 65 66PyObject* PyObjC_FindPythonProxy(id original) 67{ 68 PyObject* v; 69 70 if (original == nil) { 71 v = Py_None; 72 } else { 73 v = NSMapGet(python_proxies, original); 74 } 75 Py_XINCREF(v); 76 return v; 77} 78 79id PyObjC_FindObjCProxy(PyObject* original) 80{ 81 if (original == Py_None) { 82 return nil; 83 } else { 84 return NSMapGet(objc_proxies, original); 85 } 86} 87