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