@@ -57,7 +57,7 @@ struct _xidata {
57
57
// likely a registered "xidatafunc", is responsible for
58
58
// ensuring it owns the reference (i.e. incref).
59
59
PyObject * obj ;
60
- // interp is the ID of the owning interpreter of the original
60
+ // interpid is the ID of the owning interpreter of the original
61
61
// object. It corresponds to the active interpreter when
62
62
// _PyObject_GetXIData() was called. This should only
63
63
// be set by the cross-interpreter machinery.
@@ -93,37 +93,6 @@ PyAPI_FUNC(void) _PyXIData_Free(_PyXIData_t *data);
93
93
// Users should not need getters for "new_object" or "free".
94
94
95
95
96
- /* getting cross-interpreter data */
97
-
98
- typedef int (* xidatafunc )(PyThreadState * tstate , PyObject * , _PyXIData_t * );
99
-
100
- PyAPI_FUNC (PyObject * ) _PyXIData_GetNotShareableErrorType (PyThreadState * );
101
- PyAPI_FUNC (void ) _PyXIData_SetNotShareableError (PyThreadState * , const char * );
102
- PyAPI_FUNC (void ) _PyXIData_FormatNotShareableError (
103
- PyThreadState * ,
104
- const char * ,
105
- ...);
106
-
107
- PyAPI_FUNC (xidatafunc ) _PyXIData_Lookup (
108
- PyThreadState * ,
109
- PyObject * );
110
- PyAPI_FUNC (int ) _PyObject_CheckXIData (
111
- PyThreadState * ,
112
- PyObject * );
113
-
114
- PyAPI_FUNC (int ) _PyObject_GetXIData (
115
- PyThreadState * ,
116
- PyObject * ,
117
- _PyXIData_t * );
118
-
119
-
120
- /* using cross-interpreter data */
121
-
122
- PyAPI_FUNC (PyObject * ) _PyXIData_NewObject (_PyXIData_t * );
123
- PyAPI_FUNC (int ) _PyXIData_Release (_PyXIData_t * );
124
- PyAPI_FUNC (int ) _PyXIData_ReleaseAndRawFree (_PyXIData_t * );
125
-
126
-
127
96
/* defining cross-interpreter data */
128
97
129
98
PyAPI_FUNC (void ) _PyXIData_Init (
@@ -134,7 +103,7 @@ PyAPI_FUNC(int) _PyXIData_InitWithSize(
134
103
_PyXIData_t * ,
135
104
PyInterpreterState * interp , const size_t , PyObject * ,
136
105
xid_newobjfunc );
137
- PyAPI_FUNC (void ) _PyXIData_Clear ( PyInterpreterState * , _PyXIData_t * );
106
+ PyAPI_FUNC (void ) _PyXIData_Clear (PyInterpreterState * , _PyXIData_t * );
138
107
139
108
// Normally the Init* functions are sufficient. The only time
140
109
// additional initialization might be needed is to set the "free" func,
@@ -143,6 +112,8 @@ PyAPI_FUNC(void) _PyXIData_Clear( PyInterpreterState *, _PyXIData_t *);
143
112
do { \
144
113
(DATA)->free = (FUNC); \
145
114
} while (0)
115
+ #define _PyXIData_CHECK_FREE (DATA , FUNC ) \
116
+ ((DATA)->free == (FUNC))
146
117
// Additionally, some shareable types are essentially light wrappers
147
118
// around other shareable types. The xidatafunc of the wrapper
148
119
// can often be implemented by calling the wrapped object's
@@ -154,6 +125,65 @@ PyAPI_FUNC(void) _PyXIData_Clear( PyInterpreterState *, _PyXIData_t *);
154
125
do { \
155
126
(DATA)->new_object = (FUNC); \
156
127
} while (0)
128
+ #define _PyXIData_CHECK_NEW_OBJECT (DATA , FUNC ) \
129
+ ((DATA)->new_object == (FUNC))
130
+
131
+
132
+ /* getting cross-interpreter data */
133
+
134
+ typedef int (* xidatafunc )(PyThreadState * tstate , PyObject * , _PyXIData_t * );
135
+
136
+ PyAPI_FUNC (PyObject * ) _PyXIData_GetNotShareableErrorType (PyThreadState * );
137
+ PyAPI_FUNC (void ) _PyXIData_SetNotShareableError (PyThreadState * , const char * );
138
+ PyAPI_FUNC (void ) _PyXIData_FormatNotShareableError (
139
+ PyThreadState * ,
140
+ const char * ,
141
+ ...);
142
+
143
+ PyAPI_FUNC (xidatafunc ) _PyXIData_Lookup (
144
+ PyThreadState * ,
145
+ PyObject * );
146
+ PyAPI_FUNC (int ) _PyObject_CheckXIData (
147
+ PyThreadState * ,
148
+ PyObject * );
149
+
150
+ PyAPI_FUNC (int ) _PyObject_GetXIData (
151
+ PyThreadState * ,
152
+ PyObject * ,
153
+ _PyXIData_t * );
154
+
155
+ // _PyObject_GetXIData() for bytes
156
+ typedef struct {
157
+ const char * bytes ;
158
+ Py_ssize_t len ;
159
+ } _PyBytes_data_t ;
160
+ PyAPI_FUNC (int ) _PyBytes_GetData (PyObject * , _PyBytes_data_t * );
161
+ PyAPI_FUNC (PyObject * ) _PyBytes_FromData (_PyBytes_data_t * );
162
+ PyAPI_FUNC (PyObject * ) _PyBytes_FromXIData (_PyXIData_t * );
163
+ PyAPI_FUNC (int ) _PyBytes_GetXIData (
164
+ PyThreadState * ,
165
+ PyObject * ,
166
+ _PyXIData_t * );
167
+ PyAPI_FUNC (_PyBytes_data_t * ) _PyBytes_GetXIDataWrapped (
168
+ PyThreadState * ,
169
+ PyObject * ,
170
+ size_t ,
171
+ xid_newobjfunc ,
172
+ _PyXIData_t * );
173
+
174
+ // _PyObject_GetXIData() for marshal
175
+ PyAPI_FUNC (PyObject * ) _PyMarshal_ReadObjectFromXIData (_PyXIData_t * );
176
+ PyAPI_FUNC (int ) _PyMarshal_GetXIData (
177
+ PyThreadState * ,
178
+ PyObject * ,
179
+ _PyXIData_t * );
180
+
181
+
182
+ /* using cross-interpreter data */
183
+
184
+ PyAPI_FUNC (PyObject * ) _PyXIData_NewObject (_PyXIData_t * );
185
+ PyAPI_FUNC (int ) _PyXIData_Release (_PyXIData_t * );
186
+ PyAPI_FUNC (int ) _PyXIData_ReleaseAndRawFree (_PyXIData_t * );
157
187
158
188
159
189
/* cross-interpreter data registry */
0 commit comments