@@ -82,22 +82,6 @@ PyType_Spec cthunk_spec = {
82
82
83
83
/**************************************************************/
84
84
85
- static void
86
- PrintError (const char * msg , ...)
87
- {
88
- char buf [512 ];
89
- PyObject * f = PySys_GetObject ("stderr" );
90
- va_list marker ;
91
-
92
- va_start (marker , msg );
93
- PyOS_vsnprintf (buf , sizeof (buf ), msg , marker );
94
- va_end (marker );
95
- if (f != NULL && f != Py_None )
96
- PyFile_WriteString (buf , f );
97
- PyErr_Print ();
98
- }
99
-
100
-
101
85
#ifdef MS_WIN32
102
86
/*
103
87
* We must call AddRef() on non-NULL COM pointers we receive as arguments
@@ -109,22 +93,19 @@ PrintError(const char *msg, ...)
109
93
* after checking for PyObject_IsTrue(), but this would probably be somewhat
110
94
* slower.
111
95
*/
112
- static void
96
+ static int
113
97
TryAddRef (StgDictObject * dict , CDataObject * obj )
114
98
{
115
99
IUnknown * punk ;
116
100
int r = PyDict_Contains ((PyObject * )dict , & _Py_ID (_needs_com_addref_ ));
117
101
if (r <= 0 ) {
118
- if (r < 0 ) {
119
- PrintError ("getting _needs_com_addref_" );
120
- }
121
- return ;
102
+ return r ;
122
103
}
123
104
124
105
punk = * (IUnknown * * )obj -> b_ptr ;
125
106
if (punk )
126
107
punk -> lpVtbl -> AddRef (punk );
127
- return ;
108
+ return 0 ;
128
109
}
129
110
#endif
130
111
@@ -160,8 +141,7 @@ static void _CallPythonObject(void *mem,
160
141
if (dict && dict -> getfunc && !_ctypes_simple_instance (cnv )) {
161
142
PyObject * v = dict -> getfunc (* pArgs , dict -> size );
162
143
if (!v ) {
163
- PrintError ("create argument %zd:\n" , i );
164
- goto Done ;
144
+ goto Error ;
165
145
}
166
146
args [i ] = v ;
167
147
/* XXX XXX XX
@@ -173,33 +153,38 @@ static void _CallPythonObject(void *mem,
173
153
/* Hm, shouldn't we use PyCData_AtAddress() or something like that instead? */
174
154
CDataObject * obj = (CDataObject * )_PyObject_CallNoArgs (cnv );
175
155
if (!obj ) {
176
- PrintError ("create argument %zd:\n" , i );
177
- goto Done ;
156
+ goto Error ;
178
157
}
179
158
if (!CDataObject_Check (obj )) {
159
+ PyErr_Format (PyExc_TypeError ,
160
+ "%R returned unexpected result of type %T" , cnv , obj );
180
161
Py_DECREF (obj );
181
- PrintError ("unexpected result of create argument %zd:\n" , i );
182
- goto Done ;
162
+ goto Error ;
183
163
}
184
164
memcpy (obj -> b_ptr , * pArgs , dict -> size );
185
165
args [i ] = (PyObject * )obj ;
186
166
#ifdef MS_WIN32
187
- TryAddRef (dict , obj );
167
+ if (TryAddRef (dict , obj ) < 0 ) {
168
+ goto Error ;
169
+ }
188
170
#endif
189
171
} else {
190
- PyErr_SetString (PyExc_TypeError ,
191
- "cannot build parameter" );
192
- PrintError ("Parsing argument %zd\n" , i );
193
- goto Done ;
172
+ PyErr_Format (PyExc_TypeError ,
173
+ "cannot build parameter of type %R" , cnv );
174
+ goto Error ;
194
175
}
195
176
/* XXX error handling! */
196
177
pArgs ++ ;
197
178
}
198
179
199
180
if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR )) {
200
181
error_object = _ctypes_get_errobj (& space );
201
- if (error_object == NULL )
182
+ if (error_object == NULL ) {
183
+ _PyErr_WriteUnraisableMsg ("while setting error for "
184
+ "ctypes callback function" ,
185
+ callable );
202
186
goto Done ;
187
+ }
203
188
if (flags & FUNCFLAG_USE_ERRNO ) {
204
189
int temp = space [0 ];
205
190
space [0 ] = errno ;
@@ -284,6 +269,13 @@ static void _CallPythonObject(void *mem,
284
269
Py_DECREF (args [j ]);
285
270
}
286
271
PyGILState_Release (state );
272
+ return ;
273
+
274
+ Error :
275
+ _PyErr_WriteUnraisableMsg ("while creating argument for "
276
+ "ctypes callback function" ,
277
+ callable );
278
+ goto Done ;
287
279
}
288
280
289
281
static void closure_fcn (ffi_cif * cif ,
0 commit comments