/src/cpython/Python/errors.c
Line | Count | Source |
1 | | |
2 | | /* Error handling */ |
3 | | |
4 | | #include "Python.h" |
5 | | #include "pycore_audit.h" // _PySys_Audit() |
6 | | #include "pycore_call.h" // _PyObject_CallNoArgs() |
7 | | #include "pycore_fileutils.h" // _PyFile_Flush |
8 | | #include "pycore_initconfig.h" // _PyStatus_ERR() |
9 | | #include "pycore_pyerrors.h" // _PyErr_Format() |
10 | | #include "pycore_pystate.h" // _PyThreadState_GET() |
11 | | #include "pycore_runtime.h" // _Py_ID() |
12 | | #include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin() |
13 | | #include "pycore_traceback.h" // _PyTraceBack_FromFrame() |
14 | | #include "pycore_unicodeobject.h" // _PyUnicode_Equal() |
15 | | |
16 | | #ifdef MS_WINDOWS |
17 | | # include <windows.h> |
18 | | # include <winbase.h> |
19 | | # include <stdlib.h> // _sys_nerr |
20 | | #endif |
21 | | |
22 | | |
23 | | void |
24 | | _PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc) |
25 | 278M | { |
26 | 278M | PyObject *old_exc = tstate->current_exception; |
27 | 278M | tstate->current_exception = exc; |
28 | 278M | Py_XDECREF(old_exc); |
29 | 278M | } |
30 | | |
31 | | static PyObject* |
32 | | _PyErr_CreateException(PyObject *exception_type, PyObject *value) |
33 | 14.9M | { |
34 | 14.9M | PyObject *exc; |
35 | | |
36 | 14.9M | if (value == NULL || value == Py_None) { |
37 | 105k | exc = _PyObject_CallNoArgs(exception_type); |
38 | 105k | } |
39 | 14.8M | else if (PyTuple_Check(value)) { |
40 | 95.3k | exc = PyObject_Call(exception_type, value, NULL); |
41 | 95.3k | } |
42 | 14.7M | else { |
43 | 14.7M | exc = PyObject_CallOneArg(exception_type, value); |
44 | 14.7M | } |
45 | | |
46 | 14.9M | if (exc != NULL && !PyExceptionInstance_Check(exc)) { |
47 | 0 | PyErr_Format(PyExc_TypeError, |
48 | 0 | "calling %R should have returned an instance of " |
49 | 0 | "BaseException, not %s", |
50 | 0 | exception_type, Py_TYPE(exc)->tp_name); |
51 | 0 | Py_CLEAR(exc); |
52 | 0 | } |
53 | | |
54 | 14.9M | return exc; |
55 | 14.9M | } |
56 | | |
57 | | void |
58 | | _PyErr_Restore(PyThreadState *tstate, PyObject *type, PyObject *value, |
59 | | PyObject *traceback) |
60 | 90.5M | { |
61 | 90.5M | if (type == NULL) { |
62 | 47.8M | assert(value == NULL); |
63 | 47.8M | assert(traceback == NULL); |
64 | 47.8M | _PyErr_SetRaisedException(tstate, NULL); |
65 | 47.8M | return; |
66 | 47.8M | } |
67 | 90.5M | assert(PyExceptionClass_Check(type)); |
68 | 42.6M | if (value != NULL && type == (PyObject *)Py_TYPE(value)) { |
69 | | /* Already normalized */ |
70 | | #ifdef Py_DEBUG |
71 | | PyObject *tb = PyException_GetTraceback(value); |
72 | | assert(tb != Py_None); |
73 | | Py_XDECREF(tb); |
74 | | #endif |
75 | 42.6M | } |
76 | 0 | else { |
77 | 0 | PyObject *exc = _PyErr_CreateException(type, value); |
78 | 0 | Py_XDECREF(value); |
79 | 0 | if (exc == NULL) { |
80 | 0 | Py_DECREF(type); |
81 | 0 | Py_XDECREF(traceback); |
82 | 0 | return; |
83 | 0 | } |
84 | 0 | value = exc; |
85 | 0 | } |
86 | 42.6M | assert(PyExceptionInstance_Check(value)); |
87 | 42.6M | if (traceback != NULL) { |
88 | 50.1k | if (PyException_SetTraceback(value, traceback) < 0) { |
89 | 0 | Py_DECREF(traceback); |
90 | 0 | Py_DECREF(value); |
91 | 0 | Py_DECREF(type); |
92 | 0 | return; |
93 | 0 | } |
94 | 50.1k | Py_DECREF(traceback); |
95 | 50.1k | } |
96 | 42.6M | _PyErr_SetRaisedException(tstate, value); |
97 | 42.6M | Py_DECREF(type); |
98 | 42.6M | } |
99 | | |
100 | | void |
101 | | PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) |
102 | 134k | { |
103 | 134k | PyThreadState *tstate = _PyThreadState_GET(); |
104 | 134k | _PyErr_Restore(tstate, type, value, traceback); |
105 | 134k | } |
106 | | |
107 | | void |
108 | | PyErr_SetRaisedException(PyObject *exc) |
109 | 181M | { |
110 | 181M | PyThreadState *tstate = _PyThreadState_GET(); |
111 | 181M | _PyErr_SetRaisedException(tstate, exc); |
112 | 181M | } |
113 | | |
114 | | _PyErr_StackItem * |
115 | | _PyErr_GetTopmostException(PyThreadState *tstate) |
116 | 42.5M | { |
117 | 42.5M | _PyErr_StackItem *exc_info = tstate->exc_info; |
118 | 42.5M | assert(exc_info); |
119 | | |
120 | 90.5M | while (exc_info->exc_value == NULL && exc_info->previous_item != NULL) |
121 | 48.0M | { |
122 | 48.0M | exc_info = exc_info->previous_item; |
123 | 48.0M | } |
124 | 42.5M | assert(!Py_IsNone(exc_info->exc_value)); |
125 | 42.5M | return exc_info; |
126 | 42.5M | } |
127 | | |
128 | | static PyObject * |
129 | | get_normalization_failure_note(PyThreadState *tstate, PyObject *exception, PyObject *value) |
130 | 0 | { |
131 | 0 | PyObject *args = PyObject_Repr(value); |
132 | 0 | if (args == NULL) { |
133 | 0 | _PyErr_Clear(tstate); |
134 | 0 | args = PyUnicode_FromFormat("<unknown>"); |
135 | 0 | } |
136 | 0 | PyObject *note; |
137 | 0 | const char *tpname = ((PyTypeObject*)exception)->tp_name; |
138 | 0 | if (args == NULL) { |
139 | 0 | _PyErr_Clear(tstate); |
140 | 0 | note = PyUnicode_FromFormat("Normalization failed: type=%s", tpname); |
141 | 0 | } |
142 | 0 | else { |
143 | 0 | note = PyUnicode_FromFormat("Normalization failed: type=%s args=%S", |
144 | 0 | tpname, args); |
145 | 0 | Py_DECREF(args); |
146 | 0 | } |
147 | 0 | return note; |
148 | 0 | } |
149 | | |
150 | | void |
151 | | _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) |
152 | 42.5M | { |
153 | 42.5M | PyObject *exc_value; |
154 | 42.5M | PyObject *tb = NULL; |
155 | | |
156 | 42.5M | if (exception != NULL && |
157 | 42.5M | !PyExceptionClass_Check(exception)) { |
158 | 0 | _PyErr_Format(tstate, PyExc_SystemError, |
159 | 0 | "_PyErr_SetObject: " |
160 | 0 | "exception %R is not a BaseException subclass", |
161 | 0 | exception); |
162 | 0 | return; |
163 | 0 | } |
164 | | /* Normalize the exception */ |
165 | 42.5M | int is_subclass = 0; |
166 | 42.5M | if (value != NULL && PyExceptionInstance_Check(value)) { |
167 | 27.5M | is_subclass = PyObject_IsSubclass((PyObject *)Py_TYPE(value), exception); |
168 | 27.5M | if (is_subclass < 0) { |
169 | 0 | return; |
170 | 0 | } |
171 | 27.5M | } |
172 | 42.5M | Py_XINCREF(value); |
173 | 42.5M | if (!is_subclass) { |
174 | | /* We must normalize the value right now */ |
175 | | |
176 | | /* Issue #23571: functions must not be called with an |
177 | | exception set */ |
178 | 14.9M | _PyErr_Clear(tstate); |
179 | | |
180 | 14.9M | PyObject *fixed_value = _PyErr_CreateException(exception, value); |
181 | 14.9M | if (fixed_value == NULL) { |
182 | 0 | PyObject *exc = _PyErr_GetRaisedException(tstate); |
183 | 0 | assert(PyExceptionInstance_Check(exc)); |
184 | |
|
185 | 0 | PyObject *note = get_normalization_failure_note(tstate, exception, value); |
186 | 0 | Py_XDECREF(value); |
187 | 0 | if (note != NULL) { |
188 | | /* ignore errors in _PyException_AddNote - they will be overwritten below */ |
189 | 0 | _PyException_AddNote(exc, note); |
190 | 0 | Py_DECREF(note); |
191 | 0 | } |
192 | 0 | _PyErr_SetRaisedException(tstate, exc); |
193 | 0 | return; |
194 | 0 | } |
195 | 14.9M | Py_XSETREF(value, fixed_value); |
196 | 14.9M | } |
197 | | |
198 | 42.5M | exc_value = _PyErr_GetTopmostException(tstate)->exc_value; |
199 | 42.5M | if (exc_value != NULL && exc_value != Py_None) { |
200 | | /* Implicit exception chaining */ |
201 | 5.83M | Py_INCREF(exc_value); |
202 | | /* Avoid creating new reference cycles through the |
203 | | context chain, while taking care not to hang on |
204 | | pre-existing ones. |
205 | | This is O(chain length) but context chains are |
206 | | usually very short. Sensitive readers may try |
207 | | to inline the call to PyException_GetContext. */ |
208 | 5.83M | if (exc_value != value) { |
209 | 5.83M | PyObject *o = exc_value, *context; |
210 | 5.83M | PyObject *slow_o = o; /* Floyd's cycle detection algo */ |
211 | 5.83M | int slow_update_toggle = 0; |
212 | 6.65M | while ((context = PyException_GetContext(o))) { |
213 | 826k | Py_DECREF(context); |
214 | 826k | if (context == value) { |
215 | 0 | PyException_SetContext(o, NULL); |
216 | 0 | break; |
217 | 0 | } |
218 | 826k | o = context; |
219 | 826k | if (o == slow_o) { |
220 | | /* pre-existing cycle - all exceptions on the |
221 | | path were visited and checked. */ |
222 | 0 | break; |
223 | 0 | } |
224 | 826k | if (slow_update_toggle) { |
225 | 256k | slow_o = PyException_GetContext(slow_o); |
226 | 256k | Py_DECREF(slow_o); |
227 | 256k | } |
228 | 826k | slow_update_toggle = !slow_update_toggle; |
229 | 826k | } |
230 | 5.83M | PyException_SetContext(value, exc_value); |
231 | 5.83M | } |
232 | 4.57k | else { |
233 | 4.57k | Py_DECREF(exc_value); |
234 | 4.57k | } |
235 | 5.83M | } |
236 | 42.5M | assert(value != NULL); |
237 | 42.5M | if (PyExceptionInstance_Check(value)) |
238 | 42.5M | tb = PyException_GetTraceback(value); |
239 | 42.5M | _PyErr_Restore(tstate, Py_NewRef(Py_TYPE(value)), value, tb); |
240 | 42.5M | } |
241 | | |
242 | | void |
243 | | PyErr_SetObject(PyObject *exception, PyObject *value) |
244 | 4.88M | { |
245 | 4.88M | PyThreadState *tstate = _PyThreadState_GET(); |
246 | 4.88M | _PyErr_SetObject(tstate, exception, value); |
247 | 4.88M | } |
248 | | |
249 | | /* Set a key error with the specified argument. This function should be used to |
250 | | * raise a KeyError with an argument instead of PyErr_SetObject(PyExc_KeyError, |
251 | | * arg) which has a special behavior. PyErr_SetObject() unpacks arg if it's a |
252 | | * tuple, and it uses arg instead of creating a new exception if arg is an |
253 | | * exception. |
254 | | * |
255 | | * If an exception is already set, override the exception. */ |
256 | | void |
257 | | _PyErr_SetKeyError(PyObject *arg) |
258 | 3.54M | { |
259 | 3.54M | PyThreadState *tstate = _PyThreadState_GET(); |
260 | | |
261 | | // PyObject_CallOneArg() must not be called with an exception set, |
262 | | // otherwise _Py_CheckFunctionResult() can fail if the function returned |
263 | | // a result with an excception set. |
264 | 3.54M | _PyErr_Clear(tstate); |
265 | | |
266 | 3.54M | PyObject *exc = PyObject_CallOneArg(PyExc_KeyError, arg); |
267 | 3.54M | if (!exc) { |
268 | | /* caller will expect error to be set anyway */ |
269 | 0 | return; |
270 | 0 | } |
271 | | |
272 | 3.54M | _PyErr_SetObject(tstate, (PyObject*)Py_TYPE(exc), exc); |
273 | 3.54M | Py_DECREF(exc); |
274 | 3.54M | } |
275 | | |
276 | | void |
277 | | _PyErr_SetNone(PyThreadState *tstate, PyObject *exception) |
278 | 105k | { |
279 | 105k | _PyErr_SetObject(tstate, exception, (PyObject *)NULL); |
280 | 105k | } |
281 | | |
282 | | |
283 | | void |
284 | | PyErr_SetNone(PyObject *exception) |
285 | 105k | { |
286 | 105k | PyThreadState *tstate = _PyThreadState_GET(); |
287 | 105k | _PyErr_SetNone(tstate, exception); |
288 | 105k | } |
289 | | |
290 | | |
291 | | void |
292 | | _PyErr_SetString(PyThreadState *tstate, PyObject *exception, |
293 | | const char *string) |
294 | 474k | { |
295 | 474k | PyObject *value = PyUnicode_FromString(string); |
296 | 474k | if (value != NULL) { |
297 | 474k | _PyErr_SetObject(tstate, exception, value); |
298 | 474k | Py_DECREF(value); |
299 | 474k | } |
300 | 474k | } |
301 | | |
302 | | void |
303 | | PyErr_SetString(PyObject *exception, const char *string) |
304 | 474k | { |
305 | 474k | PyThreadState *tstate = _PyThreadState_GET(); |
306 | 474k | _PyErr_SetString(tstate, exception, string); |
307 | 474k | } |
308 | | |
309 | | void |
310 | | _PyErr_SetLocaleString(PyObject *exception, const char *string) |
311 | 0 | { |
312 | 0 | PyObject *value = PyUnicode_DecodeLocale(string, "surrogateescape"); |
313 | 0 | if (value != NULL) { |
314 | 0 | PyErr_SetObject(exception, value); |
315 | 0 | Py_DECREF(value); |
316 | 0 | } |
317 | 0 | } |
318 | | |
319 | | PyObject* _Py_HOT_FUNCTION |
320 | | PyErr_Occurred(void) |
321 | 392M | { |
322 | | /* The caller must hold a thread state. */ |
323 | 392M | _Py_AssertHoldsTstate(); |
324 | | |
325 | 392M | PyThreadState *tstate = _PyThreadState_GET(); |
326 | 392M | return _PyErr_Occurred(tstate); |
327 | 392M | } |
328 | | |
329 | | |
330 | | int |
331 | | PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) |
332 | 58.1M | { |
333 | 58.1M | if (err == NULL || exc == NULL) { |
334 | | /* maybe caused by "import exceptions" that failed early on */ |
335 | 12 | return 0; |
336 | 12 | } |
337 | 58.1M | if (PyTuple_Check(exc)) { |
338 | 472k | Py_ssize_t i, n; |
339 | 472k | n = PyTuple_Size(exc); |
340 | 510k | for (i = 0; i < n; i++) { |
341 | | /* Test recursively */ |
342 | 507k | if (PyErr_GivenExceptionMatches( |
343 | 507k | err, PyTuple_GET_ITEM(exc, i))) |
344 | 469k | { |
345 | 469k | return 1; |
346 | 469k | } |
347 | 507k | } |
348 | 3.15k | return 0; |
349 | 472k | } |
350 | | /* err might be an instance, so check its class. */ |
351 | 57.6M | if (PyExceptionInstance_Check(err)) |
352 | 34.8M | err = PyExceptionInstance_Class(err); |
353 | | |
354 | 57.6M | if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { |
355 | 57.6M | return PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc); |
356 | 57.6M | } |
357 | | |
358 | 0 | return err == exc; |
359 | 57.6M | } |
360 | | |
361 | | |
362 | | int |
363 | | _PyErr_ExceptionMatches(PyThreadState *tstate, PyObject *exc) |
364 | 22.7M | { |
365 | 22.7M | return PyErr_GivenExceptionMatches(_PyErr_Occurred(tstate), exc); |
366 | 22.7M | } |
367 | | |
368 | | |
369 | | int |
370 | | PyErr_ExceptionMatches(PyObject *exc) |
371 | 7.95M | { |
372 | 7.95M | PyThreadState *tstate = _PyThreadState_GET(); |
373 | 7.95M | return _PyErr_ExceptionMatches(tstate, exc); |
374 | 7.95M | } |
375 | | |
376 | | |
377 | | #ifndef Py_NORMALIZE_RECURSION_LIMIT |
378 | 0 | #define Py_NORMALIZE_RECURSION_LIMIT 32 |
379 | | #endif |
380 | | |
381 | | /* Used in many places to normalize a raised exception, including in |
382 | | eval_code2(), do_raise(), and PyErr_Print() |
383 | | |
384 | | XXX: should PyErr_NormalizeException() also call |
385 | | PyException_SetTraceback() with the resulting value and tb? |
386 | | */ |
387 | | void |
388 | | _PyErr_NormalizeException(PyThreadState *tstate, PyObject **exc, |
389 | | PyObject **val, PyObject **tb) |
390 | 0 | { |
391 | 0 | int recursion_depth = 0; |
392 | 0 | tstate->recursion_headroom++; |
393 | 0 | PyObject *type, *value, *initial_tb; |
394 | |
|
395 | 0 | restart: |
396 | 0 | type = *exc; |
397 | 0 | if (type == NULL) { |
398 | | /* There was no exception, so nothing to do. */ |
399 | 0 | tstate->recursion_headroom--; |
400 | 0 | return; |
401 | 0 | } |
402 | | |
403 | 0 | value = *val; |
404 | | /* If PyErr_SetNone() was used, the value will have been actually |
405 | | set to NULL. |
406 | | */ |
407 | 0 | if (!value) { |
408 | 0 | value = Py_NewRef(Py_None); |
409 | 0 | } |
410 | | |
411 | | /* Normalize the exception so that if the type is a class, the |
412 | | value will be an instance. |
413 | | */ |
414 | 0 | if (PyExceptionClass_Check(type)) { |
415 | 0 | PyObject *inclass = NULL; |
416 | 0 | int is_subclass = 0; |
417 | |
|
418 | 0 | if (PyExceptionInstance_Check(value)) { |
419 | 0 | inclass = PyExceptionInstance_Class(value); |
420 | 0 | is_subclass = PyObject_IsSubclass(inclass, type); |
421 | 0 | if (is_subclass < 0) { |
422 | 0 | goto error; |
423 | 0 | } |
424 | 0 | } |
425 | | |
426 | | /* If the value was not an instance, or is not an instance |
427 | | whose class is (or is derived from) type, then use the |
428 | | value as an argument to instantiation of the type |
429 | | class. |
430 | | */ |
431 | 0 | if (!is_subclass) { |
432 | 0 | PyObject *fixed_value = _PyErr_CreateException(type, value); |
433 | 0 | if (fixed_value == NULL) { |
434 | 0 | goto error; |
435 | 0 | } |
436 | 0 | Py_SETREF(value, fixed_value); |
437 | 0 | } |
438 | | /* If the class of the instance doesn't exactly match the |
439 | | class of the type, believe the instance. |
440 | | */ |
441 | 0 | else if (inclass != type) { |
442 | 0 | Py_SETREF(type, Py_NewRef(inclass)); |
443 | 0 | } |
444 | 0 | } |
445 | 0 | *exc = type; |
446 | 0 | *val = value; |
447 | 0 | tstate->recursion_headroom--; |
448 | 0 | return; |
449 | | |
450 | 0 | error: |
451 | 0 | Py_DECREF(type); |
452 | 0 | Py_DECREF(value); |
453 | 0 | recursion_depth++; |
454 | 0 | if (recursion_depth == Py_NORMALIZE_RECURSION_LIMIT) { |
455 | 0 | _PyErr_SetString(tstate, PyExc_RecursionError, |
456 | 0 | "maximum recursion depth exceeded " |
457 | 0 | "while normalizing an exception"); |
458 | 0 | } |
459 | | /* If the new exception doesn't set a traceback and the old |
460 | | exception had a traceback, use the old traceback for the |
461 | | new exception. It's better than nothing. |
462 | | */ |
463 | 0 | initial_tb = *tb; |
464 | 0 | _PyErr_Fetch(tstate, exc, val, tb); |
465 | 0 | assert(*exc != NULL); |
466 | 0 | if (initial_tb != NULL) { |
467 | 0 | if (*tb == NULL) |
468 | 0 | *tb = initial_tb; |
469 | 0 | else |
470 | 0 | Py_DECREF(initial_tb); |
471 | 0 | } |
472 | | /* Abort when Py_NORMALIZE_RECURSION_LIMIT has been exceeded, and the |
473 | | corresponding RecursionError could not be normalized, and the |
474 | | MemoryError raised when normalize this RecursionError could not be |
475 | | normalized. */ |
476 | 0 | if (recursion_depth >= Py_NORMALIZE_RECURSION_LIMIT + 2) { |
477 | 0 | if (PyErr_GivenExceptionMatches(*exc, PyExc_MemoryError)) { |
478 | 0 | Py_FatalError("Cannot recover from MemoryErrors " |
479 | 0 | "while normalizing exceptions."); |
480 | 0 | } |
481 | 0 | else { |
482 | 0 | Py_FatalError("Cannot recover from the recursive normalization " |
483 | 0 | "of an exception."); |
484 | 0 | } |
485 | 0 | } |
486 | 0 | goto restart; |
487 | 0 | } |
488 | | |
489 | | |
490 | | void |
491 | | PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) |
492 | 0 | { |
493 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
494 | 0 | _PyErr_NormalizeException(tstate, exc, val, tb); |
495 | 0 | } |
496 | | |
497 | | |
498 | | PyObject * |
499 | 212M | _PyErr_GetRaisedException(PyThreadState *tstate) { |
500 | 212M | PyObject *exc = tstate->current_exception; |
501 | 212M | tstate->current_exception = NULL; |
502 | 212M | return exc; |
503 | 212M | } |
504 | | |
505 | | PyObject * |
506 | | PyErr_GetRaisedException(void) |
507 | 181M | { |
508 | 181M | PyThreadState *tstate = _PyThreadState_GET(); |
509 | 181M | return _PyErr_GetRaisedException(tstate); |
510 | 181M | } |
511 | | |
512 | | void |
513 | | _PyErr_Fetch(PyThreadState *tstate, PyObject **p_type, PyObject **p_value, |
514 | | PyObject **p_traceback) |
515 | 91.0k | { |
516 | 91.0k | PyObject *exc = _PyErr_GetRaisedException(tstate); |
517 | 91.0k | *p_value = exc; |
518 | 91.0k | if (exc == NULL) { |
519 | 0 | *p_type = NULL; |
520 | 0 | *p_traceback = NULL; |
521 | 0 | } |
522 | 91.0k | else { |
523 | 91.0k | *p_type = Py_NewRef(Py_TYPE(exc)); |
524 | 91.0k | *p_traceback = PyException_GetTraceback(exc); |
525 | 91.0k | } |
526 | 91.0k | } |
527 | | |
528 | | |
529 | | void |
530 | | PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) |
531 | 91.0k | { |
532 | 91.0k | PyThreadState *tstate = _PyThreadState_GET(); |
533 | 91.0k | _PyErr_Fetch(tstate, p_type, p_value, p_traceback); |
534 | 91.0k | } |
535 | | |
536 | | |
537 | | void |
538 | | _PyErr_Clear(PyThreadState *tstate) |
539 | 47.8M | { |
540 | 47.8M | _PyErr_Restore(tstate, NULL, NULL, NULL); |
541 | 47.8M | } |
542 | | |
543 | | |
544 | | void |
545 | | PyErr_Clear(void) |
546 | 2.32M | { |
547 | 2.32M | PyThreadState *tstate = _PyThreadState_GET(); |
548 | 2.32M | _PyErr_Clear(tstate); |
549 | 2.32M | } |
550 | | |
551 | | static PyObject* |
552 | | get_exc_type(PyObject *exc_value) /* returns a strong ref */ |
553 | 0 | { |
554 | 0 | if (exc_value == NULL || exc_value == Py_None) { |
555 | 0 | return Py_None; |
556 | 0 | } |
557 | 0 | else { |
558 | 0 | assert(PyExceptionInstance_Check(exc_value)); |
559 | 0 | PyObject *type = PyExceptionInstance_Class(exc_value); |
560 | 0 | assert(type != NULL); |
561 | 0 | return Py_NewRef(type); |
562 | 0 | } |
563 | 0 | } |
564 | | |
565 | | static PyObject* |
566 | | get_exc_traceback(PyObject *exc_value) /* returns a strong ref */ |
567 | 0 | { |
568 | 0 | if (exc_value == NULL || exc_value == Py_None) { |
569 | 0 | return Py_None; |
570 | 0 | } |
571 | 0 | else { |
572 | 0 | assert(PyExceptionInstance_Check(exc_value)); |
573 | 0 | PyObject *tb = PyException_GetTraceback(exc_value); |
574 | 0 | return tb ? tb : Py_None; |
575 | 0 | } |
576 | 0 | } |
577 | | |
578 | | void |
579 | | _PyErr_GetExcInfo(PyThreadState *tstate, |
580 | | PyObject **p_type, PyObject **p_value, PyObject **p_traceback) |
581 | 0 | { |
582 | 0 | _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); |
583 | |
|
584 | 0 | *p_type = get_exc_type(exc_info->exc_value); |
585 | 0 | *p_value = Py_XNewRef(exc_info->exc_value); |
586 | 0 | *p_traceback = get_exc_traceback(exc_info->exc_value); |
587 | 0 | } |
588 | | |
589 | | PyObject* |
590 | | _PyErr_GetHandledException(PyThreadState *tstate) |
591 | 0 | { |
592 | 0 | _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); |
593 | 0 | PyObject *exc = exc_info->exc_value; |
594 | 0 | if (exc == NULL || exc == Py_None) { |
595 | 0 | return NULL; |
596 | 0 | } |
597 | 0 | return Py_NewRef(exc); |
598 | 0 | } |
599 | | |
600 | | PyObject* |
601 | | PyErr_GetHandledException(void) |
602 | 0 | { |
603 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
604 | 0 | return _PyErr_GetHandledException(tstate); |
605 | 0 | } |
606 | | |
607 | | void |
608 | | _PyErr_SetHandledException(PyThreadState *tstate, PyObject *exc) |
609 | 0 | { |
610 | 0 | Py_XSETREF(tstate->exc_info->exc_value, Py_XNewRef(exc == Py_None ? NULL : exc)); |
611 | 0 | } |
612 | | |
613 | | void |
614 | | PyErr_SetHandledException(PyObject *exc) |
615 | 0 | { |
616 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
617 | 0 | _PyErr_SetHandledException(tstate, exc); |
618 | 0 | } |
619 | | |
620 | | void |
621 | | PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) |
622 | 0 | { |
623 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
624 | 0 | _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); |
625 | 0 | } |
626 | | |
627 | | void |
628 | | PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback) |
629 | 0 | { |
630 | 0 | PyErr_SetHandledException(value); |
631 | 0 | Py_XDECREF(value); |
632 | | /* These args are no longer used, but we still need to steal a ref */ |
633 | 0 | Py_XDECREF(type); |
634 | 0 | Py_XDECREF(traceback); |
635 | 0 | } |
636 | | |
637 | | |
638 | | PyObject* |
639 | | _PyErr_StackItemToExcInfoTuple(_PyErr_StackItem *err_info) |
640 | 0 | { |
641 | 0 | PyObject *exc_value = err_info->exc_value; |
642 | |
|
643 | 0 | assert(exc_value == NULL || |
644 | 0 | exc_value == Py_None || |
645 | 0 | PyExceptionInstance_Check(exc_value)); |
646 | |
|
647 | 0 | PyObject *ret = PyTuple_New(3); |
648 | 0 | if (ret == NULL) { |
649 | 0 | return NULL; |
650 | 0 | } |
651 | | |
652 | 0 | PyObject *exc_type = get_exc_type(exc_value); |
653 | 0 | PyObject *exc_traceback = get_exc_traceback(exc_value); |
654 | |
|
655 | 0 | PyTuple_SET_ITEM(ret, 0, exc_type ? exc_type : Py_None); |
656 | 0 | PyTuple_SET_ITEM(ret, 1, exc_value ? Py_NewRef(exc_value) : Py_None); |
657 | 0 | PyTuple_SET_ITEM(ret, 2, exc_traceback ? exc_traceback : Py_None); |
658 | |
|
659 | 0 | return ret; |
660 | 0 | } |
661 | | |
662 | | |
663 | | /* Like PyErr_Restore(), but if an exception is already set, |
664 | | set the context associated with it. |
665 | | |
666 | | The caller is responsible for ensuring that this call won't create |
667 | | any cycles in the exception context chain. */ |
668 | | void |
669 | | _PyErr_ChainExceptions(PyObject *typ, PyObject *val, PyObject *tb) |
670 | 0 | { |
671 | 0 | if (typ == NULL) |
672 | 0 | return; |
673 | | |
674 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
675 | |
|
676 | 0 | if (!PyExceptionClass_Check(typ)) { |
677 | 0 | _PyErr_Format(tstate, PyExc_SystemError, |
678 | 0 | "_PyErr_ChainExceptions: " |
679 | 0 | "exception %R is not a BaseException subclass", |
680 | 0 | typ); |
681 | 0 | return; |
682 | 0 | } |
683 | | |
684 | 0 | if (_PyErr_Occurred(tstate)) { |
685 | 0 | _PyErr_NormalizeException(tstate, &typ, &val, &tb); |
686 | 0 | if (tb != NULL) { |
687 | 0 | PyException_SetTraceback(val, tb); |
688 | 0 | Py_DECREF(tb); |
689 | 0 | } |
690 | 0 | Py_DECREF(typ); |
691 | 0 | PyObject *exc2 = _PyErr_GetRaisedException(tstate); |
692 | 0 | PyException_SetContext(exc2, val); |
693 | 0 | _PyErr_SetRaisedException(tstate, exc2); |
694 | 0 | } |
695 | 0 | else { |
696 | 0 | _PyErr_Restore(tstate, typ, val, tb); |
697 | 0 | } |
698 | 0 | } |
699 | | |
700 | | /* Like PyErr_SetRaisedException(), but if an exception is already set, |
701 | | set the context associated with it. |
702 | | |
703 | | The caller is responsible for ensuring that this call won't create |
704 | | any cycles in the exception context chain. */ |
705 | | void |
706 | | _PyErr_ChainExceptions1Tstate(PyThreadState *tstate, PyObject *exc) |
707 | 81.1k | { |
708 | 81.1k | if (exc == NULL) { |
709 | 81.1k | return; |
710 | 81.1k | } |
711 | 0 | if (_PyErr_Occurred(tstate)) { |
712 | 0 | PyObject *exc2 = _PyErr_GetRaisedException(tstate); |
713 | 0 | PyException_SetContext(exc2, exc); |
714 | 0 | _PyErr_SetRaisedException(tstate, exc2); |
715 | 0 | } |
716 | 0 | else { |
717 | 0 | _PyErr_SetRaisedException(tstate, exc); |
718 | 0 | } |
719 | 0 | } |
720 | | |
721 | | void |
722 | | _PyErr_ChainExceptions1(PyObject *exc) |
723 | 81.1k | { |
724 | 81.1k | PyThreadState *tstate = _PyThreadState_GET(); |
725 | 81.1k | _PyErr_ChainExceptions1Tstate(tstate, exc); |
726 | 81.1k | } |
727 | | |
728 | | /* If the current thread is handling an exception (exc_info is ), set this |
729 | | exception as the context of the current raised exception. |
730 | | |
731 | | This function can only be called when _PyErr_Occurred() is true. |
732 | | Also, this function won't create any cycles in the exception context |
733 | | chain to the extent that _PyErr_SetObject ensures this. */ |
734 | | void |
735 | | _PyErr_ChainStackItem(void) |
736 | 45.5k | { |
737 | 45.5k | PyThreadState *tstate = _PyThreadState_GET(); |
738 | 45.5k | assert(_PyErr_Occurred(tstate)); |
739 | | |
740 | 45.5k | _PyErr_StackItem *exc_info = tstate->exc_info; |
741 | 45.5k | if (exc_info->exc_value == NULL || exc_info->exc_value == Py_None) { |
742 | 45.5k | return; |
743 | 45.5k | } |
744 | | |
745 | 0 | PyObject *exc = _PyErr_GetRaisedException(tstate); |
746 | | |
747 | | /* _PyErr_SetObject sets the context from PyThreadState. */ |
748 | 0 | _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(exc), exc); |
749 | 0 | Py_DECREF(exc); // since _PyErr_Occurred was true |
750 | 0 | } |
751 | | |
752 | | static PyObject * |
753 | | _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, |
754 | | const char *format, va_list vargs) |
755 | 0 | { |
756 | 0 | assert(_PyErr_Occurred(tstate)); |
757 | 0 | PyObject *exc = _PyErr_GetRaisedException(tstate); |
758 | 0 | assert(!_PyErr_Occurred(tstate)); |
759 | 0 | _PyErr_FormatV(tstate, exception, format, vargs); |
760 | 0 | PyObject *exc2 = _PyErr_GetRaisedException(tstate); |
761 | 0 | PyException_SetCause(exc2, Py_NewRef(exc)); |
762 | 0 | PyException_SetContext(exc2, Py_NewRef(exc)); |
763 | 0 | Py_DECREF(exc); |
764 | 0 | _PyErr_SetRaisedException(tstate, exc2); |
765 | 0 | return NULL; |
766 | 0 | } |
767 | | |
768 | | PyObject * |
769 | | _PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception, |
770 | | const char *format, ...) |
771 | 0 | { |
772 | 0 | va_list vargs; |
773 | 0 | va_start(vargs, format); |
774 | 0 | _PyErr_FormatVFromCause(tstate, exception, format, vargs); |
775 | 0 | va_end(vargs); |
776 | 0 | return NULL; |
777 | 0 | } |
778 | | |
779 | | PyObject * |
780 | | _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) |
781 | 0 | { |
782 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
783 | 0 | va_list vargs; |
784 | 0 | va_start(vargs, format); |
785 | 0 | _PyErr_FormatVFromCause(tstate, exception, format, vargs); |
786 | 0 | va_end(vargs); |
787 | 0 | return NULL; |
788 | 0 | } |
789 | | |
790 | | /* Convenience functions to set a type error exception and return 0 */ |
791 | | |
792 | | int |
793 | | PyErr_BadArgument(void) |
794 | 0 | { |
795 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
796 | 0 | _PyErr_SetString(tstate, PyExc_TypeError, |
797 | 0 | "bad argument type for built-in operation"); |
798 | 0 | return 0; |
799 | 0 | } |
800 | | |
801 | | PyObject * |
802 | | PyErr_NoMemory(void) |
803 | 0 | { |
804 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
805 | 0 | return _PyErr_NoMemory(tstate); |
806 | 0 | } |
807 | | |
808 | | PyObject * |
809 | | PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) |
810 | 405k | { |
811 | 405k | return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL); |
812 | 405k | } |
813 | | |
814 | | PyObject * |
815 | | PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2) |
816 | 406k | { |
817 | 406k | PyThreadState *tstate = _PyThreadState_GET(); |
818 | 406k | PyObject *message; |
819 | 406k | PyObject *v, *args; |
820 | 406k | int i = errno; |
821 | | #ifdef MS_WINDOWS |
822 | | WCHAR *s_buf = NULL; |
823 | | #endif /* Unix/Windows */ |
824 | | |
825 | 406k | #ifdef EINTR |
826 | 406k | if (i == EINTR && PyErr_CheckSignals()) |
827 | 0 | return NULL; |
828 | 406k | #endif |
829 | | |
830 | 406k | #ifndef MS_WINDOWS |
831 | 406k | if (i != 0) { |
832 | 406k | const char *s = strerror(i); |
833 | 406k | message = PyUnicode_DecodeLocale(s, "surrogateescape"); |
834 | 406k | } |
835 | 0 | else { |
836 | | /* Sometimes errno didn't get set */ |
837 | 0 | message = PyUnicode_FromString("Error"); |
838 | 0 | } |
839 | | #else |
840 | | if (i == 0) |
841 | | message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */ |
842 | | else |
843 | | { |
844 | | /* Note that the Win32 errors do not lineup with the |
845 | | errno error. So if the error is in the MSVC error |
846 | | table, we use it, otherwise we assume it really _is_ |
847 | | a Win32 error code |
848 | | */ |
849 | | if (i > 0 && i < _sys_nerr) { |
850 | | message = PyUnicode_FromString(_sys_errlist[i]); |
851 | | } |
852 | | else { |
853 | | int len = FormatMessageW( |
854 | | FORMAT_MESSAGE_ALLOCATE_BUFFER | |
855 | | FORMAT_MESSAGE_FROM_SYSTEM | |
856 | | FORMAT_MESSAGE_IGNORE_INSERTS, |
857 | | NULL, /* no message source */ |
858 | | i, |
859 | | MAKELANGID(LANG_NEUTRAL, |
860 | | SUBLANG_DEFAULT), |
861 | | /* Default language */ |
862 | | (LPWSTR) &s_buf, |
863 | | 0, /* size not used */ |
864 | | NULL); /* no args */ |
865 | | if (len==0) { |
866 | | /* Only ever seen this in out-of-mem |
867 | | situations */ |
868 | | s_buf = NULL; |
869 | | message = PyUnicode_FromFormat("Windows Error 0x%x", i); |
870 | | } else { |
871 | | /* remove trailing cr/lf and dots */ |
872 | | while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) |
873 | | s_buf[--len] = L'\0'; |
874 | | message = PyUnicode_FromWideChar(s_buf, len); |
875 | | } |
876 | | } |
877 | | } |
878 | | #endif /* Unix/Windows */ |
879 | | |
880 | 406k | if (message == NULL) |
881 | 0 | { |
882 | | #ifdef MS_WINDOWS |
883 | | LocalFree(s_buf); |
884 | | #endif |
885 | 0 | return NULL; |
886 | 0 | } |
887 | | |
888 | 406k | if (filenameObject != NULL) { |
889 | 405k | if (filenameObject2 != NULL) |
890 | 0 | args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2); |
891 | 405k | else |
892 | 405k | args = Py_BuildValue("(iOO)", i, message, filenameObject); |
893 | 405k | } else { |
894 | 180 | assert(filenameObject2 == NULL); |
895 | 180 | args = Py_BuildValue("(iO)", i, message); |
896 | 180 | } |
897 | 406k | Py_DECREF(message); |
898 | | |
899 | 406k | if (args != NULL) { |
900 | 406k | v = PyObject_Call(exc, args, NULL); |
901 | 406k | Py_DECREF(args); |
902 | 406k | if (v != NULL) { |
903 | 406k | _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); |
904 | 406k | Py_DECREF(v); |
905 | 406k | } |
906 | 406k | } |
907 | | #ifdef MS_WINDOWS |
908 | | LocalFree(s_buf); |
909 | | #endif |
910 | 406k | return NULL; |
911 | 406k | } |
912 | | |
913 | | PyObject * |
914 | | PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) |
915 | 0 | { |
916 | 0 | PyObject *name = NULL; |
917 | 0 | if (filename) { |
918 | 0 | int i = errno; |
919 | 0 | name = PyUnicode_DecodeFSDefault(filename); |
920 | 0 | if (name == NULL) { |
921 | 0 | return NULL; |
922 | 0 | } |
923 | 0 | errno = i; |
924 | 0 | } |
925 | 0 | PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL); |
926 | 0 | Py_XDECREF(name); |
927 | 0 | return result; |
928 | 0 | } |
929 | | |
930 | | PyObject * |
931 | | PyErr_SetFromErrno(PyObject *exc) |
932 | 180 | { |
933 | 180 | return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL); |
934 | 180 | } |
935 | | |
936 | | #ifdef MS_WINDOWS |
937 | | /* Windows specific error code handling */ |
938 | | PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( |
939 | | PyObject *exc, |
940 | | int ierr, |
941 | | PyObject *filenameObject) |
942 | | { |
943 | | return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr, |
944 | | filenameObject, NULL); |
945 | | } |
946 | | |
947 | | PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( |
948 | | PyObject *exc, |
949 | | int ierr, |
950 | | PyObject *filenameObject, |
951 | | PyObject *filenameObject2) |
952 | | { |
953 | | PyThreadState *tstate = _PyThreadState_GET(); |
954 | | int len; |
955 | | WCHAR *s_buf = NULL; /* Free via LocalFree */ |
956 | | PyObject *message; |
957 | | PyObject *args, *v; |
958 | | |
959 | | DWORD err = (DWORD)ierr; |
960 | | if (err==0) { |
961 | | err = GetLastError(); |
962 | | } |
963 | | |
964 | | len = FormatMessageW( |
965 | | /* Error API error */ |
966 | | FORMAT_MESSAGE_ALLOCATE_BUFFER | |
967 | | FORMAT_MESSAGE_FROM_SYSTEM | |
968 | | FORMAT_MESSAGE_IGNORE_INSERTS, |
969 | | NULL, /* no message source */ |
970 | | err, |
971 | | MAKELANGID(LANG_NEUTRAL, |
972 | | SUBLANG_DEFAULT), /* Default language */ |
973 | | (LPWSTR) &s_buf, |
974 | | 0, /* size not used */ |
975 | | NULL); /* no args */ |
976 | | if (len==0) { |
977 | | /* Only seen this in out of mem situations */ |
978 | | message = PyUnicode_FromFormat("Windows Error 0x%x", err); |
979 | | s_buf = NULL; |
980 | | } else { |
981 | | /* remove trailing cr/lf and dots */ |
982 | | while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) |
983 | | s_buf[--len] = L'\0'; |
984 | | message = PyUnicode_FromWideChar(s_buf, len); |
985 | | } |
986 | | |
987 | | if (message == NULL) |
988 | | { |
989 | | LocalFree(s_buf); |
990 | | return NULL; |
991 | | } |
992 | | |
993 | | if (filenameObject == NULL) { |
994 | | assert(filenameObject2 == NULL); |
995 | | filenameObject = filenameObject2 = Py_None; |
996 | | } |
997 | | else if (filenameObject2 == NULL) |
998 | | filenameObject2 = Py_None; |
999 | | /* This is the constructor signature for OSError. |
1000 | | The POSIX translation will be figured out by the constructor. */ |
1001 | | args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2); |
1002 | | Py_DECREF(message); |
1003 | | |
1004 | | if (args != NULL) { |
1005 | | v = PyObject_Call(exc, args, NULL); |
1006 | | Py_DECREF(args); |
1007 | | if (v != NULL) { |
1008 | | _PyErr_SetObject(tstate, (PyObject *) Py_TYPE(v), v); |
1009 | | Py_DECREF(v); |
1010 | | } |
1011 | | } |
1012 | | LocalFree(s_buf); |
1013 | | return NULL; |
1014 | | } |
1015 | | |
1016 | | PyObject *PyErr_SetExcFromWindowsErrWithFilename( |
1017 | | PyObject *exc, |
1018 | | int ierr, |
1019 | | const char *filename) |
1020 | | { |
1021 | | PyObject *name = NULL; |
1022 | | if (filename) { |
1023 | | if ((DWORD)ierr == 0) { |
1024 | | ierr = (int)GetLastError(); |
1025 | | } |
1026 | | name = PyUnicode_DecodeFSDefault(filename); |
1027 | | if (name == NULL) { |
1028 | | return NULL; |
1029 | | } |
1030 | | } |
1031 | | PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, |
1032 | | ierr, |
1033 | | name, |
1034 | | NULL); |
1035 | | Py_XDECREF(name); |
1036 | | return ret; |
1037 | | } |
1038 | | |
1039 | | PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) |
1040 | | { |
1041 | | return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); |
1042 | | } |
1043 | | |
1044 | | PyObject *PyErr_SetFromWindowsErr(int ierr) |
1045 | | { |
1046 | | return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError, |
1047 | | ierr, NULL); |
1048 | | } |
1049 | | |
1050 | | PyObject *PyErr_SetFromWindowsErrWithFilename( |
1051 | | int ierr, |
1052 | | const char *filename) |
1053 | | { |
1054 | | PyObject *name = NULL; |
1055 | | if (filename) { |
1056 | | if ((DWORD)ierr == 0) { |
1057 | | ierr = (int)GetLastError(); |
1058 | | } |
1059 | | name = PyUnicode_DecodeFSDefault(filename); |
1060 | | if (name == NULL) { |
1061 | | return NULL; |
1062 | | } |
1063 | | } |
1064 | | PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects( |
1065 | | PyExc_OSError, |
1066 | | ierr, name, NULL); |
1067 | | Py_XDECREF(name); |
1068 | | return result; |
1069 | | } |
1070 | | |
1071 | | #endif /* MS_WINDOWS */ |
1072 | | |
1073 | | static PyObject * |
1074 | | new_importerror( |
1075 | | PyThreadState *tstate, PyObject *exctype, PyObject *msg, |
1076 | | PyObject *name, PyObject *path, PyObject* from_name) |
1077 | 34 | { |
1078 | 34 | PyObject *exc = NULL; |
1079 | 34 | PyObject *kwargs = NULL; |
1080 | | |
1081 | 34 | int issubclass = PyObject_IsSubclass(exctype, PyExc_ImportError); |
1082 | 34 | if (issubclass < 0) { |
1083 | 0 | return NULL; |
1084 | 0 | } |
1085 | 34 | else if (!issubclass) { |
1086 | 0 | _PyErr_SetString(tstate, PyExc_TypeError, |
1087 | 0 | "expected a subclass of ImportError"); |
1088 | 0 | return NULL; |
1089 | 0 | } |
1090 | | |
1091 | 34 | if (msg == NULL) { |
1092 | 0 | _PyErr_SetString(tstate, PyExc_TypeError, |
1093 | 0 | "expected a message argument"); |
1094 | 0 | return NULL; |
1095 | 0 | } |
1096 | | |
1097 | 34 | if (name == NULL) { |
1098 | 0 | name = Py_None; |
1099 | 0 | } |
1100 | 34 | if (path == NULL) { |
1101 | 28 | path = Py_None; |
1102 | 28 | } |
1103 | 34 | if (from_name == NULL) { |
1104 | 4 | from_name = Py_None; |
1105 | 4 | } |
1106 | | |
1107 | 34 | kwargs = PyDict_New(); |
1108 | 34 | if (kwargs == NULL) { |
1109 | 0 | return NULL; |
1110 | 0 | } |
1111 | 34 | if (PyDict_SetItemString(kwargs, "name", name) < 0) { |
1112 | 0 | goto finally; |
1113 | 0 | } |
1114 | 34 | if (PyDict_SetItemString(kwargs, "path", path) < 0) { |
1115 | 0 | goto finally; |
1116 | 0 | } |
1117 | 34 | if (PyDict_SetItemString(kwargs, "name_from", from_name) < 0) { |
1118 | 0 | goto finally; |
1119 | 0 | } |
1120 | 34 | exc = PyObject_VectorcallDict(exctype, &msg, 1, kwargs); |
1121 | | |
1122 | 34 | finally: |
1123 | 34 | Py_DECREF(kwargs); |
1124 | 34 | return exc; |
1125 | 34 | } |
1126 | | |
1127 | | static PyObject * |
1128 | | _PyErr_SetImportErrorSubclassWithNameFrom( |
1129 | | PyObject *exception, PyObject *msg, |
1130 | | PyObject *name, PyObject *path, PyObject* from_name) |
1131 | 34 | { |
1132 | 34 | PyThreadState *tstate = _PyThreadState_GET(); |
1133 | 34 | PyObject *error = new_importerror( |
1134 | 34 | tstate, exception, msg, name, path, from_name); |
1135 | 34 | if (error != NULL) { |
1136 | 34 | _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); |
1137 | 34 | Py_DECREF(error); |
1138 | 34 | } |
1139 | 34 | return NULL; |
1140 | 34 | } |
1141 | | |
1142 | | |
1143 | | PyObject * |
1144 | | PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, |
1145 | | PyObject *name, PyObject *path) |
1146 | 4 | { |
1147 | 4 | return _PyErr_SetImportErrorSubclassWithNameFrom(exception, msg, name, path, NULL); |
1148 | 4 | } |
1149 | | |
1150 | | PyObject * |
1151 | | _PyErr_SetImportErrorWithNameFrom(PyObject *msg, PyObject *name, PyObject *path, PyObject* from_name) |
1152 | 30 | { |
1153 | 30 | return _PyErr_SetImportErrorSubclassWithNameFrom(PyExc_ImportError, msg, name, path, from_name); |
1154 | 30 | } |
1155 | | |
1156 | | PyObject * |
1157 | | PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) |
1158 | 4 | { |
1159 | 4 | return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path); |
1160 | 4 | } |
1161 | | |
1162 | | int |
1163 | | _PyErr_SetModuleNotFoundError(PyObject *name) |
1164 | 0 | { |
1165 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1166 | 0 | if (name == NULL) { |
1167 | 0 | _PyErr_SetString(tstate, PyExc_TypeError, "expected a name argument"); |
1168 | 0 | return -1; |
1169 | 0 | } |
1170 | 0 | PyObject *msg = PyUnicode_FromFormat("%S module not found", name); |
1171 | 0 | if (msg == NULL) { |
1172 | 0 | return -1; |
1173 | 0 | } |
1174 | 0 | PyObject *exctype = PyExc_ModuleNotFoundError; |
1175 | 0 | PyObject *exc = new_importerror(tstate, exctype, msg, name, NULL, NULL); |
1176 | 0 | Py_DECREF(msg); |
1177 | 0 | if (exc == NULL) { |
1178 | 0 | return -1; |
1179 | 0 | } |
1180 | 0 | _PyErr_SetObject(tstate, exctype, exc); |
1181 | 0 | Py_DECREF(exc); |
1182 | 0 | return 0; |
1183 | 0 | } |
1184 | | |
1185 | | void |
1186 | | _PyErr_BadInternalCall(const char *filename, int lineno) |
1187 | 0 | { |
1188 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1189 | 0 | _PyErr_Format(tstate, PyExc_SystemError, |
1190 | 0 | "%s:%d: bad argument to internal function", |
1191 | 0 | filename, lineno); |
1192 | 0 | } |
1193 | | |
1194 | | /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can |
1195 | | export the entry point for existing object code: */ |
1196 | | #undef PyErr_BadInternalCall |
1197 | | void |
1198 | | PyErr_BadInternalCall(void) |
1199 | 0 | { |
1200 | 0 | assert(0 && "bad argument to internal function"); |
1201 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1202 | 0 | _PyErr_SetString(tstate, PyExc_SystemError, |
1203 | 0 | "bad argument to internal function"); |
1204 | 0 | } |
1205 | | #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) |
1206 | | |
1207 | | |
1208 | | PyObject * |
1209 | | _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, |
1210 | | const char *format, va_list vargs) |
1211 | 12.1M | { |
1212 | 12.1M | PyObject* string; |
1213 | | |
1214 | | /* Issue #23571: PyUnicode_FromFormatV() must not be called with an |
1215 | | exception set, it calls arbitrary Python code like PyObject_Repr() */ |
1216 | 12.1M | _PyErr_Clear(tstate); |
1217 | | |
1218 | 12.1M | string = PyUnicode_FromFormatV(format, vargs); |
1219 | 12.1M | if (string != NULL) { |
1220 | 12.1M | _PyErr_SetObject(tstate, exception, string); |
1221 | 12.1M | Py_DECREF(string); |
1222 | 12.1M | } |
1223 | 12.1M | return NULL; |
1224 | 12.1M | } |
1225 | | |
1226 | | |
1227 | | PyObject * |
1228 | | PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) |
1229 | 0 | { |
1230 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1231 | 0 | return _PyErr_FormatV(tstate, exception, format, vargs); |
1232 | 0 | } |
1233 | | |
1234 | | |
1235 | | PyObject * |
1236 | | _PyErr_Format(PyThreadState *tstate, PyObject *exception, |
1237 | | const char *format, ...) |
1238 | 4.22M | { |
1239 | 4.22M | va_list vargs; |
1240 | 4.22M | va_start(vargs, format); |
1241 | 4.22M | _PyErr_FormatV(tstate, exception, format, vargs); |
1242 | 4.22M | va_end(vargs); |
1243 | 4.22M | return NULL; |
1244 | 4.22M | } |
1245 | | |
1246 | | |
1247 | | PyObject * |
1248 | | PyErr_Format(PyObject *exception, const char *format, ...) |
1249 | 7.96M | { |
1250 | 7.96M | PyThreadState *tstate = _PyThreadState_GET(); |
1251 | 7.96M | va_list vargs; |
1252 | 7.96M | va_start(vargs, format); |
1253 | 7.96M | _PyErr_FormatV(tstate, exception, format, vargs); |
1254 | 7.96M | va_end(vargs); |
1255 | 7.96M | return NULL; |
1256 | 7.96M | } |
1257 | | |
1258 | | |
1259 | | /* Adds a note to the current exception (if any) */ |
1260 | | void |
1261 | | _PyErr_FormatNote(const char *format, ...) |
1262 | 61.6k | { |
1263 | 61.6k | PyObject *exc = PyErr_GetRaisedException(); |
1264 | 61.6k | if (exc == NULL) { |
1265 | 0 | return; |
1266 | 0 | } |
1267 | 61.6k | va_list vargs; |
1268 | 61.6k | va_start(vargs, format); |
1269 | 61.6k | PyObject *note = PyUnicode_FromFormatV(format, vargs); |
1270 | 61.6k | va_end(vargs); |
1271 | 61.6k | if (note == NULL) { |
1272 | 0 | goto error; |
1273 | 0 | } |
1274 | 61.6k | int res = _PyException_AddNote(exc, note); |
1275 | 61.6k | Py_DECREF(note); |
1276 | 61.6k | if (res < 0) { |
1277 | 0 | goto error; |
1278 | 0 | } |
1279 | 61.6k | PyErr_SetRaisedException(exc); |
1280 | 61.6k | return; |
1281 | 0 | error: |
1282 | 0 | _PyErr_ChainExceptions1(exc); |
1283 | 0 | } |
1284 | | |
1285 | | |
1286 | | PyObject * |
1287 | | PyErr_NewException(const char *name, PyObject *base, PyObject *dict) |
1288 | 234 | { |
1289 | 234 | PyThreadState *tstate = _PyThreadState_GET(); |
1290 | 234 | PyObject *modulename = NULL; |
1291 | 234 | PyObject *mydict = NULL; |
1292 | 234 | PyObject *bases = NULL; |
1293 | 234 | PyObject *result = NULL; |
1294 | | |
1295 | 234 | const char *dot = strrchr(name, '.'); |
1296 | 234 | if (dot == NULL) { |
1297 | 0 | _PyErr_SetString(tstate, PyExc_SystemError, |
1298 | 0 | "PyErr_NewException: name must be module.class"); |
1299 | 0 | return NULL; |
1300 | 0 | } |
1301 | 234 | if (base == NULL) { |
1302 | 58 | base = PyExc_Exception; |
1303 | 58 | } |
1304 | 234 | if (dict == NULL) { |
1305 | 186 | dict = mydict = PyDict_New(); |
1306 | 186 | if (dict == NULL) |
1307 | 0 | goto failure; |
1308 | 186 | } |
1309 | | |
1310 | 234 | int r = PyDict_Contains(dict, &_Py_ID(__module__)); |
1311 | 234 | if (r < 0) { |
1312 | 0 | goto failure; |
1313 | 0 | } |
1314 | 234 | if (r == 0) { |
1315 | 234 | modulename = PyUnicode_FromStringAndSize(name, |
1316 | 234 | (Py_ssize_t)(dot-name)); |
1317 | 234 | if (modulename == NULL) |
1318 | 0 | goto failure; |
1319 | 234 | if (PyDict_SetItem(dict, &_Py_ID(__module__), modulename) != 0) |
1320 | 0 | goto failure; |
1321 | 234 | } |
1322 | 234 | if (PyTuple_Check(base)) { |
1323 | 42 | bases = Py_NewRef(base); |
1324 | 192 | } else { |
1325 | 192 | bases = PyTuple_Pack(1, base); |
1326 | 192 | if (bases == NULL) |
1327 | 0 | goto failure; |
1328 | 192 | } |
1329 | | /* Create a real class. */ |
1330 | 234 | result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO", |
1331 | 234 | dot+1, bases, dict); |
1332 | 234 | failure: |
1333 | 234 | Py_XDECREF(bases); |
1334 | 234 | Py_XDECREF(mydict); |
1335 | 234 | Py_XDECREF(modulename); |
1336 | 234 | return result; |
1337 | 234 | } |
1338 | | |
1339 | | |
1340 | | /* Create an exception with docstring */ |
1341 | | PyObject * |
1342 | | PyErr_NewExceptionWithDoc(const char *name, const char *doc, |
1343 | | PyObject *base, PyObject *dict) |
1344 | 48 | { |
1345 | 48 | int result; |
1346 | 48 | PyObject *ret = NULL; |
1347 | 48 | PyObject *mydict = NULL; /* points to the dict only if we create it */ |
1348 | 48 | PyObject *docobj; |
1349 | | |
1350 | 48 | if (dict == NULL) { |
1351 | 48 | dict = mydict = PyDict_New(); |
1352 | 48 | if (dict == NULL) { |
1353 | 0 | return NULL; |
1354 | 0 | } |
1355 | 48 | } |
1356 | | |
1357 | 48 | if (doc != NULL) { |
1358 | 48 | docobj = PyUnicode_FromString(doc); |
1359 | 48 | if (docobj == NULL) |
1360 | 0 | goto failure; |
1361 | 48 | result = PyDict_SetItemString(dict, "__doc__", docobj); |
1362 | 48 | Py_DECREF(docobj); |
1363 | 48 | if (result < 0) |
1364 | 0 | goto failure; |
1365 | 48 | } |
1366 | | |
1367 | 48 | ret = PyErr_NewException(name, base, dict); |
1368 | 48 | failure: |
1369 | 48 | Py_XDECREF(mydict); |
1370 | 48 | return ret; |
1371 | 48 | } |
1372 | | |
1373 | | |
1374 | | PyDoc_STRVAR(UnraisableHookArgs__doc__, |
1375 | | "UnraisableHookArgs\n\ |
1376 | | \n\ |
1377 | | Type used to pass arguments to sys.unraisablehook."); |
1378 | | |
1379 | | static PyTypeObject UnraisableHookArgsType; |
1380 | | |
1381 | | static PyStructSequence_Field UnraisableHookArgs_fields[] = { |
1382 | | {"exc_type", "Exception type"}, |
1383 | | {"exc_value", "Exception value"}, |
1384 | | {"exc_traceback", "Exception traceback"}, |
1385 | | {"err_msg", "Error message"}, |
1386 | | {"object", "Object causing the exception"}, |
1387 | | {0} |
1388 | | }; |
1389 | | |
1390 | | static PyStructSequence_Desc UnraisableHookArgs_desc = { |
1391 | | .name = "UnraisableHookArgs", |
1392 | | .doc = UnraisableHookArgs__doc__, |
1393 | | .fields = UnraisableHookArgs_fields, |
1394 | | .n_in_sequence = 5 |
1395 | | }; |
1396 | | |
1397 | | |
1398 | | PyStatus |
1399 | | _PyErr_InitTypes(PyInterpreterState *interp) |
1400 | 36 | { |
1401 | 36 | if (_PyStructSequence_InitBuiltin(interp, &UnraisableHookArgsType, |
1402 | 36 | &UnraisableHookArgs_desc) < 0) |
1403 | 0 | { |
1404 | 0 | return _PyStatus_ERR("failed to initialize UnraisableHookArgs type"); |
1405 | 0 | } |
1406 | 36 | return _PyStatus_OK(); |
1407 | 36 | } |
1408 | | |
1409 | | |
1410 | | void |
1411 | | _PyErr_FiniTypes(PyInterpreterState *interp) |
1412 | 0 | { |
1413 | 0 | _PyStructSequence_FiniBuiltin(interp, &UnraisableHookArgsType); |
1414 | 0 | } |
1415 | | |
1416 | | |
1417 | | static PyObject * |
1418 | | make_unraisable_hook_args(PyThreadState *tstate, PyObject *exc_type, |
1419 | | PyObject *exc_value, PyObject *exc_tb, |
1420 | | PyObject *err_msg, PyObject *obj) |
1421 | 0 | { |
1422 | 0 | PyObject *args = PyStructSequence_New(&UnraisableHookArgsType); |
1423 | 0 | if (args == NULL) { |
1424 | 0 | return NULL; |
1425 | 0 | } |
1426 | | |
1427 | 0 | Py_ssize_t pos = 0; |
1428 | 0 | #define ADD_ITEM(exc_type) \ |
1429 | 0 | do { \ |
1430 | 0 | if (exc_type == NULL) { \ |
1431 | 0 | exc_type = Py_None; \ |
1432 | 0 | } \ |
1433 | 0 | PyStructSequence_SET_ITEM(args, pos++, Py_NewRef(exc_type)); \ |
1434 | 0 | } while (0) |
1435 | | |
1436 | |
|
1437 | 0 | ADD_ITEM(exc_type); |
1438 | 0 | ADD_ITEM(exc_value); |
1439 | 0 | ADD_ITEM(exc_tb); |
1440 | 0 | ADD_ITEM(err_msg); |
1441 | 0 | ADD_ITEM(obj); |
1442 | 0 | #undef ADD_ITEM |
1443 | |
|
1444 | 0 | if (_PyErr_Occurred(tstate)) { |
1445 | 0 | Py_DECREF(args); |
1446 | 0 | return NULL; |
1447 | 0 | } |
1448 | 0 | return args; |
1449 | 0 | } |
1450 | | |
1451 | | |
1452 | | |
1453 | | /* Default implementation of sys.unraisablehook. |
1454 | | |
1455 | | It can be called to log the exception of a custom sys.unraisablehook. |
1456 | | |
1457 | | This assumes 'file' is neither NULL nor None. |
1458 | | */ |
1459 | | static int |
1460 | | write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, |
1461 | | PyObject *exc_value, PyObject *exc_tb, |
1462 | | PyObject *err_msg, PyObject *obj, PyObject *file) |
1463 | 0 | { |
1464 | 0 | assert(file != NULL); |
1465 | 0 | assert(!Py_IsNone(file)); |
1466 | |
|
1467 | 0 | if (obj != NULL && obj != Py_None) { |
1468 | 0 | if (err_msg != NULL && err_msg != Py_None) { |
1469 | 0 | if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { |
1470 | 0 | return -1; |
1471 | 0 | } |
1472 | 0 | if (PyFile_WriteString(": ", file) < 0) { |
1473 | 0 | return -1; |
1474 | 0 | } |
1475 | 0 | } |
1476 | 0 | else { |
1477 | 0 | if (PyFile_WriteString("Exception ignored in: ", file) < 0) { |
1478 | 0 | return -1; |
1479 | 0 | } |
1480 | 0 | } |
1481 | | |
1482 | 0 | if (PyFile_WriteObject(obj, file, 0) < 0) { |
1483 | 0 | _PyErr_Clear(tstate); |
1484 | 0 | if (PyFile_WriteString("<object repr() failed>", file) < 0) { |
1485 | 0 | return -1; |
1486 | 0 | } |
1487 | 0 | } |
1488 | 0 | if (PyFile_WriteString("\n", file) < 0) { |
1489 | 0 | return -1; |
1490 | 0 | } |
1491 | 0 | } |
1492 | 0 | else if (err_msg != NULL && err_msg != Py_None) { |
1493 | 0 | if (PyFile_WriteObject(err_msg, file, Py_PRINT_RAW) < 0) { |
1494 | 0 | return -1; |
1495 | 0 | } |
1496 | 0 | if (PyFile_WriteString(":\n", file) < 0) { |
1497 | 0 | return -1; |
1498 | 0 | } |
1499 | 0 | } |
1500 | | |
1501 | | // Try printing the exception using the stdlib module. |
1502 | | // If this fails, then we have to use the C implementation. |
1503 | 0 | PyObject *print_exception_fn = PyImport_ImportModuleAttrString("traceback", |
1504 | 0 | "_print_exception_bltin"); |
1505 | 0 | if (print_exception_fn != NULL && PyCallable_Check(print_exception_fn)) { |
1506 | 0 | PyObject *args[2] = {exc_value, file}; |
1507 | 0 | PyObject *result = PyObject_Vectorcall(print_exception_fn, args, 2, NULL); |
1508 | 0 | int ok = (result != NULL); |
1509 | 0 | Py_DECREF(print_exception_fn); |
1510 | 0 | Py_XDECREF(result); |
1511 | 0 | if (ok) { |
1512 | | // Nothing else to do |
1513 | 0 | return 0; |
1514 | 0 | } |
1515 | 0 | } |
1516 | 0 | else { |
1517 | 0 | Py_XDECREF(print_exception_fn); |
1518 | 0 | } |
1519 | | // traceback module failed, fall back to pure C |
1520 | 0 | _PyErr_Clear(tstate); |
1521 | |
|
1522 | 0 | if (exc_tb != NULL && exc_tb != Py_None) { |
1523 | 0 | if (PyTraceBack_Print(exc_tb, file) < 0) { |
1524 | | /* continue even if writing the traceback failed */ |
1525 | 0 | _PyErr_Clear(tstate); |
1526 | 0 | } |
1527 | 0 | } |
1528 | |
|
1529 | 0 | if (exc_type == NULL || exc_type == Py_None) { |
1530 | 0 | return -1; |
1531 | 0 | } |
1532 | | |
1533 | 0 | assert(PyExceptionClass_Check(exc_type)); |
1534 | |
|
1535 | 0 | PyObject *modulename = PyObject_GetAttr(exc_type, &_Py_ID(__module__)); |
1536 | 0 | if (modulename == NULL || !PyUnicode_Check(modulename)) { |
1537 | 0 | Py_XDECREF(modulename); |
1538 | 0 | _PyErr_Clear(tstate); |
1539 | 0 | if (PyFile_WriteString("<unknown>", file) < 0) { |
1540 | 0 | return -1; |
1541 | 0 | } |
1542 | 0 | } |
1543 | 0 | else { |
1544 | 0 | if (!_PyUnicode_Equal(modulename, &_Py_ID(builtins)) && |
1545 | 0 | !_PyUnicode_Equal(modulename, &_Py_ID(__main__))) { |
1546 | 0 | if (PyFile_WriteObject(modulename, file, Py_PRINT_RAW) < 0) { |
1547 | 0 | Py_DECREF(modulename); |
1548 | 0 | return -1; |
1549 | 0 | } |
1550 | 0 | Py_DECREF(modulename); |
1551 | 0 | if (PyFile_WriteString(".", file) < 0) { |
1552 | 0 | return -1; |
1553 | 0 | } |
1554 | 0 | } |
1555 | 0 | else { |
1556 | 0 | Py_DECREF(modulename); |
1557 | 0 | } |
1558 | 0 | } |
1559 | | |
1560 | 0 | PyObject *qualname = PyType_GetQualName((PyTypeObject *)exc_type); |
1561 | 0 | if (qualname == NULL || !PyUnicode_Check(qualname)) { |
1562 | 0 | Py_XDECREF(qualname); |
1563 | 0 | _PyErr_Clear(tstate); |
1564 | 0 | if (PyFile_WriteString("<unknown>", file) < 0) { |
1565 | 0 | return -1; |
1566 | 0 | } |
1567 | 0 | } |
1568 | 0 | else { |
1569 | 0 | if (PyFile_WriteObject(qualname, file, Py_PRINT_RAW) < 0) { |
1570 | 0 | Py_DECREF(qualname); |
1571 | 0 | return -1; |
1572 | 0 | } |
1573 | 0 | Py_DECREF(qualname); |
1574 | 0 | } |
1575 | | |
1576 | 0 | if (exc_value && exc_value != Py_None) { |
1577 | 0 | if (PyFile_WriteString(": ", file) < 0) { |
1578 | 0 | return -1; |
1579 | 0 | } |
1580 | 0 | if (PyFile_WriteObject(exc_value, file, Py_PRINT_RAW) < 0) { |
1581 | 0 | _PyErr_Clear(tstate); |
1582 | 0 | if (PyFile_WriteString("<exception str() failed>", file) < 0) { |
1583 | 0 | return -1; |
1584 | 0 | } |
1585 | 0 | } |
1586 | 0 | } |
1587 | | |
1588 | 0 | if (PyFile_WriteString("\n", file) < 0) { |
1589 | 0 | return -1; |
1590 | 0 | } |
1591 | | |
1592 | | /* Explicitly call file.flush() */ |
1593 | 0 | if (_PyFile_Flush(file) < 0) { |
1594 | 0 | return -1; |
1595 | 0 | } |
1596 | | |
1597 | 0 | return 0; |
1598 | 0 | } |
1599 | | |
1600 | | |
1601 | | static int |
1602 | | write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type, |
1603 | | PyObject *exc_value, PyObject *exc_tb, PyObject *err_msg, |
1604 | | PyObject *obj) |
1605 | 0 | { |
1606 | 0 | PyObject *file; |
1607 | 0 | if (PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) { |
1608 | 0 | return -1; |
1609 | 0 | } |
1610 | 0 | if (file == NULL || file == Py_None) { |
1611 | 0 | Py_XDECREF(file); |
1612 | 0 | return 0; |
1613 | 0 | } |
1614 | | |
1615 | 0 | int res = write_unraisable_exc_file(tstate, exc_type, exc_value, exc_tb, |
1616 | 0 | err_msg, obj, file); |
1617 | 0 | Py_DECREF(file); |
1618 | |
|
1619 | 0 | return res; |
1620 | 0 | } |
1621 | | |
1622 | | |
1623 | | PyObject* |
1624 | | _PyErr_WriteUnraisableDefaultHook(PyObject *args) |
1625 | 0 | { |
1626 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1627 | |
|
1628 | 0 | if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) { |
1629 | 0 | _PyErr_SetString(tstate, PyExc_TypeError, |
1630 | 0 | "sys.unraisablehook argument type " |
1631 | 0 | "must be UnraisableHookArgs"); |
1632 | 0 | return NULL; |
1633 | 0 | } |
1634 | | |
1635 | | /* Borrowed references */ |
1636 | 0 | PyObject *exc_type = PyStructSequence_GET_ITEM(args, 0); |
1637 | 0 | PyObject *exc_value = PyStructSequence_GET_ITEM(args, 1); |
1638 | 0 | PyObject *exc_tb = PyStructSequence_GET_ITEM(args, 2); |
1639 | 0 | PyObject *err_msg = PyStructSequence_GET_ITEM(args, 3); |
1640 | 0 | PyObject *obj = PyStructSequence_GET_ITEM(args, 4); |
1641 | |
|
1642 | 0 | if (write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, err_msg, obj) < 0) { |
1643 | 0 | return NULL; |
1644 | 0 | } |
1645 | 0 | Py_RETURN_NONE; |
1646 | 0 | } |
1647 | | |
1648 | | |
1649 | | /* Call sys.unraisablehook(). |
1650 | | |
1651 | | This function can be used when an exception has occurred but there is no way |
1652 | | for Python to handle it. For example, when a destructor raises an exception |
1653 | | or during garbage collection (gc.collect()). |
1654 | | |
1655 | | If format is non-NULL, the error message is formatted using format and |
1656 | | variable arguments as in PyUnicode_FromFormat(). |
1657 | | Otherwise, use "Exception ignored in" error message. |
1658 | | |
1659 | | An exception must be set when calling this function. */ |
1660 | | |
1661 | | static void |
1662 | | format_unraisable_v(const char *format, va_list va, PyObject *obj) |
1663 | 0 | { |
1664 | 0 | const char *err_msg_str; |
1665 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1666 | 0 | _Py_EnsureTstateNotNULL(tstate); |
1667 | |
|
1668 | 0 | PyObject *err_msg = NULL; |
1669 | 0 | PyObject *hook = NULL; |
1670 | 0 | PyObject *exc_type, *exc_value, *exc_tb; |
1671 | 0 | _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); |
1672 | |
|
1673 | 0 | assert(exc_type != NULL); |
1674 | |
|
1675 | 0 | if (exc_type == NULL) { |
1676 | | /* sys.unraisablehook requires that at least exc_type is set */ |
1677 | 0 | goto default_hook; |
1678 | 0 | } |
1679 | | |
1680 | 0 | if (exc_tb == NULL) { |
1681 | 0 | PyFrameObject *frame = PyThreadState_GetFrame(tstate); |
1682 | 0 | if (frame != NULL) { |
1683 | 0 | exc_tb = _PyTraceBack_FromFrame(NULL, frame); |
1684 | 0 | if (exc_tb == NULL) { |
1685 | 0 | _PyErr_Clear(tstate); |
1686 | 0 | } |
1687 | 0 | Py_DECREF(frame); |
1688 | 0 | } |
1689 | 0 | } |
1690 | |
|
1691 | 0 | _PyErr_NormalizeException(tstate, &exc_type, &exc_value, &exc_tb); |
1692 | |
|
1693 | 0 | if (exc_tb != NULL && exc_tb != Py_None && PyTraceBack_Check(exc_tb)) { |
1694 | 0 | if (PyException_SetTraceback(exc_value, exc_tb) < 0) { |
1695 | 0 | _PyErr_Clear(tstate); |
1696 | 0 | } |
1697 | 0 | } |
1698 | |
|
1699 | 0 | if (format != NULL) { |
1700 | 0 | err_msg = PyUnicode_FromFormatV(format, va); |
1701 | 0 | if (err_msg == NULL) { |
1702 | 0 | PyErr_Clear(); |
1703 | 0 | } |
1704 | 0 | } |
1705 | |
|
1706 | 0 | PyObject *hook_args = make_unraisable_hook_args( |
1707 | 0 | tstate, exc_type, exc_value, exc_tb, err_msg, obj); |
1708 | 0 | if (hook_args == NULL) { |
1709 | 0 | err_msg_str = ("Exception ignored while building " |
1710 | 0 | "sys.unraisablehook arguments"); |
1711 | 0 | goto error; |
1712 | 0 | } |
1713 | | |
1714 | 0 | if (PySys_GetOptionalAttr(&_Py_ID(unraisablehook), &hook) < 0) { |
1715 | 0 | Py_DECREF(hook_args); |
1716 | 0 | err_msg_str = NULL; |
1717 | 0 | obj = NULL; |
1718 | 0 | goto error; |
1719 | 0 | } |
1720 | 0 | if (hook == NULL) { |
1721 | 0 | Py_DECREF(hook_args); |
1722 | 0 | goto default_hook; |
1723 | 0 | } |
1724 | | |
1725 | 0 | if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) { |
1726 | 0 | Py_DECREF(hook_args); |
1727 | 0 | err_msg_str = "Exception ignored in audit hook"; |
1728 | 0 | obj = NULL; |
1729 | 0 | goto error; |
1730 | 0 | } |
1731 | | |
1732 | 0 | if (hook == Py_None) { |
1733 | 0 | Py_DECREF(hook_args); |
1734 | 0 | goto default_hook; |
1735 | 0 | } |
1736 | | |
1737 | 0 | PyObject *res = PyObject_CallOneArg(hook, hook_args); |
1738 | 0 | Py_DECREF(hook_args); |
1739 | 0 | if (res != NULL) { |
1740 | 0 | Py_DECREF(res); |
1741 | 0 | goto done; |
1742 | 0 | } |
1743 | | |
1744 | | /* sys.unraisablehook failed: log its error using default hook */ |
1745 | 0 | obj = hook; |
1746 | 0 | err_msg_str = NULL; |
1747 | |
|
1748 | 0 | error: |
1749 | | /* err_msg_str and obj have been updated and we have a new exception */ |
1750 | 0 | Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ? |
1751 | 0 | err_msg_str : "Exception ignored in sys.unraisablehook")); |
1752 | 0 | Py_XDECREF(exc_type); |
1753 | 0 | Py_XDECREF(exc_value); |
1754 | 0 | Py_XDECREF(exc_tb); |
1755 | 0 | _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); |
1756 | |
|
1757 | 0 | default_hook: |
1758 | | /* Call the default unraisable hook (ignore failure) */ |
1759 | 0 | (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, |
1760 | 0 | err_msg, obj); |
1761 | |
|
1762 | 0 | done: |
1763 | 0 | Py_XDECREF(exc_type); |
1764 | 0 | Py_XDECREF(exc_value); |
1765 | 0 | Py_XDECREF(exc_tb); |
1766 | 0 | Py_XDECREF(err_msg); |
1767 | 0 | Py_XDECREF(hook); |
1768 | 0 | _PyErr_Clear(tstate); /* Just in case */ |
1769 | 0 | } |
1770 | | |
1771 | | void |
1772 | | PyErr_FormatUnraisable(const char *format, ...) |
1773 | 0 | { |
1774 | 0 | va_list va; |
1775 | |
|
1776 | 0 | va_start(va, format); |
1777 | 0 | format_unraisable_v(format, va, NULL); |
1778 | 0 | va_end(va); |
1779 | 0 | } |
1780 | | |
1781 | | static void |
1782 | | format_unraisable(PyObject *obj, const char *format, ...) |
1783 | 0 | { |
1784 | 0 | va_list va; |
1785 | |
|
1786 | 0 | va_start(va, format); |
1787 | 0 | format_unraisable_v(format, va, obj); |
1788 | 0 | va_end(va); |
1789 | 0 | } |
1790 | | |
1791 | | void |
1792 | | PyErr_WriteUnraisable(PyObject *obj) |
1793 | 0 | { |
1794 | 0 | format_unraisable(obj, NULL); |
1795 | 0 | } |
1796 | | |
1797 | | |
1798 | | void |
1799 | | PyErr_SyntaxLocation(const char *filename, int lineno) |
1800 | 0 | { |
1801 | 0 | PyErr_SyntaxLocationEx(filename, lineno, -1); |
1802 | 0 | } |
1803 | | |
1804 | | |
1805 | | /* Set file and line information for the current exception. |
1806 | | If the exception is not a SyntaxError, also sets additional attributes |
1807 | | to make printing of exceptions believe it is a syntax error. */ |
1808 | | |
1809 | | static void |
1810 | | PyErr_SyntaxLocationObjectEx(PyObject *filename, int lineno, int col_offset, |
1811 | | int end_lineno, int end_col_offset) |
1812 | 23 | { |
1813 | 23 | PyThreadState *tstate = _PyThreadState_GET(); |
1814 | | |
1815 | | /* add attributes for the line number and filename for the error */ |
1816 | 23 | PyObject *exc = _PyErr_GetRaisedException(tstate); |
1817 | | /* XXX check that it is, indeed, a syntax error. It might not |
1818 | | * be, though. */ |
1819 | 23 | PyObject *tmp = PyLong_FromLong(lineno); |
1820 | 23 | if (tmp == NULL) { |
1821 | 0 | _PyErr_Clear(tstate); |
1822 | 0 | } |
1823 | 23 | else { |
1824 | 23 | if (PyObject_SetAttr(exc, &_Py_ID(lineno), tmp)) { |
1825 | 0 | _PyErr_Clear(tstate); |
1826 | 0 | } |
1827 | 23 | Py_DECREF(tmp); |
1828 | 23 | } |
1829 | 23 | tmp = NULL; |
1830 | 23 | if (col_offset >= 0) { |
1831 | 23 | tmp = PyLong_FromLong(col_offset); |
1832 | 23 | if (tmp == NULL) { |
1833 | 0 | _PyErr_Clear(tstate); |
1834 | 0 | } |
1835 | 23 | } |
1836 | 23 | if (PyObject_SetAttr(exc, &_Py_ID(offset), tmp ? tmp : Py_None)) { |
1837 | 0 | _PyErr_Clear(tstate); |
1838 | 0 | } |
1839 | 23 | Py_XDECREF(tmp); |
1840 | | |
1841 | 23 | tmp = NULL; |
1842 | 23 | if (end_lineno >= 0) { |
1843 | 23 | tmp = PyLong_FromLong(end_lineno); |
1844 | 23 | if (tmp == NULL) { |
1845 | 0 | _PyErr_Clear(tstate); |
1846 | 0 | } |
1847 | 23 | } |
1848 | 23 | if (PyObject_SetAttr(exc, &_Py_ID(end_lineno), tmp ? tmp : Py_None)) { |
1849 | 0 | _PyErr_Clear(tstate); |
1850 | 0 | } |
1851 | 23 | Py_XDECREF(tmp); |
1852 | | |
1853 | 23 | tmp = NULL; |
1854 | 23 | if (end_col_offset >= 0) { |
1855 | 23 | tmp = PyLong_FromLong(end_col_offset); |
1856 | 23 | if (tmp == NULL) { |
1857 | 0 | _PyErr_Clear(tstate); |
1858 | 0 | } |
1859 | 23 | } |
1860 | 23 | if (PyObject_SetAttr(exc, &_Py_ID(end_offset), tmp ? tmp : Py_None)) { |
1861 | 0 | _PyErr_Clear(tstate); |
1862 | 0 | } |
1863 | 23 | Py_XDECREF(tmp); |
1864 | | |
1865 | 23 | tmp = NULL; |
1866 | 23 | if (filename != NULL) { |
1867 | 23 | if (PyObject_SetAttr(exc, &_Py_ID(filename), filename)) { |
1868 | 0 | _PyErr_Clear(tstate); |
1869 | 0 | } |
1870 | | |
1871 | 23 | tmp = PyErr_ProgramTextObject(filename, lineno); |
1872 | 23 | if (tmp) { |
1873 | 0 | if (PyObject_SetAttr(exc, &_Py_ID(text), tmp)) { |
1874 | 0 | _PyErr_Clear(tstate); |
1875 | 0 | } |
1876 | 0 | Py_DECREF(tmp); |
1877 | 0 | } |
1878 | 23 | else { |
1879 | 23 | _PyErr_Clear(tstate); |
1880 | 23 | } |
1881 | 23 | } |
1882 | 23 | if ((PyObject *)Py_TYPE(exc) != PyExc_SyntaxError) { |
1883 | 0 | int rc = PyObject_HasAttrWithError(exc, &_Py_ID(msg)); |
1884 | 0 | if (rc < 0) { |
1885 | 0 | _PyErr_Clear(tstate); |
1886 | 0 | } |
1887 | 0 | else if (!rc) { |
1888 | 0 | tmp = PyObject_Str(exc); |
1889 | 0 | if (tmp) { |
1890 | 0 | if (PyObject_SetAttr(exc, &_Py_ID(msg), tmp)) { |
1891 | 0 | _PyErr_Clear(tstate); |
1892 | 0 | } |
1893 | 0 | Py_DECREF(tmp); |
1894 | 0 | } |
1895 | 0 | else { |
1896 | 0 | _PyErr_Clear(tstate); |
1897 | 0 | } |
1898 | 0 | } |
1899 | |
|
1900 | 0 | rc = PyObject_HasAttrWithError(exc, &_Py_ID(print_file_and_line)); |
1901 | 0 | if (rc < 0) { |
1902 | 0 | _PyErr_Clear(tstate); |
1903 | 0 | } |
1904 | 0 | else if (!rc) { |
1905 | 0 | if (PyObject_SetAttr(exc, &_Py_ID(print_file_and_line), Py_None)) { |
1906 | 0 | _PyErr_Clear(tstate); |
1907 | 0 | } |
1908 | 0 | } |
1909 | 0 | } |
1910 | 23 | _PyErr_SetRaisedException(tstate, exc); |
1911 | 23 | } |
1912 | | |
1913 | | void |
1914 | 0 | PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) { |
1915 | 0 | PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, lineno, -1); |
1916 | 0 | } |
1917 | | |
1918 | | void |
1919 | | PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset, |
1920 | 23 | int end_lineno, int end_col_offset) { |
1921 | 23 | PyErr_SyntaxLocationObjectEx(filename, lineno, col_offset, end_lineno, end_col_offset); |
1922 | 23 | } |
1923 | | |
1924 | | void |
1925 | | PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) |
1926 | 0 | { |
1927 | 0 | PyThreadState *tstate = _PyThreadState_GET(); |
1928 | 0 | PyObject *fileobj; |
1929 | 0 | if (filename != NULL) { |
1930 | 0 | fileobj = PyUnicode_DecodeFSDefault(filename); |
1931 | 0 | if (fileobj == NULL) { |
1932 | 0 | _PyErr_Clear(tstate); |
1933 | 0 | } |
1934 | 0 | } |
1935 | 0 | else { |
1936 | 0 | fileobj = NULL; |
1937 | 0 | } |
1938 | 0 | PyErr_SyntaxLocationObject(fileobj, lineno, col_offset); |
1939 | 0 | Py_XDECREF(fileobj); |
1940 | 0 | } |
1941 | | |
1942 | | /* Raises a SyntaxError. |
1943 | | * If something goes wrong, a different exception may be raised. |
1944 | | */ |
1945 | | void |
1946 | | _PyErr_RaiseSyntaxError(PyObject *msg, PyObject *filename, int lineno, int col_offset, |
1947 | | int end_lineno, int end_col_offset) |
1948 | 0 | { |
1949 | 0 | PyObject *text = PyErr_ProgramTextObject(filename, lineno); |
1950 | 0 | if (text == NULL) { |
1951 | 0 | text = Py_NewRef(Py_None); |
1952 | 0 | } |
1953 | 0 | PyObject *args = Py_BuildValue("O(OiiOii)", msg, filename, |
1954 | 0 | lineno, col_offset, text, |
1955 | 0 | end_lineno, end_col_offset); |
1956 | 0 | if (args == NULL) { |
1957 | 0 | goto exit; |
1958 | 0 | } |
1959 | 0 | PyErr_SetObject(PyExc_SyntaxError, args); |
1960 | 0 | exit: |
1961 | 0 | Py_DECREF(text); |
1962 | 0 | Py_XDECREF(args); |
1963 | 0 | } |
1964 | | |
1965 | | /* Emits a SyntaxWarning and returns 0 on success. |
1966 | | If a SyntaxWarning is raised as error, replaces it with a SyntaxError |
1967 | | and returns -1. |
1968 | | */ |
1969 | | int |
1970 | | _PyErr_EmitSyntaxWarning(PyObject *msg, PyObject *filename, int lineno, int col_offset, |
1971 | | int end_lineno, int end_col_offset, |
1972 | | PyObject *module) |
1973 | 0 | { |
1974 | 0 | if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, filename, lineno, |
1975 | 0 | module, NULL) < 0) |
1976 | 0 | { |
1977 | 0 | if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { |
1978 | | /* Replace the SyntaxWarning exception with a SyntaxError |
1979 | | to get a more accurate error report */ |
1980 | 0 | PyErr_Clear(); |
1981 | 0 | _PyErr_RaiseSyntaxError(msg, filename, lineno, col_offset, |
1982 | 0 | end_lineno, end_col_offset); |
1983 | 0 | } |
1984 | 0 | return -1; |
1985 | 0 | } |
1986 | 0 | return 0; |
1987 | 0 | } |
1988 | | |
1989 | | /* Attempt to load the line of text that the exception refers to. If it |
1990 | | fails, it will return NULL but will not set an exception. |
1991 | | |
1992 | | XXX The functionality of this function is quite similar to the |
1993 | | functionality in tb_displayline() in traceback.c. */ |
1994 | | |
1995 | | static PyObject * |
1996 | | err_programtext(FILE *fp, int lineno, const char* encoding) |
1997 | 0 | { |
1998 | 0 | char linebuf[1000]; |
1999 | 0 | size_t line_size = 0; |
2000 | |
|
2001 | 0 | for (int i = 0; i < lineno; ) { |
2002 | 0 | line_size = 0; |
2003 | 0 | if (_Py_UniversalNewlineFgetsWithSize(linebuf, sizeof(linebuf), |
2004 | 0 | fp, NULL, &line_size) == NULL) |
2005 | 0 | { |
2006 | | /* Error or EOF. */ |
2007 | 0 | return NULL; |
2008 | 0 | } |
2009 | | /* fgets read *something*; if it didn't fill the |
2010 | | whole buffer, it must have found a newline |
2011 | | or hit the end of the file; if the last character is \n, |
2012 | | it obviously found a newline; else we haven't |
2013 | | yet seen a newline, so must continue */ |
2014 | 0 | if (i + 1 < lineno |
2015 | 0 | && line_size == sizeof(linebuf) - 1 |
2016 | 0 | && linebuf[sizeof(linebuf) - 2] != '\n') |
2017 | 0 | { |
2018 | 0 | continue; |
2019 | 0 | } |
2020 | 0 | i++; |
2021 | 0 | } |
2022 | | |
2023 | 0 | const char *line = linebuf; |
2024 | | /* Skip BOM. */ |
2025 | 0 | if (lineno == 1 && line_size >= 3 && memcmp(line, "\xef\xbb\xbf", 3) == 0) { |
2026 | 0 | line += 3; |
2027 | 0 | line_size -= 3; |
2028 | 0 | } |
2029 | 0 | PyObject *res = PyUnicode_Decode(line, line_size, encoding, "replace"); |
2030 | 0 | if (res == NULL) { |
2031 | 0 | PyErr_Clear(); |
2032 | 0 | } |
2033 | 0 | return res; |
2034 | 0 | } |
2035 | | |
2036 | | PyObject * |
2037 | | PyErr_ProgramText(const char *filename, int lineno) |
2038 | 0 | { |
2039 | 0 | if (filename == NULL) { |
2040 | 0 | return NULL; |
2041 | 0 | } |
2042 | | |
2043 | 0 | PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); |
2044 | 0 | if (filename_obj == NULL) { |
2045 | 0 | PyErr_Clear(); |
2046 | 0 | return NULL; |
2047 | 0 | } |
2048 | 0 | PyObject *res = PyErr_ProgramTextObject(filename_obj, lineno); |
2049 | 0 | Py_DECREF(filename_obj); |
2050 | 0 | return res; |
2051 | 0 | } |
2052 | | |
2053 | | /* Function from Parser/tokenizer/file_tokenizer.c */ |
2054 | | extern char* _PyTokenizer_FindEncodingFilename(int, PyObject *); |
2055 | | |
2056 | | PyObject * |
2057 | | _PyErr_ProgramDecodedTextObject(PyObject *filename, int lineno, const char* encoding) |
2058 | 90.6k | { |
2059 | 90.6k | char *found_encoding = NULL; |
2060 | 90.6k | if (filename == NULL || lineno <= 0) { |
2061 | 0 | return NULL; |
2062 | 0 | } |
2063 | | |
2064 | 90.6k | FILE *fp = Py_fopen(filename, "r" PY_STDIOTEXTMODE); |
2065 | 90.6k | if (fp == NULL) { |
2066 | 90.6k | PyErr_Clear(); |
2067 | 90.6k | return NULL; |
2068 | 90.6k | } |
2069 | 0 | if (encoding == NULL) { |
2070 | 0 | int fd = fileno(fp); |
2071 | 0 | found_encoding = _PyTokenizer_FindEncodingFilename(fd, filename); |
2072 | 0 | encoding = found_encoding; |
2073 | 0 | if (encoding == NULL) { |
2074 | 0 | PyErr_Clear(); |
2075 | 0 | encoding = "utf-8"; |
2076 | 0 | } |
2077 | | /* Reset position */ |
2078 | 0 | if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { |
2079 | 0 | fclose(fp); |
2080 | 0 | PyMem_Free(found_encoding); |
2081 | 0 | return NULL; |
2082 | 0 | } |
2083 | 0 | } |
2084 | 0 | PyObject *res = err_programtext(fp, lineno, encoding); |
2085 | 0 | fclose(fp); |
2086 | 0 | PyMem_Free(found_encoding); |
2087 | 0 | return res; |
2088 | 0 | } |
2089 | | |
2090 | | PyObject * |
2091 | | PyErr_ProgramTextObject(PyObject *filename, int lineno) |
2092 | 23 | { |
2093 | | return _PyErr_ProgramDecodedTextObject(filename, lineno, NULL); |
2094 | 23 | } |