annotate Doc/includes/capsulethunk.h @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents d0af22b65889
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72837
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
1 #ifndef __CAPSULETHUNK_H
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
2 #define __CAPSULETHUNK_H
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
3
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
4 #if ( (PY_VERSION_HEX < 0x02070000) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
5 || ((PY_VERSION_HEX >= 0x03000000) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
6 && (PY_VERSION_HEX < 0x03010000)) )
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
7
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
8 #define __PyCapsule_GetField(capsule, field, default_value) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
9 ( PyCapsule_CheckExact(capsule) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
10 ? (((PyCObject *)capsule)->field) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
11 : (default_value) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
12 ) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
13
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
14 #define __PyCapsule_SetField(capsule, field, value) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
15 ( PyCapsule_CheckExact(capsule) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
16 ? (((PyCObject *)capsule)->field = value), 1 \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
17 : 0 \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
18 ) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
19
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
20
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
21 #define PyCapsule_Type PyCObject_Type
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
22
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
23 #define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule))
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
24 #define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule))
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
25
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
26
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
27 #define PyCapsule_New(pointer, name, destructor) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
28 (PyCObject_FromVoidPtr(pointer, destructor))
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
29
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
30
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
31 #define PyCapsule_GetPointer(capsule, name) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
32 (PyCObject_AsVoidPtr(capsule))
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
33
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
34 /* Don't call PyCObject_SetPointer here, it fails if there's a destructor */
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
35 #define PyCapsule_SetPointer(capsule, pointer) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
36 __PyCapsule_SetField(capsule, cobject, pointer)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
37
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
38
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
39 #define PyCapsule_GetDestructor(capsule) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
40 __PyCapsule_GetField(capsule, destructor)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
41
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
42 #define PyCapsule_SetDestructor(capsule, dtor) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
43 __PyCapsule_SetField(capsule, destructor, dtor)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
44
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
45
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
46 /*
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
47 * Sorry, there's simply no place
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
48 * to store a Capsule "name" in a CObject.
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
49 */
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
50 #define PyCapsule_GetName(capsule) NULL
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
51
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
52 static int
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
53 PyCapsule_SetName(PyObject *capsule, const char *unused)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
54 {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
55 unused = unused;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
56 PyErr_SetString(PyExc_NotImplementedError,
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
57 "can't use PyCapsule_SetName with CObjects");
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
58 return 1;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
59 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
60
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
61
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
62
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
63 #define PyCapsule_GetContext(capsule) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
64 __PyCapsule_GetField(capsule, descr)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
65
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
66 #define PyCapsule_SetContext(capsule, context) \
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
67 __PyCapsule_SetField(capsule, descr, context)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
68
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
69
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
70 static void *
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
71 PyCapsule_Import(const char *name, int no_block)
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
72 {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
73 PyObject *object = NULL;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
74 void *return_value = NULL;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
75 char *trace;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
76 size_t name_length = (strlen(name) + 1) * sizeof(char);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
77 char *name_dup = (char *)PyMem_MALLOC(name_length);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
78
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
79 if (!name_dup) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
80 return NULL;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
81 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
82
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
83 memcpy(name_dup, name, name_length);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
84
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
85 trace = name_dup;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
86 while (trace) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
87 char *dot = strchr(trace, '.');
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
88 if (dot) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
89 *dot++ = '\0';
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
90 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
91
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
92 if (object == NULL) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
93 if (no_block) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
94 object = PyImport_ImportModuleNoBlock(trace);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
95 } else {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
96 object = PyImport_ImportModule(trace);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
97 if (!object) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
98 PyErr_Format(PyExc_ImportError,
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
99 "PyCapsule_Import could not "
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
100 "import module \"%s\"", trace);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
101 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
102 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
103 } else {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
104 PyObject *object2 = PyObject_GetAttrString(object, trace);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
105 Py_DECREF(object);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
106 object = object2;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
107 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
108 if (!object) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
109 goto EXIT;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
110 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
111
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
112 trace = dot;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
113 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
114
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
115 if (PyCObject_Check(object)) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
116 PyCObject *cobject = (PyCObject *)object;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
117 return_value = cobject->cobject;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
118 } else {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
119 PyErr_Format(PyExc_AttributeError,
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
120 "PyCapsule_Import \"%s\" is not valid",
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
121 name);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
122 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
123
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
124 EXIT:
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
125 Py_XDECREF(object);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
126 if (name_dup) {
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
127 PyMem_FREE(name_dup);
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
128 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
129 return return_value;
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
130 }
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
131
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
132 #endif /* #if PY_VERSION_HEX < 0x02070000 */
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
133
d0af22b65889 Issue #13053: Added section on migrating from CObject to Capsule
Larry Hastings <larry@hastings.org>
parents:
diff changeset
134 #endif /* __CAPSULETHUNK_H */