1
2 /* Top level execution of Python code (including in __main__) */
3
4 /* To help control the interfaces between the startup, execution and
5 * shutdown code, the phases are split across separate modules (bootstrap,
6 * pythonrun, shutdown)
7 */
8
9 /* TODO: Cull includes following phase split */
10
11 #include <stdbool.h>
12
13 #include "Python.h"
14
15 #include "pycore_ast.h" // PyAST_mod2obj
16 #include "pycore_ceval.h" // _Py_EnterRecursiveCall
17 #include "pycore_compile.h" // _PyAST_Compile()
18 #include "pycore_interp.h" // PyInterpreterState.importlib
19 #include "pycore_object.h" // _PyDebug_PrintTotalRefs()
20 #include "pycore_parser.h" // _PyParser_ASTFromString()
21 #include "pycore_pyerrors.h" // _PyErr_Fetch, _Py_Offer_Suggestions
22 #include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt
23 #include "pycore_pystate.h" // _PyInterpreterState_GET()
24 #include "pycore_sysmodule.h" // _PySys_Audit()
25 #include "pycore_traceback.h" // _PyTraceBack_Print_Indented()
26
27 #include "token.h" // INDENT
28 #include "errcode.h" // E_EOF
29 #include "marshal.h" // PyMarshal_ReadLongFromFile()
30
31 #ifdef MS_WINDOWS
32 # include "malloc.h" // alloca()
33 #endif
34
35 #ifdef MS_WINDOWS
36 # undef BYTE
37 # include "windows.h"
38 #endif
39
40
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44
45 /* Forward */
46 static void flush_io(void);
47 static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *,
48 PyCompilerFlags *, PyArena *);
49 static PyObject *run_pyc_file(FILE *, PyObject *, PyObject *,
50 PyCompilerFlags *);
51 static int PyRun_InteractiveOneObjectEx(FILE *, PyObject *, PyCompilerFlags *);
52 static PyObject* pyrun_file(FILE *fp, PyObject *filename, int start,
53 PyObject *globals, PyObject *locals, int closeit,
54 PyCompilerFlags *flags);
55
56
57 int
_PyRun_AnyFileObject(FILE * fp,PyObject * filename,int closeit,PyCompilerFlags * flags)58 _PyRun_AnyFileObject(FILE *fp, PyObject *filename, int closeit,
59 PyCompilerFlags *flags)
60 {
61 int decref_filename = 0;
62 if (filename == NULL) {
63 filename = PyUnicode_FromString("???");
64 if (filename == NULL) {
65 PyErr_Print();
66 return -1;
67 }
68 decref_filename = 1;
69 }
70
71 int res;
72 if (_Py_FdIsInteractive(fp, filename)) {
73 res = _PyRun_InteractiveLoopObject(fp, filename, flags);
74 if (closeit) {
75 fclose(fp);
76 }
77 }
78 else {
79 res = _PyRun_SimpleFileObject(fp, filename, closeit, flags);
80 }
81
82 if (decref_filename) {
83 Py_DECREF(filename);
84 }
85 return res;
86 }
87
88
89 /* Parse input from a file and execute it */
90 int
PyRun_AnyFileExFlags(FILE * fp,const char * filename,int closeit,PyCompilerFlags * flags)91 PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
92 PyCompilerFlags *flags)
93 {
94 PyObject *filename_obj;
95 if (filename != NULL) {
96 filename_obj = PyUnicode_DecodeFSDefault(filename);
97 if (filename_obj == NULL) {
98 PyErr_Print();
99 return -1;
100 }
101 }
102 else {
103 filename_obj = NULL;
104 }
105 int res = _PyRun_AnyFileObject(fp, filename_obj, closeit, flags);
106 Py_XDECREF(filename_obj);
107 return res;
108 }
109
110
111 int
_PyRun_InteractiveLoopObject(FILE * fp,PyObject * filename,PyCompilerFlags * flags)112 _PyRun_InteractiveLoopObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
113 {
114 PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
115 if (flags == NULL) {
116 flags = &local_flags;
117 }
118
119 PyThreadState *tstate = _PyThreadState_GET();
120 PyObject *v = _PySys_GetAttr(tstate, &_Py_ID(ps1));
121 if (v == NULL) {
122 _PySys_SetAttr(&_Py_ID(ps1), v = PyUnicode_FromString(">>> "));
123 Py_XDECREF(v);
124 }
125 v = _PySys_GetAttr(tstate, &_Py_ID(ps2));
126 if (v == NULL) {
127 _PySys_SetAttr(&_Py_ID(ps2), v = PyUnicode_FromString("... "));
128 Py_XDECREF(v);
129 }
130
131 #ifdef Py_REF_DEBUG
132 int show_ref_count = _Py_GetConfig()->show_ref_count;
133 #endif
134 int err = 0;
135 int ret;
136 int nomem_count = 0;
137 do {
138 ret = PyRun_InteractiveOneObjectEx(fp, filename, flags);
139 if (ret == -1 && PyErr_Occurred()) {
140 /* Prevent an endless loop after multiple consecutive MemoryErrors
141 * while still allowing an interactive command to fail with a
142 * MemoryError. */
143 if (PyErr_ExceptionMatches(PyExc_MemoryError)) {
144 if (++nomem_count > 16) {
145 PyErr_Clear();
146 err = -1;
147 break;
148 }
149 } else {
150 nomem_count = 0;
151 }
152 PyErr_Print();
153 flush_io();
154 } else {
155 nomem_count = 0;
156 }
157 #ifdef Py_REF_DEBUG
158 if (show_ref_count) {
159 _PyDebug_PrintTotalRefs();
160 }
161 #endif
162 } while (ret != E_EOF);
163 return err;
164 }
165
166
167 int
PyRun_InteractiveLoopFlags(FILE * fp,const char * filename,PyCompilerFlags * flags)168 PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
169 {
170 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
171 if (filename_obj == NULL) {
172 PyErr_Print();
173 return -1;
174 }
175
176 int err = _PyRun_InteractiveLoopObject(fp, filename_obj, flags);
177 Py_DECREF(filename_obj);
178 return err;
179
180 }
181
182
183 /* A PyRun_InteractiveOneObject() auxiliary function that does not print the
184 * error on failure. */
185 static int
PyRun_InteractiveOneObjectEx(FILE * fp,PyObject * filename,PyCompilerFlags * flags)186 PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename,
187 PyCompilerFlags *flags)
188 {
189 PyObject *m, *d, *v, *w, *oenc = NULL;
190 mod_ty mod;
191 PyArena *arena;
192 const char *ps1 = "", *ps2 = "", *enc = NULL;
193 int errcode = 0;
194 PyThreadState *tstate = _PyThreadState_GET();
195
196 if (fp == stdin) {
197 /* Fetch encoding from sys.stdin if possible. */
198 v = _PySys_GetAttr(tstate, &_Py_ID(stdin));
199 if (v && v != Py_None) {
200 oenc = PyObject_GetAttr(v, &_Py_ID(encoding));
201 if (oenc)
202 enc = PyUnicode_AsUTF8(oenc);
203 if (!enc)
204 PyErr_Clear();
205 }
206 }
207 v = _PySys_GetAttr(tstate, &_Py_ID(ps1));
208 if (v != NULL) {
209 v = PyObject_Str(v);
210 if (v == NULL)
211 PyErr_Clear();
212 else if (PyUnicode_Check(v)) {
213 ps1 = PyUnicode_AsUTF8(v);
214 if (ps1 == NULL) {
215 PyErr_Clear();
216 ps1 = "";
217 }
218 }
219 }
220 w = _PySys_GetAttr(tstate, &_Py_ID(ps2));
221 if (w != NULL) {
222 w = PyObject_Str(w);
223 if (w == NULL)
224 PyErr_Clear();
225 else if (PyUnicode_Check(w)) {
226 ps2 = PyUnicode_AsUTF8(w);
227 if (ps2 == NULL) {
228 PyErr_Clear();
229 ps2 = "";
230 }
231 }
232 }
233 arena = _PyArena_New();
234 if (arena == NULL) {
235 Py_XDECREF(v);
236 Py_XDECREF(w);
237 Py_XDECREF(oenc);
238 return -1;
239 }
240
241 mod = _PyParser_ASTFromFile(fp, filename, enc, Py_single_input,
242 ps1, ps2, flags, &errcode, arena);
243
244 Py_XDECREF(v);
245 Py_XDECREF(w);
246 Py_XDECREF(oenc);
247 if (mod == NULL) {
248 _PyArena_Free(arena);
249 if (errcode == E_EOF) {
250 PyErr_Clear();
251 return E_EOF;
252 }
253 return -1;
254 }
255 m = PyImport_AddModuleObject(&_Py_ID(__main__));
256 if (m == NULL) {
257 _PyArena_Free(arena);
258 return -1;
259 }
260 d = PyModule_GetDict(m);
261 v = run_mod(mod, filename, d, d, flags, arena);
262 _PyArena_Free(arena);
263 if (v == NULL) {
264 return -1;
265 }
266 Py_DECREF(v);
267 flush_io();
268 return 0;
269 }
270
271 int
PyRun_InteractiveOneObject(FILE * fp,PyObject * filename,PyCompilerFlags * flags)272 PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
273 {
274 int res;
275
276 res = PyRun_InteractiveOneObjectEx(fp, filename, flags);
277 if (res == -1) {
278 PyErr_Print();
279 flush_io();
280 }
281 return res;
282 }
283
284 int
PyRun_InteractiveOneFlags(FILE * fp,const char * filename_str,PyCompilerFlags * flags)285 PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
286 {
287 PyObject *filename;
288 int res;
289
290 filename = PyUnicode_DecodeFSDefault(filename_str);
291 if (filename == NULL) {
292 PyErr_Print();
293 return -1;
294 }
295 res = PyRun_InteractiveOneObject(fp, filename, flags);
296 Py_DECREF(filename);
297 return res;
298 }
299
300
301 /* Check whether a file maybe a pyc file: Look at the extension,
302 the file type, and, if we may close it, at the first few bytes. */
303
304 static int
maybe_pyc_file(FILE * fp,PyObject * filename,int closeit)305 maybe_pyc_file(FILE *fp, PyObject *filename, int closeit)
306 {
307 PyObject *ext = PyUnicode_FromString(".pyc");
308 if (ext == NULL) {
309 return -1;
310 }
311 Py_ssize_t endswith = PyUnicode_Tailmatch(filename, ext, 0, PY_SSIZE_T_MAX, +1);
312 Py_DECREF(ext);
313 if (endswith) {
314 return 1;
315 }
316
317 /* Only look into the file if we are allowed to close it, since
318 it then should also be seekable. */
319 if (!closeit) {
320 return 0;
321 }
322
323 /* Read only two bytes of the magic. If the file was opened in
324 text mode, the bytes 3 and 4 of the magic (\r\n) might not
325 be read as they are on disk. */
326 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
327 unsigned char buf[2];
328 /* Mess: In case of -x, the stream is NOT at its start now,
329 and ungetc() was used to push back the first newline,
330 which makes the current stream position formally undefined,
331 and a x-platform nightmare.
332 Unfortunately, we have no direct way to know whether -x
333 was specified. So we use a terrible hack: if the current
334 stream position is not 0, we assume -x was specified, and
335 give up. Bug 132850 on SourceForge spells out the
336 hopelessness of trying anything else (fseek and ftell
337 don't work predictably x-platform for text-mode files).
338 */
339 int ispyc = 0;
340 if (ftell(fp) == 0) {
341 if (fread(buf, 1, 2, fp) == 2 &&
342 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
343 ispyc = 1;
344 rewind(fp);
345 }
346 return ispyc;
347 }
348
349
350 static int
set_main_loader(PyObject * d,PyObject * filename,const char * loader_name)351 set_main_loader(PyObject *d, PyObject *filename, const char *loader_name)
352 {
353 PyInterpreterState *interp = _PyInterpreterState_GET();
354 PyObject *bootstrap = PyObject_GetAttrString(interp->importlib,
355 "_bootstrap_external");
356 if (bootstrap == NULL) {
357 return -1;
358 }
359
360 PyObject *loader_type = PyObject_GetAttrString(bootstrap, loader_name);
361 Py_DECREF(bootstrap);
362 if (loader_type == NULL) {
363 return -1;
364 }
365
366 PyObject *loader = PyObject_CallFunction(loader_type,
367 "sO", "__main__", filename);
368 Py_DECREF(loader_type);
369 if (loader == NULL) {
370 return -1;
371 }
372
373 if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
374 Py_DECREF(loader);
375 return -1;
376 }
377 Py_DECREF(loader);
378 return 0;
379 }
380
381
382 int
_PyRun_SimpleFileObject(FILE * fp,PyObject * filename,int closeit,PyCompilerFlags * flags)383 _PyRun_SimpleFileObject(FILE *fp, PyObject *filename, int closeit,
384 PyCompilerFlags *flags)
385 {
386 PyObject *m, *d, *v;
387 int set_file_name = 0, ret = -1;
388
389 m = PyImport_AddModule("__main__");
390 if (m == NULL)
391 return -1;
392 Py_INCREF(m);
393 d = PyModule_GetDict(m);
394 if (_PyDict_GetItemStringWithError(d, "__file__") == NULL) {
395 if (PyErr_Occurred()) {
396 goto done;
397 }
398 if (PyDict_SetItemString(d, "__file__", filename) < 0) {
399 goto done;
400 }
401 if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) {
402 goto done;
403 }
404 set_file_name = 1;
405 }
406
407 int pyc = maybe_pyc_file(fp, filename, closeit);
408 if (pyc < 0) {
409 goto done;
410 }
411
412 if (pyc) {
413 FILE *pyc_fp;
414 /* Try to run a pyc file. First, re-open in binary */
415 if (closeit) {
416 fclose(fp);
417 }
418
419 pyc_fp = _Py_fopen_obj(filename, "rb");
420 if (pyc_fp == NULL) {
421 fprintf(stderr, "python: Can't reopen .pyc file\n");
422 goto done;
423 }
424
425 if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
426 fprintf(stderr, "python: failed to set __main__.__loader__\n");
427 ret = -1;
428 fclose(pyc_fp);
429 goto done;
430 }
431 v = run_pyc_file(pyc_fp, d, d, flags);
432 } else {
433 /* When running from stdin, leave __main__.__loader__ alone */
434 if (PyUnicode_CompareWithASCIIString(filename, "<stdin>") != 0 &&
435 set_main_loader(d, filename, "SourceFileLoader") < 0) {
436 fprintf(stderr, "python: failed to set __main__.__loader__\n");
437 ret = -1;
438 goto done;
439 }
440 v = pyrun_file(fp, filename, Py_file_input, d, d,
441 closeit, flags);
442 }
443 flush_io();
444 if (v == NULL) {
445 Py_CLEAR(m);
446 PyErr_Print();
447 goto done;
448 }
449 Py_DECREF(v);
450 ret = 0;
451 done:
452 if (set_file_name) {
453 if (PyDict_DelItemString(d, "__file__")) {
454 PyErr_Clear();
455 }
456 if (PyDict_DelItemString(d, "__cached__")) {
457 PyErr_Clear();
458 }
459 }
460 Py_XDECREF(m);
461 return ret;
462 }
463
464
465 int
PyRun_SimpleFileExFlags(FILE * fp,const char * filename,int closeit,PyCompilerFlags * flags)466 PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
467 PyCompilerFlags *flags)
468 {
469 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
470 if (filename_obj == NULL) {
471 return -1;
472 }
473 int res = _PyRun_SimpleFileObject(fp, filename_obj, closeit, flags);
474 Py_DECREF(filename_obj);
475 return res;
476 }
477
478
479 int
PyRun_SimpleStringFlags(const char * command,PyCompilerFlags * flags)480 PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
481 {
482 PyObject *m, *d, *v;
483 m = PyImport_AddModule("__main__");
484 if (m == NULL)
485 return -1;
486 d = PyModule_GetDict(m);
487 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
488 if (v == NULL) {
489 PyErr_Print();
490 return -1;
491 }
492 Py_DECREF(v);
493 return 0;
494 }
495
496 static int
parse_syntax_error(PyObject * err,PyObject ** message,PyObject ** filename,Py_ssize_t * lineno,Py_ssize_t * offset,Py_ssize_t * end_lineno,Py_ssize_t * end_offset,PyObject ** text)497 parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
498 Py_ssize_t *lineno, Py_ssize_t *offset,
499 Py_ssize_t* end_lineno, Py_ssize_t* end_offset,
500 PyObject **text)
501 {
502 Py_ssize_t hold;
503 PyObject *v;
504
505 *message = NULL;
506 *filename = NULL;
507
508 /* new style errors. `err' is an instance */
509 *message = PyObject_GetAttr(err, &_Py_ID(msg));
510 if (!*message)
511 goto finally;
512
513 v = PyObject_GetAttr(err, &_Py_ID(filename));
514 if (!v)
515 goto finally;
516 if (v == Py_None) {
517 Py_DECREF(v);
518 _Py_DECLARE_STR(anon_string, "<string>");
519 *filename = &_Py_STR(anon_string);
520 Py_INCREF(*filename);
521 }
522 else {
523 *filename = v;
524 }
525
526 v = PyObject_GetAttr(err, &_Py_ID(lineno));
527 if (!v)
528 goto finally;
529 hold = PyLong_AsSsize_t(v);
530 Py_DECREF(v);
531 if (hold < 0 && PyErr_Occurred())
532 goto finally;
533 *lineno = hold;
534
535 v = PyObject_GetAttr(err, &_Py_ID(offset));
536 if (!v)
537 goto finally;
538 if (v == Py_None) {
539 *offset = -1;
540 Py_DECREF(v);
541 } else {
542 hold = PyLong_AsSsize_t(v);
543 Py_DECREF(v);
544 if (hold < 0 && PyErr_Occurred())
545 goto finally;
546 *offset = hold;
547 }
548
549 if (Py_TYPE(err) == (PyTypeObject*)PyExc_SyntaxError) {
550 v = PyObject_GetAttr(err, &_Py_ID(end_lineno));
551 if (!v) {
552 PyErr_Clear();
553 *end_lineno = *lineno;
554 }
555 else if (v == Py_None) {
556 *end_lineno = *lineno;
557 Py_DECREF(v);
558 } else {
559 hold = PyLong_AsSsize_t(v);
560 Py_DECREF(v);
561 if (hold < 0 && PyErr_Occurred())
562 goto finally;
563 *end_lineno = hold;
564 }
565
566 v = PyObject_GetAttr(err, &_Py_ID(end_offset));
567 if (!v) {
568 PyErr_Clear();
569 *end_offset = -1;
570 }
571 else if (v == Py_None) {
572 *end_offset = -1;
573 Py_DECREF(v);
574 } else {
575 hold = PyLong_AsSsize_t(v);
576 Py_DECREF(v);
577 if (hold < 0 && PyErr_Occurred())
578 goto finally;
579 *end_offset = hold;
580 }
581 } else {
582 // SyntaxError subclasses
583 *end_lineno = *lineno;
584 *end_offset = -1;
585 }
586
587 v = PyObject_GetAttr(err, &_Py_ID(text));
588 if (!v)
589 goto finally;
590 if (v == Py_None) {
591 Py_DECREF(v);
592 *text = NULL;
593 }
594 else {
595 *text = v;
596 }
597 return 1;
598
599 finally:
600 Py_XDECREF(*message);
601 Py_XDECREF(*filename);
602 return 0;
603 }
604
605 static int
print_error_text(PyObject * f,Py_ssize_t offset,Py_ssize_t end_offset,PyObject * text_obj)606 print_error_text(PyObject *f, Py_ssize_t offset, Py_ssize_t end_offset,
607 PyObject *text_obj)
608 {
609 size_t caret_repetitions = (end_offset > 0 && end_offset > offset) ?
610 end_offset - offset : 1;
611
612 /* Convert text to a char pointer; return if error */
613 const char *text = PyUnicode_AsUTF8(text_obj);
614 if (text == NULL) {
615 return -1;
616 }
617
618 /* Convert offset from 1-based to 0-based */
619 offset--;
620
621 /* Strip leading whitespace from text, adjusting offset as we go */
622 while (*text == ' ' || *text == '\t' || *text == '\f') {
623 text++;
624 offset--;
625 }
626
627 /* Calculate text length excluding trailing newline */
628 Py_ssize_t len = strlen(text);
629 if (len > 0 && text[len-1] == '\n') {
630 len--;
631 }
632
633 /* Clip offset to at most len */
634 if (offset > len) {
635 offset = len;
636 }
637
638 /* Skip past newlines embedded in text */
639 for (;;) {
640 const char *nl = strchr(text, '\n');
641 if (nl == NULL) {
642 break;
643 }
644 Py_ssize_t inl = nl - text;
645 if (inl >= offset) {
646 break;
647 }
648 inl += 1;
649 text += inl;
650 len -= inl;
651 offset -= (int)inl;
652 }
653
654 /* Print text */
655 if (PyFile_WriteString(" ", f) < 0) {
656 return -1;
657 }
658 if (PyFile_WriteString(text, f) < 0) {
659 return -1;
660 }
661
662 /* Make sure there's a newline at the end */
663 if (text[len] != '\n') {
664 if (PyFile_WriteString("\n", f) < 0) {
665 return -1;
666 }
667 }
668
669 /* Don't print caret if it points to the left of the text */
670 if (offset < 0) {
671 return 0;
672 }
673
674 /* Write caret line */
675 if (PyFile_WriteString(" ", f) < 0) {
676 return -1;
677 }
678 while (--offset >= 0) {
679 if (PyFile_WriteString(" ", f) < 0) {
680 return -1;
681 }
682 }
683 for (size_t caret_iter=0; caret_iter < caret_repetitions ; caret_iter++) {
684 if (PyFile_WriteString("^", f) < 0) {
685 return -1;
686 }
687 }
688 if (PyFile_WriteString("\n", f) < 0) {
689 return -1;
690 }
691 return 0;
692 }
693
694
695 int
_Py_HandleSystemExit(int * exitcode_p)696 _Py_HandleSystemExit(int *exitcode_p)
697 {
698 int inspect = _Py_GetConfig()->inspect;
699 if (inspect) {
700 /* Don't exit if -i flag was given. This flag is set to 0
701 * when entering interactive mode for inspecting. */
702 return 0;
703 }
704
705 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
706 return 0;
707 }
708
709 PyObject *exception, *value, *tb;
710 PyErr_Fetch(&exception, &value, &tb);
711
712 fflush(stdout);
713
714 int exitcode = 0;
715 if (value == NULL || value == Py_None) {
716 goto done;
717 }
718
719 if (PyExceptionInstance_Check(value)) {
720 /* The error code should be in the `code' attribute. */
721 PyObject *code = PyObject_GetAttr(value, &_Py_ID(code));
722 if (code) {
723 Py_DECREF(value);
724 value = code;
725 if (value == Py_None)
726 goto done;
727 }
728 /* If we failed to dig out the 'code' attribute,
729 just let the else clause below print the error. */
730 }
731
732 if (PyLong_Check(value)) {
733 exitcode = (int)PyLong_AsLong(value);
734 }
735 else {
736 PyThreadState *tstate = _PyThreadState_GET();
737 PyObject *sys_stderr = _PySys_GetAttr(tstate, &_Py_ID(stderr));
738 /* We clear the exception here to avoid triggering the assertion
739 * in PyObject_Str that ensures it won't silently lose exception
740 * details.
741 */
742 PyErr_Clear();
743 if (sys_stderr != NULL && sys_stderr != Py_None) {
744 PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
745 } else {
746 PyObject_Print(value, stderr, Py_PRINT_RAW);
747 fflush(stderr);
748 }
749 PySys_WriteStderr("\n");
750 exitcode = 1;
751 }
752
753 done:
754 /* Restore and clear the exception info, in order to properly decref
755 * the exception, value, and traceback. If we just exit instead,
756 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
757 * some finalizers from running.
758 */
759 PyErr_Restore(exception, value, tb);
760 PyErr_Clear();
761 *exitcode_p = exitcode;
762 return 1;
763 }
764
765
766 static void
handle_system_exit(void)767 handle_system_exit(void)
768 {
769 int exitcode;
770 if (_Py_HandleSystemExit(&exitcode)) {
771 Py_Exit(exitcode);
772 }
773 }
774
775
776 static void
_PyErr_PrintEx(PyThreadState * tstate,int set_sys_last_vars)777 _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars)
778 {
779 PyObject *exception, *v, *tb, *hook;
780
781 handle_system_exit();
782
783 _PyErr_Fetch(tstate, &exception, &v, &tb);
784 if (exception == NULL) {
785 goto done;
786 }
787
788 _PyErr_NormalizeException(tstate, &exception, &v, &tb);
789 if (tb == NULL) {
790 tb = Py_None;
791 Py_INCREF(tb);
792 }
793 PyException_SetTraceback(v, tb);
794 if (exception == NULL) {
795 goto done;
796 }
797
798 /* Now we know v != NULL too */
799 if (set_sys_last_vars) {
800 if (_PySys_SetAttr(&_Py_ID(last_type), exception) < 0) {
801 _PyErr_Clear(tstate);
802 }
803 if (_PySys_SetAttr(&_Py_ID(last_value), v) < 0) {
804 _PyErr_Clear(tstate);
805 }
806 if (_PySys_SetAttr(&_Py_ID(last_traceback), tb) < 0) {
807 _PyErr_Clear(tstate);
808 }
809 }
810 hook = _PySys_GetAttr(tstate, &_Py_ID(excepthook));
811 if (_PySys_Audit(tstate, "sys.excepthook", "OOOO", hook ? hook : Py_None,
812 exception, v, tb) < 0) {
813 if (PyErr_ExceptionMatches(PyExc_RuntimeError)) {
814 PyErr_Clear();
815 goto done;
816 }
817 _PyErr_WriteUnraisableMsg("in audit hook", NULL);
818 }
819 if (hook) {
820 PyObject* stack[3];
821 PyObject *result;
822
823 stack[0] = exception;
824 stack[1] = v;
825 stack[2] = tb;
826 result = _PyObject_FastCall(hook, stack, 3);
827 if (result == NULL) {
828 handle_system_exit();
829
830 PyObject *exception2, *v2, *tb2;
831 _PyErr_Fetch(tstate, &exception2, &v2, &tb2);
832 _PyErr_NormalizeException(tstate, &exception2, &v2, &tb2);
833 /* It should not be possible for exception2 or v2
834 to be NULL. However PyErr_Display() can't
835 tolerate NULLs, so just be safe. */
836 if (exception2 == NULL) {
837 exception2 = Py_None;
838 Py_INCREF(exception2);
839 }
840 if (v2 == NULL) {
841 v2 = Py_None;
842 Py_INCREF(v2);
843 }
844 fflush(stdout);
845 PySys_WriteStderr("Error in sys.excepthook:\n");
846 PyErr_Display(exception2, v2, tb2);
847 PySys_WriteStderr("\nOriginal exception was:\n");
848 PyErr_Display(exception, v, tb);
849 Py_DECREF(exception2);
850 Py_DECREF(v2);
851 Py_XDECREF(tb2);
852 }
853 Py_XDECREF(result);
854 }
855 else {
856 PySys_WriteStderr("sys.excepthook is missing\n");
857 PyErr_Display(exception, v, tb);
858 }
859
860 done:
861 Py_XDECREF(exception);
862 Py_XDECREF(v);
863 Py_XDECREF(tb);
864 }
865
866 void
_PyErr_Print(PyThreadState * tstate)867 _PyErr_Print(PyThreadState *tstate)
868 {
869 _PyErr_PrintEx(tstate, 1);
870 }
871
872 void
PyErr_PrintEx(int set_sys_last_vars)873 PyErr_PrintEx(int set_sys_last_vars)
874 {
875 PyThreadState *tstate = _PyThreadState_GET();
876 _PyErr_PrintEx(tstate, set_sys_last_vars);
877 }
878
879 void
PyErr_Print(void)880 PyErr_Print(void)
881 {
882 PyErr_PrintEx(1);
883 }
884
885 struct exception_print_context
886 {
887 PyObject *file;
888 PyObject *seen; // Prevent cycles in recursion
889 int exception_group_depth; // nesting level of current exception group
890 bool need_close; // Need a closing bottom frame
891 int max_group_width; // Maximum number of children of each EG
892 int max_group_depth; // Maximum nesting level of EGs
893 };
894
895 #define EXC_MARGIN(ctx) ((ctx)->exception_group_depth ? "| " : "")
896 #define EXC_INDENT(ctx) (2 * (ctx)->exception_group_depth)
897
898 static int
write_indented_margin(struct exception_print_context * ctx,PyObject * f)899 write_indented_margin(struct exception_print_context *ctx, PyObject *f)
900 {
901 return _Py_WriteIndentedMargin(EXC_INDENT(ctx), EXC_MARGIN(ctx), f);
902 }
903
904 static int
print_exception_invalid_type(struct exception_print_context * ctx,PyObject * value)905 print_exception_invalid_type(struct exception_print_context *ctx,
906 PyObject *value)
907 {
908 PyObject *f = ctx->file;
909 if (_Py_WriteIndent(EXC_INDENT(ctx), f) < 0) {
910 return -1;
911 }
912 const char *const msg = "TypeError: print_exception(): Exception expected "
913 "for value, ";
914 if (PyFile_WriteString(msg, f) < 0) {
915 return -1;
916 }
917 if (PyFile_WriteString(Py_TYPE(value)->tp_name, f) < 0) {
918 return -1;
919 }
920 if (PyFile_WriteString(" found\n", f) < 0) {
921 return -1;
922 }
923 return 0;
924 }
925
926 static int
print_exception_traceback(struct exception_print_context * ctx,PyObject * value)927 print_exception_traceback(struct exception_print_context *ctx, PyObject *value)
928 {
929 PyObject *f = ctx->file;
930 int err = 0;
931
932 PyObject *tb = PyException_GetTraceback(value);
933 if (tb && tb != Py_None) {
934 const char *header = EXCEPTION_TB_HEADER;
935 const char *header_margin = EXC_MARGIN(ctx);
936 if (_PyBaseExceptionGroup_Check(value)) {
937 header = EXCEPTION_GROUP_TB_HEADER;
938 if (ctx->exception_group_depth == 1) {
939 header_margin = "+ ";
940 }
941 }
942 err = _PyTraceBack_Print_Indented(
943 tb, EXC_INDENT(ctx), EXC_MARGIN(ctx), header_margin, header, f);
944 }
945 Py_XDECREF(tb);
946 return err;
947 }
948
949 static int
print_exception_file_and_line(struct exception_print_context * ctx,PyObject ** value_p)950 print_exception_file_and_line(struct exception_print_context *ctx,
951 PyObject **value_p)
952 {
953 PyObject *f = ctx->file;
954
955 PyObject *tmp;
956 int res = _PyObject_LookupAttr(*value_p, &_Py_ID(print_file_and_line), &tmp);
957 if (res <= 0) {
958 if (res < 0) {
959 PyErr_Clear();
960 }
961 return 0;
962 }
963 Py_DECREF(tmp);
964
965 PyObject *message, *filename, *text;
966 Py_ssize_t lineno, offset, end_lineno, end_offset;
967 if (!parse_syntax_error(*value_p, &message, &filename,
968 &lineno, &offset,
969 &end_lineno, &end_offset, &text)) {
970 PyErr_Clear();
971 return 0;
972 }
973
974 Py_SETREF(*value_p, message);
975
976 PyObject *line = PyUnicode_FromFormat(" File \"%S\", line %zd\n",
977 filename, lineno);
978 Py_DECREF(filename);
979 if (line == NULL) {
980 goto error;
981 }
982 if (write_indented_margin(ctx, f) < 0) {
983 goto error;
984 }
985 if (PyFile_WriteObject(line, f, Py_PRINT_RAW) < 0) {
986 goto error;
987 }
988 Py_CLEAR(line);
989
990 if (text != NULL) {
991 Py_ssize_t line_size;
992 const char *error_line = PyUnicode_AsUTF8AndSize(text, &line_size);
993 // If the location of the error spawn multiple lines, we want
994 // to just print the first one and highlight everything until
995 // the end of that one since we don't support multi-line error
996 // messages.
997 if (end_lineno > lineno) {
998 end_offset = (error_line != NULL) ? line_size : -1;
999 }
1000 // Limit the amount of '^' that we can display to
1001 // the size of the text in the source line.
1002 if (error_line != NULL && end_offset > line_size + 1) {
1003 end_offset = line_size + 1;
1004 }
1005 if (print_error_text(f, offset, end_offset, text) < 0) {
1006 goto error;
1007 }
1008 Py_DECREF(text);
1009 }
1010 assert(!PyErr_Occurred());
1011 return 0;
1012
1013 error:
1014 Py_XDECREF(line);
1015 Py_XDECREF(text);
1016 return -1;
1017 }
1018
1019 /* Prints the message line: module.qualname[: str(exc)] */
1020 static int
print_exception_message(struct exception_print_context * ctx,PyObject * type,PyObject * value)1021 print_exception_message(struct exception_print_context *ctx, PyObject *type,
1022 PyObject *value)
1023 {
1024 PyObject *f = ctx->file;
1025
1026 assert(PyExceptionClass_Check(type));
1027
1028 if (write_indented_margin(ctx, f) < 0) {
1029 return -1;
1030 }
1031 PyObject *modulename = PyObject_GetAttr(type, &_Py_ID(__module__));
1032 if (modulename == NULL || !PyUnicode_Check(modulename)) {
1033 Py_XDECREF(modulename);
1034 PyErr_Clear();
1035 if (PyFile_WriteString("<unknown>.", f) < 0) {
1036 return -1;
1037 }
1038 }
1039 else {
1040 if (!_PyUnicode_Equal(modulename, &_Py_ID(builtins)) &&
1041 !_PyUnicode_Equal(modulename, &_Py_ID(__main__)))
1042 {
1043 int res = PyFile_WriteObject(modulename, f, Py_PRINT_RAW);
1044 Py_DECREF(modulename);
1045 if (res < 0) {
1046 return -1;
1047 }
1048 if (PyFile_WriteString(".", f) < 0) {
1049 return -1;
1050 }
1051 }
1052 else {
1053 Py_DECREF(modulename);
1054 }
1055 }
1056
1057 PyObject *qualname = PyType_GetQualName((PyTypeObject *)type);
1058 if (qualname == NULL || !PyUnicode_Check(qualname)) {
1059 Py_XDECREF(qualname);
1060 PyErr_Clear();
1061 if (PyFile_WriteString("<unknown>", f) < 0) {
1062 return -1;
1063 }
1064 }
1065 else {
1066 int res = PyFile_WriteObject(qualname, f, Py_PRINT_RAW);
1067 Py_DECREF(qualname);
1068 if (res < 0) {
1069 return -1;
1070 }
1071 }
1072
1073 if (Py_IsNone(value)) {
1074 return 0;
1075 }
1076
1077 PyObject *s = PyObject_Str(value);
1078 if (s == NULL) {
1079 PyErr_Clear();
1080 if (PyFile_WriteString(": <exception str() failed>", f) < 0) {
1081 return -1;
1082 }
1083 }
1084 else {
1085 /* only print colon if the str() of the
1086 object is not the empty string
1087 */
1088 if (!PyUnicode_Check(s) || PyUnicode_GetLength(s) != 0) {
1089 if (PyFile_WriteString(": ", f) < 0) {
1090 Py_DECREF(s);
1091 return -1;
1092 }
1093 }
1094 int res = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1095 Py_DECREF(s);
1096 if (res < 0) {
1097 return -1;
1098 }
1099 }
1100
1101 return 0;
1102 }
1103
1104 static int
print_exception_suggestions(struct exception_print_context * ctx,PyObject * value)1105 print_exception_suggestions(struct exception_print_context *ctx,
1106 PyObject *value)
1107 {
1108 PyObject *f = ctx->file;
1109 PyObject *suggestions = _Py_Offer_Suggestions(value);
1110 if (suggestions) {
1111 // Add a trailer ". Did you mean: (...)?"
1112 if (PyFile_WriteString(". Did you mean: '", f) < 0) {
1113 goto error;
1114 }
1115 if (PyFile_WriteObject(suggestions, f, Py_PRINT_RAW) < 0) {
1116 goto error;
1117 }
1118 if (PyFile_WriteString("'?", f) < 0) {
1119 goto error;
1120 }
1121 Py_DECREF(suggestions);
1122 }
1123 else if (PyErr_Occurred()) {
1124 PyErr_Clear();
1125 }
1126 return 0;
1127 error:
1128 Py_XDECREF(suggestions);
1129 return -1;
1130 }
1131
1132 static int
print_exception_notes(struct exception_print_context * ctx,PyObject * value)1133 print_exception_notes(struct exception_print_context *ctx, PyObject *value)
1134 {
1135 PyObject *f = ctx->file;
1136
1137 if (!PyExceptionInstance_Check(value)) {
1138 return 0;
1139 }
1140
1141 if (!PyObject_HasAttr(value, &_Py_ID(__notes__))) {
1142 return 0;
1143 }
1144 PyObject *notes = PyObject_GetAttr(value, &_Py_ID(__notes__));
1145 if (notes == NULL) {
1146 return -1;
1147 }
1148 if (!PySequence_Check(notes)) {
1149 int res = 0;
1150 if (write_indented_margin(ctx, f) < 0) {
1151 res = -1;
1152 }
1153 PyObject *s = PyObject_Repr(notes);
1154 if (s == NULL) {
1155 PyErr_Clear();
1156 res = PyFile_WriteString("<__notes__ repr() failed>", f);
1157 }
1158 else {
1159 res = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1160 Py_DECREF(s);
1161 }
1162 Py_DECREF(notes);
1163 return res;
1164 }
1165 Py_ssize_t num_notes = PySequence_Length(notes);
1166 PyObject *lines = NULL;
1167 for (Py_ssize_t ni = 0; ni < num_notes; ni++) {
1168 PyObject *note = PySequence_GetItem(notes, ni);
1169 PyObject *note_str = PyObject_Str(note);
1170 Py_DECREF(note);
1171
1172 if (note_str == NULL) {
1173 PyErr_Clear();
1174 if (PyFile_WriteString("<note str() failed>", f) < 0) {
1175 goto error;
1176 }
1177 }
1178 else {
1179 lines = PyUnicode_Splitlines(note_str, 1);
1180 Py_DECREF(note_str);
1181
1182 if (lines == NULL) {
1183 goto error;
1184 }
1185
1186 Py_ssize_t n = PyList_GET_SIZE(lines);
1187 for (Py_ssize_t i = 0; i < n; i++) {
1188 PyObject *line = PyList_GET_ITEM(lines, i);
1189 assert(PyUnicode_Check(line));
1190 if (write_indented_margin(ctx, f) < 0) {
1191 goto error;
1192 }
1193 if (PyFile_WriteObject(line, f, Py_PRINT_RAW) < 0) {
1194 goto error;
1195 }
1196 }
1197 Py_CLEAR(lines);
1198 }
1199 if (PyFile_WriteString("\n", f) < 0) {
1200 goto error;
1201 }
1202 }
1203
1204 Py_DECREF(notes);
1205 return 0;
1206 error:
1207 Py_XDECREF(lines);
1208 Py_DECREF(notes);
1209 return -1;
1210 }
1211
1212 static int
print_exception(struct exception_print_context * ctx,PyObject * value)1213 print_exception(struct exception_print_context *ctx, PyObject *value)
1214 {
1215 PyObject *f = ctx->file;
1216
1217 if (!PyExceptionInstance_Check(value)) {
1218 return print_exception_invalid_type(ctx, value);
1219 }
1220
1221 Py_INCREF(value);
1222 fflush(stdout);
1223
1224 if (print_exception_traceback(ctx, value) < 0) {
1225 goto error;
1226 }
1227
1228 /* grab the type now because value can change below */
1229 PyObject *type = (PyObject *) Py_TYPE(value);
1230
1231 if (print_exception_file_and_line(ctx, &value) < 0) {
1232 goto error;
1233 }
1234 if (print_exception_message(ctx, type, value) < 0) {
1235 goto error;
1236 }
1237 if (print_exception_suggestions(ctx, value) < 0) {
1238 goto error;
1239 }
1240 if (PyFile_WriteString("\n", f) < 0) {
1241 goto error;
1242 }
1243 if (print_exception_notes(ctx, value) < 0) {
1244 goto error;
1245 }
1246
1247 Py_DECREF(value);
1248 assert(!PyErr_Occurred());
1249 return 0;
1250 error:
1251 Py_DECREF(value);
1252 return -1;
1253 }
1254
1255 static const char cause_message[] =
1256 "The above exception was the direct cause "
1257 "of the following exception:\n";
1258
1259 static const char context_message[] =
1260 "During handling of the above exception, "
1261 "another exception occurred:\n";
1262
1263 static int
1264 print_exception_recursive(struct exception_print_context*, PyObject*);
1265
1266 static int
print_chained(struct exception_print_context * ctx,PyObject * value,const char * message,const char * tag)1267 print_chained(struct exception_print_context* ctx, PyObject *value,
1268 const char * message, const char *tag)
1269 {
1270 PyObject *f = ctx->file;
1271
1272 if (_Py_EnterRecursiveCall(" in print_chained") < 0) {
1273 return -1;
1274 }
1275 bool need_close = ctx->need_close;
1276 int res = print_exception_recursive(ctx, value);
1277 ctx->need_close = need_close;
1278 _Py_LeaveRecursiveCall();
1279 if (res < 0) {
1280 return -1;
1281 }
1282
1283 if (write_indented_margin(ctx, f) < 0) {
1284 return -1;
1285 }
1286 if (PyFile_WriteString("\n", f) < 0) {
1287 return -1;
1288 }
1289 if (write_indented_margin(ctx, f) < 0) {
1290 return -1;
1291 }
1292 if (PyFile_WriteString(message, f) < 0) {
1293 return -1;
1294 }
1295 if (write_indented_margin(ctx, f) < 0) {
1296 return -1;
1297 }
1298 if (PyFile_WriteString("\n", f) < 0) {
1299 return -1;
1300 }
1301 return 0;
1302 }
1303
1304 /* Return true if value is in seen or there was a lookup error.
1305 * Return false if lookup succeeded and the item was not found.
1306 * We suppress errors because this makes us err on the side of
1307 * under-printing which is better than over-printing irregular
1308 * exceptions (e.g., unhashable ones).
1309 */
1310 static bool
print_exception_seen_lookup(struct exception_print_context * ctx,PyObject * value)1311 print_exception_seen_lookup(struct exception_print_context *ctx,
1312 PyObject *value)
1313 {
1314 PyObject *check_id = PyLong_FromVoidPtr(value);
1315 if (check_id == NULL) {
1316 PyErr_Clear();
1317 return true;
1318 }
1319
1320 int in_seen = PySet_Contains(ctx->seen, check_id);
1321 Py_DECREF(check_id);
1322 if (in_seen == -1) {
1323 PyErr_Clear();
1324 return true;
1325 }
1326
1327 if (in_seen == 1) {
1328 /* value is in seen */
1329 return true;
1330 }
1331 return false;
1332 }
1333
1334 static int
print_exception_cause_and_context(struct exception_print_context * ctx,PyObject * value)1335 print_exception_cause_and_context(struct exception_print_context *ctx,
1336 PyObject *value)
1337 {
1338 PyObject *value_id = PyLong_FromVoidPtr(value);
1339 if (value_id == NULL || PySet_Add(ctx->seen, value_id) == -1) {
1340 PyErr_Clear();
1341 Py_XDECREF(value_id);
1342 return 0;
1343 }
1344 Py_DECREF(value_id);
1345
1346 if (!PyExceptionInstance_Check(value)) {
1347 return 0;
1348 }
1349
1350 PyObject *cause = PyException_GetCause(value);
1351 if (cause) {
1352 int err = 0;
1353 if (!print_exception_seen_lookup(ctx, cause)) {
1354 err = print_chained(ctx, cause, cause_message, "cause");
1355 }
1356 Py_DECREF(cause);
1357 return err;
1358 }
1359 if (((PyBaseExceptionObject *)value)->suppress_context) {
1360 return 0;
1361 }
1362 PyObject *context = PyException_GetContext(value);
1363 if (context) {
1364 int err = 0;
1365 if (!print_exception_seen_lookup(ctx, context)) {
1366 err = print_chained(ctx, context, context_message, "context");
1367 }
1368 Py_DECREF(context);
1369 return err;
1370 }
1371 return 0;
1372 }
1373
1374 static int
print_exception_group(struct exception_print_context * ctx,PyObject * value)1375 print_exception_group(struct exception_print_context *ctx, PyObject *value)
1376 {
1377 PyObject *f = ctx->file;
1378
1379 if (ctx->exception_group_depth > ctx->max_group_depth) {
1380 /* depth exceeds limit */
1381
1382 if (write_indented_margin(ctx, f) < 0) {
1383 return -1;
1384 }
1385
1386 PyObject *line = PyUnicode_FromFormat("... (max_group_depth is %d)\n",
1387 ctx->max_group_depth);
1388 if (line == NULL) {
1389 return -1;
1390 }
1391 int err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
1392 Py_DECREF(line);
1393 return err;
1394 }
1395
1396 if (ctx->exception_group_depth == 0) {
1397 ctx->exception_group_depth += 1;
1398 }
1399 print_exception(ctx, value);
1400
1401 PyObject *excs = ((PyBaseExceptionGroupObject *)value)->excs;
1402 assert(excs && PyTuple_Check(excs));
1403 Py_ssize_t num_excs = PyTuple_GET_SIZE(excs);
1404 assert(num_excs > 0);
1405 Py_ssize_t n;
1406 if (num_excs <= ctx->max_group_width) {
1407 n = num_excs;
1408 }
1409 else {
1410 n = ctx->max_group_width + 1;
1411 }
1412
1413 ctx->need_close = false;
1414 for (Py_ssize_t i = 0; i < n; i++) {
1415 bool last_exc = (i == n - 1);
1416 if (last_exc) {
1417 // The closing frame may be added in a recursive call
1418 ctx->need_close = true;
1419 }
1420
1421 if (_Py_WriteIndent(EXC_INDENT(ctx), f) < 0) {
1422 return -1;
1423 }
1424 bool truncated = (i >= ctx->max_group_width);
1425 PyObject *line;
1426 if (!truncated) {
1427 line = PyUnicode_FromFormat(
1428 "%s+---------------- %zd ----------------\n",
1429 (i == 0) ? "+-" : " ", i + 1);
1430 }
1431 else {
1432 line = PyUnicode_FromFormat(
1433 "%s+---------------- ... ----------------\n",
1434 (i == 0) ? "+-" : " ");
1435 }
1436 if (line == NULL) {
1437 return -1;
1438 }
1439 int err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
1440 Py_DECREF(line);
1441 if (err < 0) {
1442 return -1;
1443 }
1444
1445 ctx->exception_group_depth += 1;
1446 PyObject *exc = PyTuple_GET_ITEM(excs, i);
1447
1448 if (!truncated) {
1449 if (_Py_EnterRecursiveCall(" in print_exception_group") != 0) {
1450 return -1;
1451 }
1452 int res = print_exception_recursive(ctx, exc);
1453 _Py_LeaveRecursiveCall();
1454 if (res < 0) {
1455 return -1;
1456 }
1457 }
1458 else {
1459 Py_ssize_t excs_remaining = num_excs - ctx->max_group_width;
1460
1461 if (write_indented_margin(ctx, f) < 0) {
1462 return -1;
1463 }
1464
1465 PyObject *line = PyUnicode_FromFormat(
1466 "and %zd more exception%s\n",
1467 excs_remaining, excs_remaining > 1 ? "s" : "");
1468
1469 if (line == NULL) {
1470 return -1;
1471 }
1472
1473 int err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
1474 Py_DECREF(line);
1475 if (err < 0) {
1476 return -1;
1477 }
1478 }
1479
1480 if (last_exc && ctx->need_close) {
1481 if (_Py_WriteIndent(EXC_INDENT(ctx), f) < 0) {
1482 return -1;
1483 }
1484 if (PyFile_WriteString(
1485 "+------------------------------------\n", f) < 0) {
1486 return -1;
1487 }
1488 ctx->need_close = false;
1489 }
1490 ctx->exception_group_depth -= 1;
1491 }
1492
1493 if (ctx->exception_group_depth == 1) {
1494 ctx->exception_group_depth -= 1;
1495 }
1496 return 0;
1497 }
1498
1499 static int
print_exception_recursive(struct exception_print_context * ctx,PyObject * value)1500 print_exception_recursive(struct exception_print_context *ctx, PyObject *value)
1501 {
1502 if (ctx->seen != NULL) {
1503 /* Exception chaining */
1504 if (print_exception_cause_and_context(ctx, value) < 0) {
1505 return -1;
1506 }
1507 }
1508 if (!_PyBaseExceptionGroup_Check(value)) {
1509 if (print_exception(ctx, value) < 0) {
1510 return -1;
1511 }
1512 }
1513 else if (print_exception_group(ctx, value) < 0) {
1514 return -1;
1515 }
1516 assert(!PyErr_Occurred());
1517 return 0;
1518 }
1519
1520 #define PyErr_MAX_GROUP_WIDTH 15
1521 #define PyErr_MAX_GROUP_DEPTH 10
1522
1523 void
_PyErr_Display(PyObject * file,PyObject * exception,PyObject * value,PyObject * tb)1524 _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb)
1525 {
1526 assert(file != NULL && file != Py_None);
1527 if (PyExceptionInstance_Check(value)
1528 && tb != NULL && PyTraceBack_Check(tb)) {
1529 /* Put the traceback on the exception, otherwise it won't get
1530 displayed. See issue #18776. */
1531 PyObject *cur_tb = PyException_GetTraceback(value);
1532 if (cur_tb == NULL)
1533 PyException_SetTraceback(value, tb);
1534 else
1535 Py_DECREF(cur_tb);
1536 }
1537
1538 struct exception_print_context ctx;
1539 ctx.file = file;
1540 ctx.exception_group_depth = 0;
1541 ctx.need_close = false;
1542 ctx.max_group_width = PyErr_MAX_GROUP_WIDTH;
1543 ctx.max_group_depth = PyErr_MAX_GROUP_DEPTH;
1544
1545 /* We choose to ignore seen being possibly NULL, and report
1546 at least the main exception (it could be a MemoryError).
1547 */
1548 ctx.seen = PySet_New(NULL);
1549 if (ctx.seen == NULL) {
1550 PyErr_Clear();
1551 }
1552 if (print_exception_recursive(&ctx, value) < 0) {
1553 PyErr_Clear();
1554 _PyObject_Dump(value);
1555 fprintf(stderr, "lost sys.stderr\n");
1556 }
1557 Py_XDECREF(ctx.seen);
1558
1559 /* Call file.flush() */
1560 PyObject *res = _PyObject_CallMethodNoArgs(file, &_Py_ID(flush));
1561 if (!res) {
1562 /* Silently ignore file.flush() error */
1563 PyErr_Clear();
1564 }
1565 else {
1566 Py_DECREF(res);
1567 }
1568 }
1569
1570 void
PyErr_Display(PyObject * exception,PyObject * value,PyObject * tb)1571 PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1572 {
1573 PyThreadState *tstate = _PyThreadState_GET();
1574 PyObject *file = _PySys_GetAttr(tstate, &_Py_ID(stderr));
1575 if (file == NULL) {
1576 _PyObject_Dump(value);
1577 fprintf(stderr, "lost sys.stderr\n");
1578 return;
1579 }
1580 if (file == Py_None) {
1581 return;
1582 }
1583 Py_INCREF(file);
1584 _PyErr_Display(file, exception, value, tb);
1585 Py_DECREF(file);
1586 }
1587
1588 PyObject *
PyRun_StringFlags(const char * str,int start,PyObject * globals,PyObject * locals,PyCompilerFlags * flags)1589 PyRun_StringFlags(const char *str, int start, PyObject *globals,
1590 PyObject *locals, PyCompilerFlags *flags)
1591 {
1592 PyObject *ret = NULL;
1593 mod_ty mod;
1594 PyArena *arena;
1595
1596 arena = _PyArena_New();
1597 if (arena == NULL)
1598 return NULL;
1599
1600 _Py_DECLARE_STR(anon_string, "<string>");
1601 mod = _PyParser_ASTFromString(
1602 str, &_Py_STR(anon_string), start, flags, arena);
1603
1604 if (mod != NULL)
1605 ret = run_mod(mod, &_Py_STR(anon_string), globals, locals, flags, arena);
1606 _PyArena_Free(arena);
1607 return ret;
1608 }
1609
1610
1611 static PyObject *
pyrun_file(FILE * fp,PyObject * filename,int start,PyObject * globals,PyObject * locals,int closeit,PyCompilerFlags * flags)1612 pyrun_file(FILE *fp, PyObject *filename, int start, PyObject *globals,
1613 PyObject *locals, int closeit, PyCompilerFlags *flags)
1614 {
1615 PyArena *arena = _PyArena_New();
1616 if (arena == NULL) {
1617 return NULL;
1618 }
1619
1620 mod_ty mod;
1621 mod = _PyParser_ASTFromFile(fp, filename, NULL, start, NULL, NULL,
1622 flags, NULL, arena);
1623
1624 if (closeit) {
1625 fclose(fp);
1626 }
1627
1628 PyObject *ret;
1629 if (mod != NULL) {
1630 ret = run_mod(mod, filename, globals, locals, flags, arena);
1631 }
1632 else {
1633 ret = NULL;
1634 }
1635 _PyArena_Free(arena);
1636
1637 return ret;
1638 }
1639
1640
1641 PyObject *
PyRun_FileExFlags(FILE * fp,const char * filename,int start,PyObject * globals,PyObject * locals,int closeit,PyCompilerFlags * flags)1642 PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
1643 PyObject *locals, int closeit, PyCompilerFlags *flags)
1644 {
1645 PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename);
1646 if (filename_obj == NULL) {
1647 return NULL;
1648 }
1649
1650 PyObject *res = pyrun_file(fp, filename_obj, start, globals,
1651 locals, closeit, flags);
1652 Py_DECREF(filename_obj);
1653 return res;
1654
1655 }
1656
1657
1658 static void
flush_io(void)1659 flush_io(void)
1660 {
1661 PyObject *f, *r;
1662 PyObject *type, *value, *traceback;
1663
1664 /* Save the current exception */
1665 PyErr_Fetch(&type, &value, &traceback);
1666
1667 PyThreadState *tstate = _PyThreadState_GET();
1668 f = _PySys_GetAttr(tstate, &_Py_ID(stderr));
1669 if (f != NULL) {
1670 r = _PyObject_CallMethodNoArgs(f, &_Py_ID(flush));
1671 if (r)
1672 Py_DECREF(r);
1673 else
1674 PyErr_Clear();
1675 }
1676 f = _PySys_GetAttr(tstate, &_Py_ID(stdout));
1677 if (f != NULL) {
1678 r = _PyObject_CallMethodNoArgs(f, &_Py_ID(flush));
1679 if (r)
1680 Py_DECREF(r);
1681 else
1682 PyErr_Clear();
1683 }
1684
1685 PyErr_Restore(type, value, traceback);
1686 }
1687
1688 static PyObject *
run_eval_code_obj(PyThreadState * tstate,PyCodeObject * co,PyObject * globals,PyObject * locals)1689 run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, PyObject *locals)
1690 {
1691 PyObject *v;
1692 /*
1693 * We explicitly re-initialize _Py_UnhandledKeyboardInterrupt every eval
1694 * _just in case_ someone is calling into an embedded Python where they
1695 * don't care about an uncaught KeyboardInterrupt exception (why didn't they
1696 * leave config.install_signal_handlers set to 0?!?) but then later call
1697 * Py_Main() itself (which _checks_ this flag and dies with a signal after
1698 * its interpreter exits). We don't want a previous embedded interpreter's
1699 * uncaught exception to trigger an unexplained signal exit from a future
1700 * Py_Main() based one.
1701 */
1702 _Py_UnhandledKeyboardInterrupt = 0;
1703
1704 /* Set globals['__builtins__'] if it doesn't exist */
1705 if (globals != NULL && _PyDict_GetItemStringWithError(globals, "__builtins__") == NULL) {
1706 if (PyErr_Occurred() ||
1707 PyDict_SetItemString(globals, "__builtins__",
1708 tstate->interp->builtins) < 0)
1709 {
1710 return NULL;
1711 }
1712 }
1713
1714 v = PyEval_EvalCode((PyObject*)co, globals, locals);
1715 if (!v && _PyErr_Occurred(tstate) == PyExc_KeyboardInterrupt) {
1716 _Py_UnhandledKeyboardInterrupt = 1;
1717 }
1718 return v;
1719 }
1720
1721 static PyObject *
run_mod(mod_ty mod,PyObject * filename,PyObject * globals,PyObject * locals,PyCompilerFlags * flags,PyArena * arena)1722 run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
1723 PyCompilerFlags *flags, PyArena *arena)
1724 {
1725 PyThreadState *tstate = _PyThreadState_GET();
1726 PyCodeObject *co = _PyAST_Compile(mod, filename, flags, -1, arena);
1727 if (co == NULL)
1728 return NULL;
1729
1730 if (_PySys_Audit(tstate, "exec", "O", co) < 0) {
1731 Py_DECREF(co);
1732 return NULL;
1733 }
1734
1735 PyObject *v = run_eval_code_obj(tstate, co, globals, locals);
1736 Py_DECREF(co);
1737 return v;
1738 }
1739
1740 static PyObject *
run_pyc_file(FILE * fp,PyObject * globals,PyObject * locals,PyCompilerFlags * flags)1741 run_pyc_file(FILE *fp, PyObject *globals, PyObject *locals,
1742 PyCompilerFlags *flags)
1743 {
1744 PyThreadState *tstate = _PyThreadState_GET();
1745 PyCodeObject *co;
1746 PyObject *v;
1747 long magic;
1748 long PyImport_GetMagicNumber(void);
1749
1750 magic = PyMarshal_ReadLongFromFile(fp);
1751 if (magic != PyImport_GetMagicNumber()) {
1752 if (!PyErr_Occurred())
1753 PyErr_SetString(PyExc_RuntimeError,
1754 "Bad magic number in .pyc file");
1755 goto error;
1756 }
1757 /* Skip the rest of the header. */
1758 (void) PyMarshal_ReadLongFromFile(fp);
1759 (void) PyMarshal_ReadLongFromFile(fp);
1760 (void) PyMarshal_ReadLongFromFile(fp);
1761 if (PyErr_Occurred()) {
1762 goto error;
1763 }
1764 v = PyMarshal_ReadLastObjectFromFile(fp);
1765 if (v == NULL || !PyCode_Check(v)) {
1766 Py_XDECREF(v);
1767 PyErr_SetString(PyExc_RuntimeError,
1768 "Bad code object in .pyc file");
1769 goto error;
1770 }
1771 fclose(fp);
1772 co = (PyCodeObject *)v;
1773 v = run_eval_code_obj(tstate, co, globals, locals);
1774 if (v && flags)
1775 flags->cf_flags |= (co->co_flags & PyCF_MASK);
1776 Py_DECREF(co);
1777 return v;
1778 error:
1779 fclose(fp);
1780 return NULL;
1781 }
1782
1783 PyObject *
Py_CompileStringObject(const char * str,PyObject * filename,int start,PyCompilerFlags * flags,int optimize)1784 Py_CompileStringObject(const char *str, PyObject *filename, int start,
1785 PyCompilerFlags *flags, int optimize)
1786 {
1787 PyCodeObject *co;
1788 mod_ty mod;
1789 PyArena *arena = _PyArena_New();
1790 if (arena == NULL)
1791 return NULL;
1792
1793 mod = _PyParser_ASTFromString(str, filename, start, flags, arena);
1794 if (mod == NULL) {
1795 _PyArena_Free(arena);
1796 return NULL;
1797 }
1798 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
1799 PyObject *result = PyAST_mod2obj(mod);
1800 _PyArena_Free(arena);
1801 return result;
1802 }
1803 co = _PyAST_Compile(mod, filename, flags, optimize, arena);
1804 _PyArena_Free(arena);
1805 return (PyObject *)co;
1806 }
1807
1808 PyObject *
Py_CompileStringExFlags(const char * str,const char * filename_str,int start,PyCompilerFlags * flags,int optimize)1809 Py_CompileStringExFlags(const char *str, const char *filename_str, int start,
1810 PyCompilerFlags *flags, int optimize)
1811 {
1812 PyObject *filename, *co;
1813 filename = PyUnicode_DecodeFSDefault(filename_str);
1814 if (filename == NULL)
1815 return NULL;
1816 co = Py_CompileStringObject(str, filename, start, flags, optimize);
1817 Py_DECREF(filename);
1818 return co;
1819 }
1820
1821 const char *
_Py_SourceAsString(PyObject * cmd,const char * funcname,const char * what,PyCompilerFlags * cf,PyObject ** cmd_copy)1822 _Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyCompilerFlags *cf, PyObject **cmd_copy)
1823 {
1824 const char *str;
1825 Py_ssize_t size;
1826 Py_buffer view;
1827
1828 *cmd_copy = NULL;
1829 if (PyUnicode_Check(cmd)) {
1830 cf->cf_flags |= PyCF_IGNORE_COOKIE;
1831 str = PyUnicode_AsUTF8AndSize(cmd, &size);
1832 if (str == NULL)
1833 return NULL;
1834 }
1835 else if (PyBytes_Check(cmd)) {
1836 str = PyBytes_AS_STRING(cmd);
1837 size = PyBytes_GET_SIZE(cmd);
1838 }
1839 else if (PyByteArray_Check(cmd)) {
1840 str = PyByteArray_AS_STRING(cmd);
1841 size = PyByteArray_GET_SIZE(cmd);
1842 }
1843 else if (PyObject_GetBuffer(cmd, &view, PyBUF_SIMPLE) == 0) {
1844 /* Copy to NUL-terminated buffer. */
1845 *cmd_copy = PyBytes_FromStringAndSize(
1846 (const char *)view.buf, view.len);
1847 PyBuffer_Release(&view);
1848 if (*cmd_copy == NULL) {
1849 return NULL;
1850 }
1851 str = PyBytes_AS_STRING(*cmd_copy);
1852 size = PyBytes_GET_SIZE(*cmd_copy);
1853 }
1854 else {
1855 PyErr_Format(PyExc_TypeError,
1856 "%s() arg 1 must be a %s object",
1857 funcname, what);
1858 return NULL;
1859 }
1860
1861 if (strlen(str) != (size_t)size) {
1862 PyErr_SetString(PyExc_SyntaxError,
1863 "source code string cannot contain null bytes");
1864 Py_CLEAR(*cmd_copy);
1865 return NULL;
1866 }
1867 return str;
1868 }
1869
1870 #if defined(USE_STACKCHECK)
1871 #if defined(WIN32) && defined(_MSC_VER)
1872
1873 /* Stack checking for Microsoft C */
1874
1875 #include <malloc.h>
1876 #include <excpt.h>
1877
1878 /*
1879 * Return non-zero when we run out of memory on the stack; zero otherwise.
1880 */
1881 int
PyOS_CheckStack(void)1882 PyOS_CheckStack(void)
1883 {
1884 __try {
1885 /* alloca throws a stack overflow exception if there's
1886 not enough space left on the stack */
1887 alloca(PYOS_STACK_MARGIN * sizeof(void*));
1888 return 0;
1889 } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
1890 EXCEPTION_EXECUTE_HANDLER :
1891 EXCEPTION_CONTINUE_SEARCH) {
1892 int errcode = _resetstkoflw();
1893 if (errcode == 0)
1894 {
1895 Py_FatalError("Could not reset the stack!");
1896 }
1897 }
1898 return 1;
1899 }
1900
1901 #endif /* WIN32 && _MSC_VER */
1902
1903 /* Alternate implementations can be added here... */
1904
1905 #endif /* USE_STACKCHECK */
1906
1907 /* Deprecated C API functions still provided for binary compatibility */
1908
1909 #undef PyRun_AnyFile
1910 PyAPI_FUNC(int)
PyRun_AnyFile(FILE * fp,const char * name)1911 PyRun_AnyFile(FILE *fp, const char *name)
1912 {
1913 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
1914 }
1915
1916 #undef PyRun_AnyFileEx
1917 PyAPI_FUNC(int)
PyRun_AnyFileEx(FILE * fp,const char * name,int closeit)1918 PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1919 {
1920 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
1921 }
1922
1923 #undef PyRun_AnyFileFlags
1924 PyAPI_FUNC(int)
PyRun_AnyFileFlags(FILE * fp,const char * name,PyCompilerFlags * flags)1925 PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1926 {
1927 return PyRun_AnyFileExFlags(fp, name, 0, flags);
1928 }
1929
1930 #undef PyRun_File
1931 PyAPI_FUNC(PyObject *)
PyRun_File(FILE * fp,const char * p,int s,PyObject * g,PyObject * l)1932 PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1933 {
1934 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
1935 }
1936
1937 #undef PyRun_FileEx
1938 PyAPI_FUNC(PyObject *)
PyRun_FileEx(FILE * fp,const char * p,int s,PyObject * g,PyObject * l,int c)1939 PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1940 {
1941 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
1942 }
1943
1944 #undef PyRun_FileFlags
1945 PyAPI_FUNC(PyObject *)
PyRun_FileFlags(FILE * fp,const char * p,int s,PyObject * g,PyObject * l,PyCompilerFlags * flags)1946 PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1947 PyCompilerFlags *flags)
1948 {
1949 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
1950 }
1951
1952 #undef PyRun_SimpleFile
1953 PyAPI_FUNC(int)
PyRun_SimpleFile(FILE * f,const char * p)1954 PyRun_SimpleFile(FILE *f, const char *p)
1955 {
1956 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
1957 }
1958
1959 #undef PyRun_SimpleFileEx
1960 PyAPI_FUNC(int)
PyRun_SimpleFileEx(FILE * f,const char * p,int c)1961 PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1962 {
1963 return PyRun_SimpleFileExFlags(f, p, c, NULL);
1964 }
1965
1966
1967 #undef PyRun_String
1968 PyAPI_FUNC(PyObject *)
PyRun_String(const char * str,int s,PyObject * g,PyObject * l)1969 PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1970 {
1971 return PyRun_StringFlags(str, s, g, l, NULL);
1972 }
1973
1974 #undef PyRun_SimpleString
1975 PyAPI_FUNC(int)
PyRun_SimpleString(const char * s)1976 PyRun_SimpleString(const char *s)
1977 {
1978 return PyRun_SimpleStringFlags(s, NULL);
1979 }
1980
1981 #undef Py_CompileString
1982 PyAPI_FUNC(PyObject *)
Py_CompileString(const char * str,const char * p,int s)1983 Py_CompileString(const char *str, const char *p, int s)
1984 {
1985 return Py_CompileStringExFlags(str, p, s, NULL, -1);
1986 }
1987
1988 #undef Py_CompileStringFlags
1989 PyAPI_FUNC(PyObject *)
Py_CompileStringFlags(const char * str,const char * p,int s,PyCompilerFlags * flags)1990 Py_CompileStringFlags(const char *str, const char *p, int s,
1991 PyCompilerFlags *flags)
1992 {
1993 return Py_CompileStringExFlags(str, p, s, flags, -1);
1994 }
1995
1996 #undef PyRun_InteractiveOne
1997 PyAPI_FUNC(int)
PyRun_InteractiveOne(FILE * f,const char * p)1998 PyRun_InteractiveOne(FILE *f, const char *p)
1999 {
2000 return PyRun_InteractiveOneFlags(f, p, NULL);
2001 }
2002
2003 #undef PyRun_InteractiveLoop
2004 PyAPI_FUNC(int)
PyRun_InteractiveLoop(FILE * f,const char * p)2005 PyRun_InteractiveLoop(FILE *f, const char *p)
2006 {
2007 return PyRun_InteractiveLoopFlags(f, p, NULL);
2008 }
2009
2010 #ifdef __cplusplus
2011 }
2012 #endif
2013