blob: 1bf822ceadb483e2fdb30151b48de720b9ffa7cd [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
Eric Snowc7ec9982017-05-23 23:00:52 -07002/* 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 (boostrap,
6 * pythonrun, shutdown)
7 */
8
9/* TODO: Cull includes following phase split */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010
Guido van Rossum82598051997-03-05 00:20:32 +000011#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000012
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "Python-ast.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010014#include "pycore_pystate.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015#include "grammar.h"
16#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +000017#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019#include "errcode.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000020#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000021#include "symtable.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022#include "ast.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000023#include "marshal.h"
Martin v. Löwis790465f2008-04-05 20:41:37 +000024#include "osdefs.h"
Victor Stinner518e6102014-03-18 02:06:38 +010025#include <locale.h>
Guido van Rossum1984f1e1992-08-04 12:41:02 +000026
Thomas Wouters0e3f5912006-08-11 14:57:12 +000027#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000028#include <signal.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000029#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000030
Benjamin Peterson80a50ac2009-01-02 21:24:04 +000031#ifdef MS_WINDOWS
Martin v. Löwis5c88d812009-01-02 20:47:48 +000032#include "malloc.h" /* for alloca */
Benjamin Peterson80a50ac2009-01-02 21:24:04 +000033#endif
Martin v. Löwis5c88d812009-01-02 20:47:48 +000034
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000035#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000036#undef BYTE
37#include "windows.h"
38#endif
39
Victor Stinnerbd303c12013-11-07 23:07:29 +010040_Py_IDENTIFIER(builtins);
Victor Stinner09054372013-11-06 22:41:44 +010041_Py_IDENTIFIER(excepthook);
Victor Stinner3f36a572013-11-12 21:39:02 +010042_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010043_Py_IDENTIFIER(last_traceback);
Victor Stinner09054372013-11-06 22:41:44 +010044_Py_IDENTIFIER(last_type);
45_Py_IDENTIFIER(last_value);
Victor Stinnerbd303c12013-11-07 23:07:29 +010046_Py_IDENTIFIER(ps1);
47_Py_IDENTIFIER(ps2);
48_Py_IDENTIFIER(stdin);
49_Py_IDENTIFIER(stdout);
50_Py_IDENTIFIER(stderr);
Victor Stinnerefa7a0e2013-11-07 12:37:56 +010051_Py_static_string(PyId_string, "<string>");
Victor Stinner09054372013-11-06 22:41:44 +010052
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000053#ifdef __cplusplus
54extern "C" {
Neal Norwitz4281cef2006-03-04 19:58:13 +000055#endif
56
Guido van Rossum82598051997-03-05 00:20:32 +000057extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058
Guido van Rossumb73cc041993-11-01 16:28:59 +000059/* Forward */
Amaury Forgeot d'Arc7fedbe52008-04-10 21:03:09 +000060static void flush_io(void);
Victor Stinner95701bd2013-11-06 18:41:07 +010061static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000063static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static void err_input(perrdetail *);
Victor Stinner7f2fee32011-04-05 00:39:01 +020066static void err_free(perrdetail *);
xdegayee0582a32017-11-12 16:50:48 +010067static int PyRun_InteractiveOneObjectEx(FILE *, PyObject *, PyCompilerFlags *);
Guido van Rossumce3a72a2007-10-19 23:16:50 +000068
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069/* Parse input from a file and execute it */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000070int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000071PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +000073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 if (filename == NULL)
75 filename = "???";
76 if (Py_FdIsInteractive(fp, filename)) {
77 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
78 if (closeit)
79 fclose(fp);
80 return err;
81 }
82 else
83 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084}
85
86int
Victor Stinner95701bd2013-11-06 18:41:07 +010087PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +000088{
Victor Stinner95701bd2013-11-06 18:41:07 +010089 PyObject *filename, *v;
90 int ret, err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyCompilerFlags local_flags;
xdegayee0582a32017-11-12 16:50:48 +010092 int nomem_count = 0;
Victor Stinner25420fe2017-11-20 18:12:22 -080093#ifdef Py_REF_DEBUG
Victor Stinnercaba55b2018-08-03 15:33:52 +020094 int show_ref_count = _PyInterpreterState_Get()->core_config.show_ref_count;
Victor Stinner25420fe2017-11-20 18:12:22 -080095#endif
Jeremy Hylton9f324e92001-03-01 22:59:14 +000096
Victor Stinner95701bd2013-11-06 18:41:07 +010097 filename = PyUnicode_DecodeFSDefault(filename_str);
98 if (filename == NULL) {
99 PyErr_Print();
100 return -1;
101 }
102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 if (flags == NULL) {
104 flags = &local_flags;
105 local_flags.cf_flags = 0;
106 }
Victor Stinner09054372013-11-06 22:41:44 +0100107 v = _PySys_GetObjectId(&PyId_ps1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (v == NULL) {
Victor Stinner09054372013-11-06 22:41:44 +0100109 _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> "));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 Py_XDECREF(v);
111 }
Victor Stinner09054372013-11-06 22:41:44 +0100112 v = _PySys_GetObjectId(&PyId_ps2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 if (v == NULL) {
Victor Stinner09054372013-11-06 22:41:44 +0100114 _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... "));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 Py_XDECREF(v);
116 }
xdegayee0582a32017-11-12 16:50:48 +0100117 err = 0;
118 do {
119 ret = PyRun_InteractiveOneObjectEx(fp, filename, flags);
120 if (ret == -1 && PyErr_Occurred()) {
121 /* Prevent an endless loop after multiple consecutive MemoryErrors
122 * while still allowing an interactive command to fail with a
123 * MemoryError. */
124 if (PyErr_ExceptionMatches(PyExc_MemoryError)) {
125 if (++nomem_count > 16) {
126 PyErr_Clear();
127 err = -1;
128 break;
129 }
130 } else {
131 nomem_count = 0;
132 }
133 PyErr_Print();
134 flush_io();
135 } else {
136 nomem_count = 0;
137 }
Eric Snowdae02762017-09-14 00:35:58 -0700138#ifdef Py_REF_DEBUG
Victor Stinner25420fe2017-11-20 18:12:22 -0800139 if (show_ref_count) {
Eric Snowdae02762017-09-14 00:35:58 -0700140 _PyDebug_PrintTotalRefs();
Victor Stinner25420fe2017-11-20 18:12:22 -0800141 }
Eric Snowdae02762017-09-14 00:35:58 -0700142#endif
xdegayee0582a32017-11-12 16:50:48 +0100143 } while (ret != E_EOF);
Victor Stinner95701bd2013-11-06 18:41:07 +0100144 Py_DECREF(filename);
145 return err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146}
147
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000148/* compute parser flags based on compiler flags */
Benjamin Petersonf5b52242009-03-02 23:31:26 +0000149static int PARSER_FLAGS(PyCompilerFlags *flags)
150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 int parser_flags = 0;
152 if (!flags)
153 return 0;
154 if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT)
155 parser_flags |= PyPARSE_DONT_IMPLY_DEDENT;
156 if (flags->cf_flags & PyCF_IGNORE_COOKIE)
157 parser_flags |= PyPARSE_IGNORE_COOKIE;
158 if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL)
159 parser_flags |= PyPARSE_BARRY_AS_BDFL;
160 return parser_flags;
Benjamin Petersonf5b52242009-03-02 23:31:26 +0000161}
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000162
Thomas Wouters89f507f2006-12-13 04:49:30 +0000163#if 0
164/* Keep an example of flags with future keyword support. */
165#define PARSER_FLAGS(flags) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
167 PyPARSE_DONT_IMPLY_DEDENT : 0) \
168 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
169 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000170#endif
171
xdegayee0582a32017-11-12 16:50:48 +0100172/* A PyRun_InteractiveOneObject() auxiliary function that does not print the
173 * error on failure. */
174static int
175PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename,
176 PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000177{
Victor Stinner95701bd2013-11-06 18:41:07 +0100178 PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 mod_ty mod;
180 PyArena *arena;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200181 const char *ps1 = "", *ps2 = "", *enc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 int errcode = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200183 _Py_IDENTIFIER(encoding);
Victor Stinner95701bd2013-11-06 18:41:07 +0100184 _Py_IDENTIFIER(__main__);
185
186 mod_name = _PyUnicode_FromId(&PyId___main__); /* borrowed */
187 if (mod_name == NULL) {
Victor Stinner95701bd2013-11-06 18:41:07 +0100188 return -1;
189 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 if (fp == stdin) {
Benjamin Petersonfe1b22a2013-04-29 10:23:08 -0400192 /* Fetch encoding from sys.stdin if possible. */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100193 v = _PySys_GetObjectId(&PyId_stdin);
Benjamin Petersonfe1b22a2013-04-29 10:23:08 -0400194 if (v && v != Py_None) {
195 oenc = _PyObject_GetAttrId(v, &PyId_encoding);
196 if (oenc)
Serhiy Storchaka06515832016-11-20 09:13:07 +0200197 enc = PyUnicode_AsUTF8(oenc);
Benjamin Petersonfe1b22a2013-04-29 10:23:08 -0400198 if (!enc)
199 PyErr_Clear();
200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 }
Victor Stinner09054372013-11-06 22:41:44 +0100202 v = _PySys_GetObjectId(&PyId_ps1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 if (v != NULL) {
204 v = PyObject_Str(v);
205 if (v == NULL)
206 PyErr_Clear();
Victor Stinner386fe712010-05-19 00:34:15 +0000207 else if (PyUnicode_Check(v)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200208 ps1 = PyUnicode_AsUTF8(v);
Victor Stinner386fe712010-05-19 00:34:15 +0000209 if (ps1 == NULL) {
210 PyErr_Clear();
211 ps1 = "";
212 }
213 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 }
Victor Stinner09054372013-11-06 22:41:44 +0100215 w = _PySys_GetObjectId(&PyId_ps2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 if (w != NULL) {
217 w = PyObject_Str(w);
218 if (w == NULL)
219 PyErr_Clear();
Victor Stinner386fe712010-05-19 00:34:15 +0000220 else if (PyUnicode_Check(w)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200221 ps2 = PyUnicode_AsUTF8(w);
Victor Stinner386fe712010-05-19 00:34:15 +0000222 if (ps2 == NULL) {
223 PyErr_Clear();
224 ps2 = "";
225 }
226 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 }
228 arena = PyArena_New();
229 if (arena == NULL) {
230 Py_XDECREF(v);
231 Py_XDECREF(w);
232 Py_XDECREF(oenc);
233 return -1;
234 }
Victor Stinner95701bd2013-11-06 18:41:07 +0100235 mod = PyParser_ASTFromFileObject(fp, filename, enc,
236 Py_single_input, ps1, ps2,
237 flags, &errcode, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 Py_XDECREF(v);
239 Py_XDECREF(w);
240 Py_XDECREF(oenc);
241 if (mod == NULL) {
242 PyArena_Free(arena);
243 if (errcode == E_EOF) {
244 PyErr_Clear();
245 return E_EOF;
246 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 return -1;
248 }
Victor Stinner95701bd2013-11-06 18:41:07 +0100249 m = PyImport_AddModuleObject(mod_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (m == NULL) {
251 PyArena_Free(arena);
252 return -1;
253 }
254 d = PyModule_GetDict(m);
255 v = run_mod(mod, filename, d, d, flags, arena);
256 PyArena_Free(arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 return -1;
259 }
260 Py_DECREF(v);
Antoine Pitrou9845c7e2014-05-11 13:42:17 +0200261 flush_io();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263}
264
Victor Stinner95701bd2013-11-06 18:41:07 +0100265int
xdegayee0582a32017-11-12 16:50:48 +0100266PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
267{
268 int res;
269
270 res = PyRun_InteractiveOneObjectEx(fp, filename, flags);
271 if (res == -1) {
272 PyErr_Print();
273 flush_io();
274 }
275 return res;
276}
277
278int
Victor Stinner95701bd2013-11-06 18:41:07 +0100279PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
280{
281 PyObject *filename;
282 int res;
283
284 filename = PyUnicode_DecodeFSDefault(filename_str);
285 if (filename == NULL) {
286 PyErr_Print();
287 return -1;
288 }
289 res = PyRun_InteractiveOneObject(fp, filename, flags);
290 Py_DECREF(filename);
291 return res;
292}
293
294
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000295/* Check whether a file maybe a pyc file: Look at the extension,
296 the file type, and, if we may close it, at the first few bytes. */
297
298static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000299maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000300{
Brett Cannonf299abd2015-04-13 14:21:02 -0400301 if (strcmp(ext, ".pyc") == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 return 1;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 /* Only look into the file if we are allowed to close it, since
305 it then should also be seekable. */
306 if (closeit) {
307 /* Read only two bytes of the magic. If the file was opened in
308 text mode, the bytes 3 and 4 of the magic (\r\n) might not
309 be read as they are on disk. */
310 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
311 unsigned char buf[2];
312 /* Mess: In case of -x, the stream is NOT at its start now,
313 and ungetc() was used to push back the first newline,
314 which makes the current stream position formally undefined,
315 and a x-platform nightmare.
316 Unfortunately, we have no direct way to know whether -x
317 was specified. So we use a terrible hack: if the current
318 stream position is not 0, we assume -x was specified, and
319 give up. Bug 132850 on SourceForge spells out the
320 hopelessness of trying anything else (fseek and ftell
321 don't work predictably x-platform for text-mode files).
322 */
323 int ispyc = 0;
324 if (ftell(fp) == 0) {
325 if (fread(buf, 1, 2, fp) == 2 &&
326 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
327 ispyc = 1;
328 rewind(fp);
329 }
330 return ispyc;
331 }
332 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000333}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000334
Antoine Pitrou32d483c2013-07-30 21:01:23 +0200335static int
336set_main_loader(PyObject *d, const char *filename, const char *loader_name)
Nick Coghlan85e729e2012-07-15 18:09:52 +1000337{
Eric Snow32439d62015-05-02 19:15:18 -0600338 PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader;
Nick Coghlanb7a58942012-07-15 23:21:08 +1000339 int result = 0;
Andrew Svetlov90c0eb22012-11-01 14:51:14 +0200340
341 filename_obj = PyUnicode_DecodeFSDefault(filename);
342 if (filename_obj == NULL)
343 return -1;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200344 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow32439d62015-05-02 19:15:18 -0600345 bootstrap = PyObject_GetAttrString(interp->importlib,
346 "_bootstrap_external");
347 if (bootstrap != NULL) {
348 loader_type = PyObject_GetAttrString(bootstrap, loader_name);
349 Py_DECREF(bootstrap);
350 }
Nick Coghlan3f94cbf2012-07-15 19:10:39 +1000351 if (loader_type == NULL) {
Andrew Svetlov90c0eb22012-11-01 14:51:14 +0200352 Py_DECREF(filename_obj);
Nick Coghlan3f94cbf2012-07-15 19:10:39 +1000353 return -1;
354 }
Andrew Svetlov90c0eb22012-11-01 14:51:14 +0200355 loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj);
Nick Coghlanb7a58942012-07-15 23:21:08 +1000356 Py_DECREF(loader_type);
357 if (loader == NULL) {
Nick Coghlan85e729e2012-07-15 18:09:52 +1000358 return -1;
359 }
Nick Coghlanb7a58942012-07-15 23:21:08 +1000360 if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
361 result = -1;
362 }
Nick Coghlan85e729e2012-07-15 18:09:52 +1000363 Py_DECREF(loader);
Nick Coghlanb7a58942012-07-15 23:21:08 +1000364 return result;
Nick Coghlan85e729e2012-07-15 18:09:52 +1000365}
366
367int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000368PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 PyObject *m, *d, *v;
372 const char *ext;
Hynek Schlawack5c6b3e22012-11-07 09:02:24 +0100373 int set_file_name = 0, ret = -1;
Victor Stinner0fcab4a2011-01-04 12:59:15 +0000374 size_t len;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 m = PyImport_AddModule("__main__");
377 if (m == NULL)
378 return -1;
Hynek Schlawack5c6b3e22012-11-07 09:02:24 +0100379 Py_INCREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 d = PyModule_GetDict(m);
381 if (PyDict_GetItemString(d, "__file__") == NULL) {
382 PyObject *f;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000383 f = PyUnicode_DecodeFSDefault(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (f == NULL)
Hynek Schlawack5c6b3e22012-11-07 09:02:24 +0100385 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 if (PyDict_SetItemString(d, "__file__", f) < 0) {
387 Py_DECREF(f);
Hynek Schlawack5c6b3e22012-11-07 09:02:24 +0100388 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 }
Barry Warsaw916048d2011-09-20 14:45:44 -0400390 if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) {
391 Py_DECREF(f);
Hynek Schlawack5c6b3e22012-11-07 09:02:24 +0100392 goto done;
Barry Warsaw916048d2011-09-20 14:45:44 -0400393 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 set_file_name = 1;
395 Py_DECREF(f);
396 }
397 len = strlen(filename);
398 ext = filename + len - (len > 4 ? 4 : 0);
399 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Christian Heimes04ac4c12012-09-11 15:47:28 +0200400 FILE *pyc_fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 /* Try to run a pyc file. First, re-open in binary */
402 if (closeit)
403 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200404 if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 fprintf(stderr, "python: Can't reopen .pyc file\n");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 goto done;
407 }
Nick Coghlan85e729e2012-07-15 18:09:52 +1000408
409 if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
410 fprintf(stderr, "python: failed to set __main__.__loader__\n");
411 ret = -1;
Christian Heimes04ac4c12012-09-11 15:47:28 +0200412 fclose(pyc_fp);
Nick Coghlan85e729e2012-07-15 18:09:52 +1000413 goto done;
414 }
Christian Heimes04ac4c12012-09-11 15:47:28 +0200415 v = run_pyc_file(pyc_fp, filename, d, d, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 } else {
Nick Coghlan85e729e2012-07-15 18:09:52 +1000417 /* When running from stdin, leave __main__.__loader__ alone */
418 if (strcmp(filename, "<stdin>") != 0 &&
419 set_main_loader(d, filename, "SourceFileLoader") < 0) {
420 fprintf(stderr, "python: failed to set __main__.__loader__\n");
421 ret = -1;
422 goto done;
423 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
425 closeit, flags);
426 }
427 flush_io();
428 if (v == NULL) {
Zackery Spytzd8cba5d2018-07-03 13:47:22 -0600429 Py_CLEAR(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 goto done;
432 }
433 Py_DECREF(v);
434 ret = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000435 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 if (set_file_name && PyDict_DelItemString(d, "__file__"))
437 PyErr_Clear();
Zackery Spytzd8cba5d2018-07-03 13:47:22 -0600438 Py_XDECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 return ret;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440}
441
442int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000443PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 PyObject *m, *d, *v;
446 m = PyImport_AddModule("__main__");
447 if (m == NULL)
448 return -1;
449 d = PyModule_GetDict(m);
450 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
451 if (v == NULL) {
452 PyErr_Print();
453 return -1;
454 }
455 Py_DECREF(v);
456 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457}
458
Barry Warsaw035574d1997-08-29 22:07:17 +0000459static int
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100460parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
461 int *lineno, int *offset, PyObject **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000462{
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300463 int hold;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyObject *v;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200465 _Py_IDENTIFIER(msg);
466 _Py_IDENTIFIER(filename);
467 _Py_IDENTIFIER(lineno);
468 _Py_IDENTIFIER(offset);
469 _Py_IDENTIFIER(text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000470
Benjamin Peterson80d50422012-04-03 00:30:38 -0400471 *message = NULL;
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100472 *filename = NULL;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 /* new style errors. `err' is an instance */
Benjamin Peterson0a9a6362012-04-03 00:35:36 -0400475 *message = _PyObject_GetAttrId(err, &PyId_msg);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400476 if (!*message)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 goto finally;
Barry Warsaw035574d1997-08-29 22:07:17 +0000478
Benjamin Peterson0a9a6362012-04-03 00:35:36 -0400479 v = _PyObject_GetAttrId(err, &PyId_filename);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400480 if (!v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 goto finally;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400482 if (v == Py_None) {
483 Py_DECREF(v);
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100484 *filename = _PyUnicode_FromId(&PyId_string);
485 if (*filename == NULL)
486 goto finally;
487 Py_INCREF(*filename);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400488 }
489 else {
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100490 *filename = v;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400491 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000492
Benjamin Peterson0a9a6362012-04-03 00:35:36 -0400493 v = _PyObject_GetAttrId(err, &PyId_lineno);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400494 if (!v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 goto finally;
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300496 hold = _PyLong_AsInt(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 if (hold < 0 && PyErr_Occurred())
499 goto finally;
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300500 *lineno = hold;
Barry Warsaw035574d1997-08-29 22:07:17 +0000501
Benjamin Peterson0a9a6362012-04-03 00:35:36 -0400502 v = _PyObject_GetAttrId(err, &PyId_offset);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400503 if (!v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 goto finally;
505 if (v == Py_None) {
506 *offset = -1;
507 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 } else {
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300509 hold = _PyLong_AsInt(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (hold < 0 && PyErr_Occurred())
512 goto finally;
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300513 *offset = hold;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000515
Benjamin Peterson0a9a6362012-04-03 00:35:36 -0400516 v = _PyObject_GetAttrId(err, &PyId_text);
Benjamin Peterson80d50422012-04-03 00:30:38 -0400517 if (!v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 goto finally;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400519 if (v == Py_None) {
520 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 *text = NULL;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400522 }
523 else {
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100524 *text = v;
Benjamin Peterson80d50422012-04-03 00:30:38 -0400525 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return 1;
Barry Warsaw035574d1997-08-29 22:07:17 +0000527
528finally:
Benjamin Peterson80d50422012-04-03 00:30:38 -0400529 Py_XDECREF(*message);
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100530 Py_XDECREF(*filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 return 0;
Barry Warsaw035574d1997-08-29 22:07:17 +0000532}
533
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000535PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 PyErr_PrintEx(1);
Guido van Rossuma61691e1998-02-06 22:27:24 +0000538}
539
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000540static void
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100541print_error_text(PyObject *f, int offset, PyObject *text_obj)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000542{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200543 const char *text;
544 const char *nl;
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100545
Serhiy Storchaka06515832016-11-20 09:13:07 +0200546 text = PyUnicode_AsUTF8(text_obj);
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100547 if (text == NULL)
548 return;
549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 if (offset >= 0) {
Victor Stinner98ea54c2014-08-15 23:30:40 +0200551 if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n')
Benjamin Petersona95e9772010-10-29 03:28:14 +0000552 offset--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 for (;;) {
554 nl = strchr(text, '\n');
555 if (nl == NULL || nl-text >= offset)
556 break;
557 offset -= (int)(nl+1-text);
558 text = nl+1;
559 }
Martin Panterca3263c2016-12-11 00:18:36 +0000560 while (*text == ' ' || *text == '\t' || *text == '\f') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 text++;
562 offset--;
563 }
564 }
565 PyFile_WriteString(" ", f);
566 PyFile_WriteString(text, f);
567 if (*text == '\0' || text[strlen(text)-1] != '\n')
568 PyFile_WriteString("\n", f);
569 if (offset == -1)
570 return;
571 PyFile_WriteString(" ", f);
Benjamin Petersona95e9772010-10-29 03:28:14 +0000572 while (--offset > 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyFile_WriteString(" ", f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyFile_WriteString("^\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000575}
576
Guido van Rossum66e8e862001-03-23 17:54:43 +0000577static void
578handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 PyObject *exception, *value, *tb;
581 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 if (Py_InspectFlag)
584 /* Don't exit if -i flag was given. This flag is set to 0
585 * when entering interactive mode for inspecting. */
586 return;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 PyErr_Fetch(&exception, &value, &tb);
589 fflush(stdout);
590 if (value == NULL || value == Py_None)
591 goto done;
592 if (PyExceptionInstance_Check(value)) {
593 /* The error code should be in the `code' attribute. */
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200594 _Py_IDENTIFIER(code);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200595 PyObject *code = _PyObject_GetAttrId(value, &PyId_code);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 if (code) {
597 Py_DECREF(value);
598 value = code;
599 if (value == Py_None)
600 goto done;
601 }
602 /* If we failed to dig out the 'code' attribute,
603 just let the else clause below print the error. */
604 }
605 if (PyLong_Check(value))
606 exitcode = (int)PyLong_AsLong(value);
607 else {
Victor Stinnerbd303c12013-11-07 23:07:29 +0100608 PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr);
Nick Coghland979e432014-02-09 10:43:21 +1000609 /* We clear the exception here to avoid triggering the assertion
610 * in PyObject_Str that ensures it won't silently lose exception
611 * details.
612 */
613 PyErr_Clear();
Victor Stinner7126dbc2010-05-21 23:45:42 +0000614 if (sys_stderr != NULL && sys_stderr != Py_None) {
615 PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
616 } else {
617 PyObject_Print(value, stderr, Py_PRINT_RAW);
618 fflush(stderr);
619 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 PySys_WriteStderr("\n");
621 exitcode = 1;
622 }
Tim Peterscf615b52003-04-19 18:47:02 +0000623 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* Restore and clear the exception info, in order to properly decref
625 * the exception, value, and traceback. If we just exit instead,
626 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
627 * some finalizers from running.
628 */
629 PyErr_Restore(exception, value, tb);
630 PyErr_Clear();
631 Py_Exit(exitcode);
632 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000633}
634
635void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000636PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
641 handle_system_exit();
642 }
643 PyErr_Fetch(&exception, &v, &tb);
644 if (exception == NULL)
645 return;
646 PyErr_NormalizeException(&exception, &v, &tb);
647 if (tb == NULL) {
648 tb = Py_None;
649 Py_INCREF(tb);
650 }
651 PyException_SetTraceback(v, tb);
652 if (exception == NULL)
653 return;
654 /* Now we know v != NULL too */
655 if (set_sys_last_vars) {
xdegaye66caacf2017-10-23 18:08:41 +0200656 if (_PySys_SetObjectId(&PyId_last_type, exception) < 0) {
657 PyErr_Clear();
658 }
659 if (_PySys_SetObjectId(&PyId_last_value, v) < 0) {
660 PyErr_Clear();
661 }
662 if (_PySys_SetObjectId(&PyId_last_traceback, tb) < 0) {
663 PyErr_Clear();
664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 }
Victor Stinner09054372013-11-06 22:41:44 +0100666 hook = _PySys_GetObjectId(&PyId_excepthook);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 if (hook) {
Victor Stinner71cb64a2016-08-20 00:57:43 +0200668 PyObject* stack[3];
669 PyObject *result;
670
671 stack[0] = exception;
672 stack[1] = v;
673 stack[2] = tb;
Victor Stinner559bb6a2016-08-22 22:48:54 +0200674 result = _PyObject_FastCall(hook, stack, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 if (result == NULL) {
676 PyObject *exception2, *v2, *tb2;
677 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
678 handle_system_exit();
679 }
680 PyErr_Fetch(&exception2, &v2, &tb2);
681 PyErr_NormalizeException(&exception2, &v2, &tb2);
682 /* It should not be possible for exception2 or v2
683 to be NULL. However PyErr_Display() can't
684 tolerate NULLs, so just be safe. */
685 if (exception2 == NULL) {
686 exception2 = Py_None;
687 Py_INCREF(exception2);
688 }
689 if (v2 == NULL) {
690 v2 = Py_None;
691 Py_INCREF(v2);
692 }
693 fflush(stdout);
694 PySys_WriteStderr("Error in sys.excepthook:\n");
695 PyErr_Display(exception2, v2, tb2);
696 PySys_WriteStderr("\nOriginal exception was:\n");
697 PyErr_Display(exception, v, tb);
698 Py_DECREF(exception2);
699 Py_DECREF(v2);
700 Py_XDECREF(tb2);
701 }
702 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 } else {
704 PySys_WriteStderr("sys.excepthook is missing\n");
705 PyErr_Display(exception, v, tb);
706 }
707 Py_XDECREF(exception);
708 Py_XDECREF(v);
709 Py_XDECREF(tb);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000710}
711
Benjamin Petersone6528212008-07-15 15:32:09 +0000712static void
713print_exception(PyObject *f, PyObject *value)
714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 int err = 0;
716 PyObject *type, *tb;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200717 _Py_IDENTIFIER(print_file_and_line);
Benjamin Petersone6528212008-07-15 15:32:09 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 if (!PyExceptionInstance_Check(value)) {
Victor Stinner52ce3b02013-12-09 02:10:08 +0100720 err = PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
721 err += PyFile_WriteString(Py_TYPE(value)->tp_name, f);
722 err += PyFile_WriteString(" found\n", f);
723 if (err)
724 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return;
726 }
Benjamin Peterson26582602008-08-23 20:08:07 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 Py_INCREF(value);
729 fflush(stdout);
730 type = (PyObject *) Py_TYPE(value);
731 tb = PyException_GetTraceback(value);
732 if (tb && tb != Py_None)
733 err = PyTraceBack_Print(tb, f);
734 if (err == 0 &&
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200735 _PyObject_HasAttrId(value, &PyId_print_file_and_line))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 {
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100737 PyObject *message, *filename, *text;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 int lineno, offset;
739 if (!parse_syntax_error(value, &message, &filename,
740 &lineno, &offset, &text))
741 PyErr_Clear();
742 else {
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100743 PyObject *line;
744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 Py_DECREF(value);
746 value = message;
Victor Stinnerefa7a0e2013-11-07 12:37:56 +0100747
748 line = PyUnicode_FromFormat(" File \"%U\", line %d\n",
749 filename, lineno);
750 Py_DECREF(filename);
751 if (line != NULL) {
752 PyFile_WriteObject(line, f, Py_PRINT_RAW);
753 Py_DECREF(line);
754 }
755
756 if (text != NULL) {
757 print_error_text(f, offset, text);
758 Py_DECREF(text);
759 }
760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 /* Can't be bothered to check all those
762 PyFile_WriteString() calls */
763 if (PyErr_Occurred())
764 err = -1;
765 }
766 }
767 if (err) {
768 /* Don't do anything else */
769 }
770 else {
771 PyObject* moduleName;
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300772 const char *className;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200773 _Py_IDENTIFIER(__module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 assert(PyExceptionClass_Check(type));
775 className = PyExceptionClass_Name(type);
776 if (className != NULL) {
Serhiy Storchakaceeef102018-06-15 11:09:43 +0300777 const char *dot = strrchr(className, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 if (dot != NULL)
779 className = dot+1;
780 }
Benjamin Petersone6528212008-07-15 15:32:09 +0000781
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200782 moduleName = _PyObject_GetAttrId(type, &PyId___module__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 if (moduleName == NULL || !PyUnicode_Check(moduleName))
784 {
Victor Stinner13b21bd2011-05-26 14:25:13 +0200785 Py_XDECREF(moduleName);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 err = PyFile_WriteString("<unknown>", f);
787 }
788 else {
Serhiy Storchakaf5894dd2016-11-16 15:40:39 +0200789 if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 {
Victor Stinner937114f2013-11-07 00:12:30 +0100791 err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 err += PyFile_WriteString(".", f);
793 }
794 Py_DECREF(moduleName);
795 }
796 if (err == 0) {
797 if (className == NULL)
798 err = PyFile_WriteString("<unknown>", f);
799 else
800 err = PyFile_WriteString(className, f);
801 }
802 }
803 if (err == 0 && (value != Py_None)) {
804 PyObject *s = PyObject_Str(value);
805 /* only print colon if the str() of the
806 object is not the empty string
807 */
Martin Panter3263f682016-02-28 03:16:11 +0000808 if (s == NULL) {
809 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 err = -1;
Martin Panter3263f682016-02-28 03:16:11 +0000811 PyFile_WriteString(": <exception str() failed>", f);
812 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 else if (!PyUnicode_Check(s) ||
Victor Stinnere251d6d2011-11-20 19:20:00 +0100814 PyUnicode_GetLength(s) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 err = PyFile_WriteString(": ", f);
816 if (err == 0)
817 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
818 Py_XDECREF(s);
819 }
820 /* try to write a newline in any case */
Martin Panter3263f682016-02-28 03:16:11 +0000821 if (err < 0) {
822 PyErr_Clear();
823 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 err += PyFile_WriteString("\n", f);
825 Py_XDECREF(tb);
826 Py_DECREF(value);
827 /* If an error happened here, don't show it.
828 XXX This is wrong, but too many callers rely on this behavior. */
829 if (err != 0)
830 PyErr_Clear();
Benjamin Petersone6528212008-07-15 15:32:09 +0000831}
832
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200833static const char cause_message[] =
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 "\nThe above exception was the direct cause "
835 "of the following exception:\n\n";
Benjamin Petersone6528212008-07-15 15:32:09 +0000836
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200837static const char context_message[] =
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 "\nDuring handling of the above exception, "
839 "another exception occurred:\n\n";
Benjamin Petersone6528212008-07-15 15:32:09 +0000840
841static void
842print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 int err = 0, res;
845 PyObject *cause, *context;
Benjamin Petersone6528212008-07-15 15:32:09 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 if (seen != NULL) {
848 /* Exception chaining */
Zane Bitterde860732017-10-17 17:29:39 -0400849 PyObject *value_id = PyLong_FromVoidPtr(value);
850 if (value_id == NULL || PySet_Add(seen, value_id) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 PyErr_Clear();
852 else if (PyExceptionInstance_Check(value)) {
Zane Bitterde860732017-10-17 17:29:39 -0400853 PyObject *check_id = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 cause = PyException_GetCause(value);
855 context = PyException_GetContext(value);
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700856 if (cause) {
Zane Bitterde860732017-10-17 17:29:39 -0400857 check_id = PyLong_FromVoidPtr(cause);
858 if (check_id == NULL) {
859 res = -1;
860 } else {
861 res = PySet_Contains(seen, check_id);
862 Py_DECREF(check_id);
863 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 if (res == -1)
865 PyErr_Clear();
866 if (res == 0) {
867 print_exception_recursive(
868 f, cause, seen);
869 err |= PyFile_WriteString(
870 cause_message, f);
871 }
872 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700873 else if (context &&
874 !((PyBaseExceptionObject *)value)->suppress_context) {
Zane Bitterde860732017-10-17 17:29:39 -0400875 check_id = PyLong_FromVoidPtr(context);
876 if (check_id == NULL) {
877 res = -1;
878 } else {
879 res = PySet_Contains(seen, check_id);
880 Py_DECREF(check_id);
881 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 if (res == -1)
883 PyErr_Clear();
884 if (res == 0) {
885 print_exception_recursive(
886 f, context, seen);
887 err |= PyFile_WriteString(
888 context_message, f);
889 }
890 }
891 Py_XDECREF(context);
892 Py_XDECREF(cause);
893 }
Zane Bitterde860732017-10-17 17:29:39 -0400894 Py_XDECREF(value_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 }
896 print_exception(f, value);
897 if (err != 0)
898 PyErr_Clear();
Benjamin Petersone6528212008-07-15 15:32:09 +0000899}
900
Thomas Wouters477c8d52006-05-27 19:21:47 +0000901void
902PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 PyObject *seen;
Victor Stinnerbd303c12013-11-07 23:07:29 +0100905 PyObject *f = _PySys_GetObjectId(&PyId_stderr);
Antoine Pitrou24201d42013-10-13 21:53:13 +0200906 if (PyExceptionInstance_Check(value)
907 && tb != NULL && PyTraceBack_Check(tb)) {
908 /* Put the traceback on the exception, otherwise it won't get
909 displayed. See issue #18776. */
910 PyObject *cur_tb = PyException_GetTraceback(value);
911 if (cur_tb == NULL)
912 PyException_SetTraceback(value, tb);
913 else
914 Py_DECREF(cur_tb);
915 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 if (f == Py_None) {
917 /* pass */
918 }
919 else if (f == NULL) {
920 _PyObject_Dump(value);
921 fprintf(stderr, "lost sys.stderr\n");
922 }
923 else {
924 /* We choose to ignore seen being possibly NULL, and report
925 at least the main exception (it could be a MemoryError).
926 */
927 seen = PySet_New(NULL);
928 if (seen == NULL)
929 PyErr_Clear();
930 print_exception_recursive(f, value, seen);
931 Py_XDECREF(seen);
932 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000933}
934
Guido van Rossum82598051997-03-05 00:20:32 +0000935PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000936PyRun_StringFlags(const char *str, int start, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 PyObject *ret = NULL;
940 mod_ty mod;
Victor Stinner95701bd2013-11-06 18:41:07 +0100941 PyArena *arena;
Victor Stinner95701bd2013-11-06 18:41:07 +0100942 PyObject *filename;
943
944 filename = _PyUnicode_FromId(&PyId_string); /* borrowed */
945 if (filename == NULL)
946 return NULL;
947
948 arena = PyArena_New();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 if (arena == NULL)
950 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000951
Victor Stinner95701bd2013-11-06 18:41:07 +0100952 mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 if (mod != NULL)
Victor Stinner95701bd2013-11-06 18:41:07 +0100954 ret = run_mod(mod, filename, globals, locals, flags, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 PyArena_Free(arena);
956 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000957}
958
959PyObject *
Victor Stinner95701bd2013-11-06 18:41:07 +0100960PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 PyObject *locals, int closeit, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000962{
Victor Stinner95701bd2013-11-06 18:41:07 +0100963 PyObject *ret = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 mod_ty mod;
Victor Stinner95701bd2013-11-06 18:41:07 +0100965 PyArena *arena = NULL;
966 PyObject *filename;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000967
Victor Stinner95701bd2013-11-06 18:41:07 +0100968 filename = PyUnicode_DecodeFSDefault(filename_str);
969 if (filename == NULL)
970 goto exit;
971
972 arena = PyArena_New();
973 if (arena == NULL)
974 goto exit;
975
976 mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0,
977 flags, NULL, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 if (closeit)
979 fclose(fp);
980 if (mod == NULL) {
Victor Stinner95701bd2013-11-06 18:41:07 +0100981 goto exit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 }
983 ret = run_mod(mod, filename, globals, locals, flags, arena);
Victor Stinner95701bd2013-11-06 18:41:07 +0100984
985exit:
986 Py_XDECREF(filename);
987 if (arena != NULL)
988 PyArena_Free(arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000990}
991
Guido van Rossum6c193fa2007-12-05 05:14:58 +0000992static void
993flush_io(void)
994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 PyObject *f, *r;
996 PyObject *type, *value, *traceback;
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 /* Save the current exception */
999 PyErr_Fetch(&type, &value, &traceback);
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001000
Victor Stinnerbd303c12013-11-07 23:07:29 +01001001 f = _PySys_GetObjectId(&PyId_stderr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 if (f != NULL) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001003 r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 if (r)
1005 Py_DECREF(r);
1006 else
1007 PyErr_Clear();
1008 }
Victor Stinnerbd303c12013-11-07 23:07:29 +01001009 f = _PySys_GetObjectId(&PyId_stdout);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 if (f != NULL) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001011 r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 if (r)
1013 Py_DECREF(r);
1014 else
1015 PyErr_Clear();
1016 }
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyErr_Restore(type, value, traceback);
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001019}
1020
Guido van Rossum82598051997-03-05 00:20:32 +00001021static PyObject *
Victor Stinner95701bd2013-11-06 18:41:07 +01001022run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
1023 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 PyCodeObject *co;
1026 PyObject *v;
Victor Stinner95701bd2013-11-06 18:41:07 +01001027 co = PyAST_CompileObject(mod, filename, flags, -1, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 if (co == NULL)
1029 return NULL;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001030 v = PyEval_EvalCode((PyObject*)co, globals, locals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 Py_DECREF(co);
1032 return v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001033}
1034
Guido van Rossum82598051997-03-05 00:20:32 +00001035static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001036run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyCodeObject *co;
1040 PyObject *v;
1041 long magic;
1042 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 magic = PyMarshal_ReadLongFromFile(fp);
1045 if (magic != PyImport_GetMagicNumber()) {
Victor Stinner5200f552015-03-18 13:56:25 +01001046 if (!PyErr_Occurred())
1047 PyErr_SetString(PyExc_RuntimeError,
1048 "Bad magic number in .pyc file");
Zackery Spytzea737752018-06-23 21:15:24 -06001049 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08001051 /* Skip the rest of the header. */
1052 (void) PyMarshal_ReadLongFromFile(fp);
Antoine Pitrou5136ac02012-01-13 18:52:16 +01001053 (void) PyMarshal_ReadLongFromFile(fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 (void) PyMarshal_ReadLongFromFile(fp);
Zackery Spytzea737752018-06-23 21:15:24 -06001055 if (PyErr_Occurred()) {
1056 goto error;
1057 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 v = PyMarshal_ReadLastObjectFromFile(fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (v == NULL || !PyCode_Check(v)) {
1060 Py_XDECREF(v);
1061 PyErr_SetString(PyExc_RuntimeError,
1062 "Bad code object in .pyc file");
Zackery Spytzea737752018-06-23 21:15:24 -06001063 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 }
Zackery Spytzea737752018-06-23 21:15:24 -06001065 fclose(fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 co = (PyCodeObject *)v;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001067 v = PyEval_EvalCode((PyObject*)co, globals, locals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (v && flags)
1069 flags->cf_flags |= (co->co_flags & PyCF_MASK);
1070 Py_DECREF(co);
1071 return v;
Zackery Spytzea737752018-06-23 21:15:24 -06001072error:
1073 fclose(fp);
1074 return NULL;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001075}
1076
Guido van Rossum82598051997-03-05 00:20:32 +00001077PyObject *
Victor Stinner14e461d2013-08-26 22:28:21 +02001078Py_CompileStringObject(const char *str, PyObject *filename, int start,
1079 PyCompilerFlags *flags, int optimize)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 PyCodeObject *co;
1082 mod_ty mod;
1083 PyArena *arena = PyArena_New();
1084 if (arena == NULL)
1085 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001086
Victor Stinner14e461d2013-08-26 22:28:21 +02001087 mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 if (mod == NULL) {
1089 PyArena_Free(arena);
1090 return NULL;
1091 }
1092 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
1093 PyObject *result = PyAST_mod2obj(mod);
1094 PyArena_Free(arena);
1095 return result;
1096 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001097 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 PyArena_Free(arena);
1099 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001100}
1101
Victor Stinner14e461d2013-08-26 22:28:21 +02001102PyObject *
1103Py_CompileStringExFlags(const char *str, const char *filename_str, int start,
1104 PyCompilerFlags *flags, int optimize)
1105{
1106 PyObject *filename, *co;
1107 filename = PyUnicode_DecodeFSDefault(filename_str);
1108 if (filename == NULL)
1109 return NULL;
1110 co = Py_CompileStringObject(str, filename, start, flags, optimize);
1111 Py_DECREF(filename);
1112 return co;
1113}
1114
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001115/* For use in Py_LIMITED_API */
1116#undef Py_CompileString
1117PyObject *
1118PyCompileString(const char *str, const char *filename, int start)
1119{
1120 return Py_CompileStringFlags(str, filename, start, NULL);
1121}
1122
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001123struct symtable *
Victor Stinner14e461d2013-08-26 22:28:21 +02001124Py_SymtableStringObject(const char *str, PyObject *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 struct symtable *st;
1127 mod_ty mod;
1128 PyCompilerFlags flags;
Victor Stinner14e461d2013-08-26 22:28:21 +02001129 PyArena *arena;
1130
1131 arena = PyArena_New();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (arena == NULL)
1133 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 flags.cf_flags = 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02001136 mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 if (mod == NULL) {
1138 PyArena_Free(arena);
1139 return NULL;
1140 }
Victor Stinner14e461d2013-08-26 22:28:21 +02001141 st = PySymtable_BuildObject(mod, filename, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 PyArena_Free(arena);
1143 return st;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001144}
1145
Victor Stinner14e461d2013-08-26 22:28:21 +02001146struct symtable *
1147Py_SymtableString(const char *str, const char *filename_str, int start)
1148{
1149 PyObject *filename;
1150 struct symtable *st;
1151
1152 filename = PyUnicode_DecodeFSDefault(filename_str);
1153 if (filename == NULL)
1154 return NULL;
1155 st = Py_SymtableStringObject(str, filename, start);
1156 Py_DECREF(filename);
1157 return st;
1158}
1159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160/* Preferred access to parser is through AST. */
1161mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +02001162PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start,
1163 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 mod_ty mod;
1166 PyCompilerFlags localflags;
1167 perrdetail err;
1168 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001169
Victor Stinner14e461d2013-08-26 22:28:21 +02001170 node *n = PyParser_ParseStringObject(s, filename,
1171 &_PyParser_Grammar, start, &err,
1172 &iflags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 if (flags == NULL) {
1174 localflags.cf_flags = 0;
1175 flags = &localflags;
1176 }
1177 if (n) {
1178 flags->cf_flags |= iflags & PyCF_MASK;
Victor Stinner14e461d2013-08-26 22:28:21 +02001179 mod = PyAST_FromNodeObject(n, flags, filename, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 PyNode_Free(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 }
1182 else {
1183 err_input(&err);
Victor Stinner7f2fee32011-04-05 00:39:01 +02001184 mod = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 }
Victor Stinner7f2fee32011-04-05 00:39:01 +02001186 err_free(&err);
1187 return mod;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188}
1189
1190mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +02001191PyParser_ASTFromString(const char *s, const char *filename_str, int start,
1192 PyCompilerFlags *flags, PyArena *arena)
1193{
1194 PyObject *filename;
1195 mod_ty mod;
1196 filename = PyUnicode_DecodeFSDefault(filename_str);
1197 if (filename == NULL)
1198 return NULL;
1199 mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena);
1200 Py_DECREF(filename);
1201 return mod;
1202}
1203
1204mod_ty
1205PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc,
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001206 int start, const char *ps1,
1207 const char *ps2, PyCompilerFlags *flags, int *errcode,
Victor Stinner14e461d2013-08-26 22:28:21 +02001208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 mod_ty mod;
1211 PyCompilerFlags localflags;
1212 perrdetail err;
1213 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001214
Victor Stinner14e461d2013-08-26 22:28:21 +02001215 node *n = PyParser_ParseFileObject(fp, filename, enc,
1216 &_PyParser_Grammar,
1217 start, ps1, ps2, &err, &iflags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 if (flags == NULL) {
1219 localflags.cf_flags = 0;
1220 flags = &localflags;
1221 }
1222 if (n) {
1223 flags->cf_flags |= iflags & PyCF_MASK;
Victor Stinner14e461d2013-08-26 22:28:21 +02001224 mod = PyAST_FromNodeObject(n, flags, filename, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 PyNode_Free(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 }
1227 else {
1228 err_input(&err);
1229 if (errcode)
1230 *errcode = err.error;
Victor Stinner7f2fee32011-04-05 00:39:01 +02001231 mod = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 }
Victor Stinner7f2fee32011-04-05 00:39:01 +02001233 err_free(&err);
1234 return mod;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235}
1236
Victor Stinner14e461d2013-08-26 22:28:21 +02001237mod_ty
1238PyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc,
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001239 int start, const char *ps1,
1240 const char *ps2, PyCompilerFlags *flags, int *errcode,
Victor Stinner14e461d2013-08-26 22:28:21 +02001241 PyArena *arena)
1242{
1243 mod_ty mod;
1244 PyObject *filename;
1245 filename = PyUnicode_DecodeFSDefault(filename_str);
1246 if (filename == NULL)
1247 return NULL;
1248 mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2,
1249 flags, errcode, arena);
1250 Py_DECREF(filename);
1251 return mod;
1252}
1253
Guido van Rossuma110aa61994-08-29 12:50:44 +00001254/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001255
Guido van Rossuma110aa61994-08-29 12:50:44 +00001256node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001257PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 perrdetail err;
1260 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1261 &_PyParser_Grammar,
1262 start, NULL, NULL, &err, flags);
1263 if (n == NULL)
1264 err_input(&err);
Victor Stinner7f2fee32011-04-05 00:39:01 +02001265 err_free(&err);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001268}
1269
Guido van Rossuma110aa61994-08-29 12:50:44 +00001270/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001271
Guido van Rossuma110aa61994-08-29 12:50:44 +00001272node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001273PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 perrdetail err;
1276 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1277 start, &err, flags);
1278 if (n == NULL)
1279 err_input(&err);
Victor Stinner7f2fee32011-04-05 00:39:01 +02001280 err_free(&err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 return n;
Tim Petersfe2127d2001-07-16 05:37:24 +00001282}
1283
1284node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001285PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 int start, int flags)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 perrdetail err;
1289 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1290 &_PyParser_Grammar, start, &err, flags);
1291 if (n == NULL)
1292 err_input(&err);
Victor Stinner7f2fee32011-04-05 00:39:01 +02001293 err_free(&err);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 return n;
Thomas Heller6b17abf2002-07-09 09:23:27 +00001295}
1296
Guido van Rossum66ebd912003-04-17 16:02:26 +00001297/* May want to move a more generalized form of this to parsetok.c or
1298 even parser modules. */
1299
1300void
Victor Stinner7f2fee32011-04-05 00:39:01 +02001301PyParser_ClearError(perrdetail *err)
1302{
1303 err_free(err);
1304}
1305
1306void
Guido van Rossum66ebd912003-04-17 16:02:26 +00001307PyParser_SetError(perrdetail *err)
1308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 err_input(err);
Guido van Rossum66ebd912003-04-17 16:02:26 +00001310}
1311
Victor Stinner7f2fee32011-04-05 00:39:01 +02001312static void
1313err_free(perrdetail *err)
1314{
1315 Py_CLEAR(err->filename);
1316}
1317
Guido van Rossuma110aa61994-08-29 12:50:44 +00001318/* Set the error appropriate to the given input error code (see errcode.h) */
1319
1320static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 PyObject *v, *w, *errtype, *errtext;
1324 PyObject *msg_obj = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001325 const char *msg = NULL;
Serhiy Storchaka65fd0592014-01-21 22:26:52 +02001326 int offset = err->offset;
Victor Stinner4c7c8c32010-10-16 13:14:10 +00001327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 errtype = PyExc_SyntaxError;
1329 switch (err->error) {
1330 case E_ERROR:
Serhiy Storchaka993030a2018-07-12 00:17:53 +03001331 goto cleanup;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 case E_SYNTAX:
1333 errtype = PyExc_IndentationError;
1334 if (err->expected == INDENT)
1335 msg = "expected an indented block";
1336 else if (err->token == INDENT)
1337 msg = "unexpected indent";
1338 else if (err->token == DEDENT)
1339 msg = "unexpected unindent";
Serhiy Storchakaaba24ff2018-07-23 23:41:11 +03001340 else if (err->expected == NOTEQUAL) {
1341 errtype = PyExc_SyntaxError;
1342 msg = "with Barry as BDFL, use '<>' instead of '!='";
1343 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 else {
1345 errtype = PyExc_SyntaxError;
1346 msg = "invalid syntax";
1347 }
1348 break;
1349 case E_TOKEN:
1350 msg = "invalid token";
1351 break;
1352 case E_EOFS:
1353 msg = "EOF while scanning triple-quoted string literal";
1354 break;
1355 case E_EOLS:
1356 msg = "EOL while scanning string literal";
1357 break;
1358 case E_INTR:
1359 if (!PyErr_Occurred())
1360 PyErr_SetNone(PyExc_KeyboardInterrupt);
1361 goto cleanup;
1362 case E_NOMEM:
1363 PyErr_NoMemory();
1364 goto cleanup;
1365 case E_EOF:
1366 msg = "unexpected EOF while parsing";
1367 break;
1368 case E_TABSPACE:
1369 errtype = PyExc_TabError;
1370 msg = "inconsistent use of tabs and spaces in indentation";
1371 break;
1372 case E_OVERFLOW:
1373 msg = "expression too long";
1374 break;
1375 case E_DEDENT:
1376 errtype = PyExc_IndentationError;
1377 msg = "unindent does not match any outer indentation level";
1378 break;
1379 case E_TOODEEP:
1380 errtype = PyExc_IndentationError;
1381 msg = "too many levels of indentation";
1382 break;
1383 case E_DECODE: {
1384 PyObject *type, *value, *tb;
1385 PyErr_Fetch(&type, &value, &tb);
1386 msg = "unknown decode error";
1387 if (value != NULL)
1388 msg_obj = PyObject_Str(value);
1389 Py_XDECREF(type);
1390 Py_XDECREF(value);
1391 Py_XDECREF(tb);
1392 break;
1393 }
1394 case E_LINECONT:
1395 msg = "unexpected character after line continuation character";
1396 break;
Martin v. Löwis47383402007-08-15 07:32:56 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 case E_IDENTIFIER:
1399 msg = "invalid character in identifier";
1400 break;
Meador Ingefa21bf02012-01-19 01:08:41 -06001401 case E_BADSINGLE:
1402 msg = "multiple statements found while compiling a single statement";
1403 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 default:
1405 fprintf(stderr, "error=%d\n", err->error);
1406 msg = "unknown parsing error";
1407 break;
1408 }
1409 /* err->text may not be UTF-8 in case of decoding errors.
1410 Explicitly convert to an object. */
1411 if (!err->text) {
1412 errtext = Py_None;
1413 Py_INCREF(Py_None);
1414 } else {
Serhiy Storchaka65fd0592014-01-21 22:26:52 +02001415 errtext = PyUnicode_DecodeUTF8(err->text, err->offset,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 "replace");
Serhiy Storchaka65fd0592014-01-21 22:26:52 +02001417 if (errtext != NULL) {
1418 Py_ssize_t len = strlen(err->text);
1419 offset = (int)PyUnicode_GET_LENGTH(errtext);
1420 if (len != err->offset) {
1421 Py_DECREF(errtext);
1422 errtext = PyUnicode_DecodeUTF8(err->text, len,
1423 "replace");
1424 }
1425 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 }
Victor Stinner7f2fee32011-04-05 00:39:01 +02001427 v = Py_BuildValue("(OiiN)", err->filename,
Serhiy Storchaka65fd0592014-01-21 22:26:52 +02001428 err->lineno, offset, errtext);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 if (v != NULL) {
1430 if (msg_obj)
1431 w = Py_BuildValue("(OO)", msg_obj, v);
1432 else
1433 w = Py_BuildValue("(sO)", msg, v);
1434 } else
1435 w = NULL;
1436 Py_XDECREF(v);
1437 PyErr_SetObject(errtype, w);
1438 Py_XDECREF(w);
Georg Brandl3dbca812008-07-23 16:10:53 +00001439cleanup:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 Py_XDECREF(msg_obj);
1441 if (err->text != NULL) {
1442 PyObject_FREE(err->text);
1443 err->text = NULL;
1444 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001445}
1446
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001447
Zachary Warec4821d62014-11-21 23:35:12 -06001448#if defined(USE_STACKCHECK)
1449#if defined(WIN32) && defined(_MSC_VER)
1450
1451/* Stack checking for Microsoft C */
1452
1453#include <malloc.h>
1454#include <excpt.h>
1455
1456/*
1457 * Return non-zero when we run out of memory on the stack; zero otherwise.
1458 */
1459int
1460PyOS_CheckStack(void)
1461{
1462 __try {
1463 /* alloca throws a stack overflow exception if there's
1464 not enough space left on the stack */
1465 alloca(PYOS_STACK_MARGIN * sizeof(void*));
1466 return 0;
1467 } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
1468 EXCEPTION_EXECUTE_HANDLER :
1469 EXCEPTION_CONTINUE_SEARCH) {
1470 int errcode = _resetstkoflw();
1471 if (errcode == 0)
1472 {
1473 Py_FatalError("Could not reset the stack!");
1474 }
1475 }
1476 return 1;
1477}
1478
1479#endif /* WIN32 && _MSC_VER */
1480
1481/* Alternate implementations can be added here... */
1482
1483#endif /* USE_STACKCHECK */
1484
Martin Panter46f50722016-05-26 05:35:26 +00001485/* Deprecated C API functions still provided for binary compatibility */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486
1487#undef PyParser_SimpleParseFile
Benjamin Petersone5024512018-09-12 12:06:42 -07001488node *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492}
1493
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001494#undef PyParser_SimpleParseString
Benjamin Petersone5024512018-09-12 12:06:42 -07001495node *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496PyParser_SimpleParseString(const char *str, int start)
1497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 return PyParser_SimpleParseStringFlags(str, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001500
1501#undef PyRun_AnyFile
Benjamin Petersone5024512018-09-12 12:06:42 -07001502int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503PyRun_AnyFile(FILE *fp, const char *name)
1504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001506}
1507
1508#undef PyRun_AnyFileEx
Benjamin Petersone5024512018-09-12 12:06:42 -07001509int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001510PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513}
1514
1515#undef PyRun_AnyFileFlags
Benjamin Petersone5024512018-09-12 12:06:42 -07001516int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001517PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 return PyRun_AnyFileExFlags(fp, name, 0, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001520}
1521
1522#undef PyRun_File
Benjamin Petersone5024512018-09-12 12:06:42 -07001523PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001524PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001527}
1528
1529#undef PyRun_FileEx
Benjamin Petersone5024512018-09-12 12:06:42 -07001530PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001531PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001534}
1535
1536#undef PyRun_FileFlags
Benjamin Petersone5024512018-09-12 12:06:42 -07001537PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001538PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 PyCompilerFlags *flags)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542}
1543
1544#undef PyRun_SimpleFile
Benjamin Petersone5024512018-09-12 12:06:42 -07001545int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001546PyRun_SimpleFile(FILE *f, const char *p)
1547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001549}
1550
1551#undef PyRun_SimpleFileEx
Benjamin Petersone5024512018-09-12 12:06:42 -07001552int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001553PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 return PyRun_SimpleFileExFlags(f, p, c, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001556}
1557
1558
1559#undef PyRun_String
Benjamin Petersone5024512018-09-12 12:06:42 -07001560PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001561PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 return PyRun_StringFlags(str, s, g, l, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001564}
1565
1566#undef PyRun_SimpleString
Benjamin Petersone5024512018-09-12 12:06:42 -07001567int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001568PyRun_SimpleString(const char *s)
1569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 return PyRun_SimpleStringFlags(s, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001571}
1572
1573#undef Py_CompileString
Benjamin Petersone5024512018-09-12 12:06:42 -07001574PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001575Py_CompileString(const char *str, const char *p, int s)
1576{
Georg Brandl8334fd92010-12-04 10:26:46 +00001577 return Py_CompileStringExFlags(str, p, s, NULL, -1);
1578}
1579
1580#undef Py_CompileStringFlags
Benjamin Petersone5024512018-09-12 12:06:42 -07001581PyObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00001582Py_CompileStringFlags(const char *str, const char *p, int s,
1583 PyCompilerFlags *flags)
1584{
1585 return Py_CompileStringExFlags(str, p, s, flags, -1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001586}
1587
1588#undef PyRun_InteractiveOne
Benjamin Petersone5024512018-09-12 12:06:42 -07001589int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001590PyRun_InteractiveOne(FILE *f, const char *p)
1591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 return PyRun_InteractiveOneFlags(f, p, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001593}
1594
1595#undef PyRun_InteractiveLoop
Benjamin Petersone5024512018-09-12 12:06:42 -07001596int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001597PyRun_InteractiveLoop(FILE *f, const char *p)
1598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 return PyRun_InteractiveLoopFlags(f, p, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001600}
1601
1602#ifdef __cplusplus
1603}
1604#endif