11984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
21984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Python interpreter top-level routines, including init/exit */
31984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum#include "Python.h"
51984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
63e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "Python-ast.h"
7d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum#undef Yield /* undefine macro conflicting with winbase.h */
81984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "grammar.h"
91984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "node.h"
1085f363990cbd6df21015eebdc171c533176e3407Fred Drake#include "token.h"
111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "parsetok.h"
121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "errcode.h"
133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
144b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h"
153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h"
16fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum#include "marshal.h"
17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#include "osdefs.h"
18518e610977cce63d348d11c4081f9b7af79edd81Victor Stinner#include <locale.h>
191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
200e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#ifdef HAVE_SIGNAL_H
21a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum#include <signal.h>
220e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#endif
23a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
2480a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#ifdef MS_WINDOWS
255c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis#include "malloc.h" /* for alloca */
2680a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#endif
275c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis
2873d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef HAVE_LANGINFO_H
2973d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <langinfo.h>
3073d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif
3173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
326238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS
33a44823b7764281d398215564f2070257d08d0855Guido van Rossum#undef BYTE
34a44823b7764281d398215564f2070257d08d0855Guido van Rossum#include "windows.h"
35a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif
36a44823b7764281d398215564f2070257d08d0855Guido van Rossum
37bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(builtins);
38090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(excepthook);
393f36a5736b92457273d06cc17d55dd379381873dVictor Stinner_Py_IDENTIFIER(flush);
40bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(last_traceback);
41090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(last_type);
42090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(last_value);
43bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(ps1);
44bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(ps2);
45bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stdin);
46bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stdout);
47bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stderr);
48efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner_Py_static_string(PyId_string, "<string>");
49090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner
5049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
5149fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
524281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz#endif
534281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz
5482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumextern grammar _PyParser_Grammar; /* From graminit.c */
551984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
56b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
577fedbe513d5ccc735d36e1da9781fcab1ca5961eAmaury Forgeot d'Arcstatic void flush_io(void);
5895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerstatic PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *,
59f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          PyCompilerFlags *, PyArena *);
6095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
61f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              PyCompilerFlags *);
62dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void err_input(perrdetail *);
637f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void err_free(perrdetail *);
64ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum
651984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Parse input from a file and execute it */
661984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
684d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
69f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     PyCompilerFlags *flags)
70bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
71f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (filename == NULL)
72f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = "???";
73f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_FdIsInteractive(fp, filename)) {
74f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
75f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (closeit)
76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return err;
78f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
79f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
80f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
821984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
8495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
85bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
8695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *filename, *v;
8795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    int ret, err;
88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags local_flags;
89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
9095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
9195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (filename == NULL) {
9295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        PyErr_Print();
9395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        return -1;
9495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    }
9595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
96f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
97f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &local_flags;
98f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        local_flags.cf_flags = 0;
99f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
100090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner    v = _PySys_GetObjectId(&PyId_ps1);
101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
102090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner        _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> "));
103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
105090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner    v = _PySys_GetObjectId(&PyId_ps2);
106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
107090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner        _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... "));
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
11095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    err = -1;
111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (;;) {
11295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        ret = PyRun_InteractiveOneObject(fp, filename, flags);
113d600951748d7a19cdb3e58a376c51ed804b630e6Nick Coghlan        _PY_DEBUG_PRINT_TOTAL_REFS();
11495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        if (ret == E_EOF) {
11595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner            err = 0;
11695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner            break;
11795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        }
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /*
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (ret == E_NOMEM)
12095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner            break;
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
12395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    Py_DECREF(filename);
12495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    return err;
1251984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
1261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
127c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer/* compute parser flags based on compiler flags */
128f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Petersonstatic int PARSER_FLAGS(PyCompilerFlags *flags)
129f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson{
130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int parser_flags = 0;
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!flags)
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT)
134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_DONT_IMPLY_DEDENT;
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & PyCF_IGNORE_COOKIE)
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_IGNORE_COOKIE;
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL)
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_BARRY_AS_BDFL;
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return parser_flags;
140f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson}
141c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer
14289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#if 0
14389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters/* Keep an example of flags with future keyword support. */
14489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#define PARSER_FLAGS(flags) \
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyPARSE_DONT_IMPLY_DEDENT : 0) \
147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
14989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#endif
15089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters
1519f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hyltonint
15295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
1539f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton{
15495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name;
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena;
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *ps1 = "", *ps2 = "", *enc = NULL;
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int errcode = 0;
159bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(encoding);
16095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    _Py_IDENTIFIER(__main__);
16195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
16295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    mod_name = _PyUnicode_FromId(&PyId___main__); /* borrowed */
16395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (mod_name == NULL) {
16495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        PyErr_Print();
16595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        return -1;
16695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    }
167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (fp == stdin) {
169fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        /* Fetch encoding from sys.stdin if possible. */
170bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner        v = _PySys_GetObjectId(&PyId_stdin);
171fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        if (v && v != Py_None) {
172fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            oenc = _PyObject_GetAttrId(v, &PyId_encoding);
173fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            if (oenc)
17406515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka                enc = PyUnicode_AsUTF8(oenc);
175fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            if (!enc)
176fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson                PyErr_Clear();
177fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        }
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
179090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner    v = _PySys_GetObjectId(&PyId_ps1);
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v != NULL) {
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyObject_Str(v);
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
184386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        else if (PyUnicode_Check(v)) {
18506515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka            ps1 = PyUnicode_AsUTF8(v);
186386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            if (ps1 == NULL) {
187386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                PyErr_Clear();
188386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                ps1 = "";
189386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            }
190386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        }
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
192090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner    w = _PySys_GetObjectId(&PyId_ps2);
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (w != NULL) {
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        w = PyObject_Str(w);
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (w == NULL)
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
197386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        else if (PyUnicode_Check(w)) {
19806515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka            ps2 = PyUnicode_AsUTF8(w);
199386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            if (ps2 == NULL) {
200386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                PyErr_Clear();
201386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                ps2 = "";
202386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            }
203386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        }
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    arena = PyArena_New();
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL) {
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(w);
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(oenc);
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
21295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    mod = PyParser_ASTFromFileObject(fp, filename, enc,
21395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner                                     Py_single_input, ps1, ps2,
21495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner                                     flags, &errcode, arena);
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(w);
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(oenc);
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errcode == E_EOF) {
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return E_EOF;
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
22795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    m = PyImport_AddModuleObject(mod_name);
228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL) {
229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = run_mod(mod, filename, d, d, flags, arena);
234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
2379845c7ebc5cf5af495123701664f275562f45243Antoine Pitrou        flush_io();
238f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
2419845c7ebc5cf5af495123701664f275562f45243Antoine Pitrou    flush_io();
242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
2431984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
2441984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
24595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerint
24695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
24795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner{
24895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *filename;
24995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    int res;
25095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
25195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
25295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (filename == NULL) {
25395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        PyErr_Print();
25495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        return -1;
25595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    }
25695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    res = PyRun_InteractiveOneObject(fp, filename, flags);
25795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    Py_DECREF(filename);
25895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    return res;
25995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner}
26095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
26195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
262be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis/* Check whether a file maybe a pyc file: Look at the extension,
263be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis   the file type, and, if we may close it, at the first few bytes. */
264be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
265be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwisstatic int
26695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwismaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
267be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis{
268f299abdafa0f2b6eb7abae274861b19b361c96bcBrett Cannon    if (strcmp(ext, ".pyc") == 0)
269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Only look into the file if we are allowed to close it, since
272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       it then should also be seekable. */
273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (closeit) {
274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Read only two bytes of the magic. If the file was opened in
275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           text mode, the bytes 3 and 4 of the magic (\r\n) might not
276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           be read as they are on disk. */
277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        unsigned char buf[2];
279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Mess:  In case of -x, the stream is NOT at its start now,
280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           and ungetc() was used to push back the first newline,
281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           which makes the current stream position formally undefined,
282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           and a x-platform nightmare.
283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           Unfortunately, we have no direct way to know whether -x
284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           was specified.  So we use a terrible hack:  if the current
285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           stream position is not 0, we assume -x was specified, and
286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           give up.  Bug 132850 on SourceForge spells out the
287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           hopelessness of trying anything else (fseek and ftell
288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           don't work predictably x-platform for text-mode files).
289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int ispyc = 0;
291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (ftell(fp) == 0) {
292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (fread(buf, 1, 2, fp) == 2 &&
293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ispyc = 1;
295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            rewind(fp);
296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ispyc;
298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
300d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters}
301be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
30232d483c39b4169b48ab3a98c36a77ea4e74b9f5aAntoine Pitroustatic int
30332d483c39b4169b48ab3a98c36a77ea4e74b9f5aAntoine Pitrouset_main_loader(PyObject *d, const char *filename, const char *loader_name)
30485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan{
30585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    PyInterpreterState *interp;
30685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    PyThreadState *tstate;
30732439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow    PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader;
308b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    int result = 0;
30990c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov
31090c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    filename_obj = PyUnicode_DecodeFSDefault(filename);
31190c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    if (filename_obj == NULL)
31290c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov        return -1;
31385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    /* Get current thread state and interpreter pointer */
31485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    tstate = PyThreadState_GET();
31585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    interp = tstate->interp;
31632439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow    bootstrap = PyObject_GetAttrString(interp->importlib,
31732439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow                                       "_bootstrap_external");
31832439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow    if (bootstrap != NULL) {
31932439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow        loader_type = PyObject_GetAttrString(bootstrap, loader_name);
32032439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow        Py_DECREF(bootstrap);
32132439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow    }
3223f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan    if (loader_type == NULL) {
32390c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov        Py_DECREF(filename_obj);
3243f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan        return -1;
3253f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan    }
32690c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj);
327b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    Py_DECREF(loader_type);
328b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    if (loader == NULL) {
32985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        return -1;
33085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    }
331b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
332b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan        result = -1;
333b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    }
33485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    Py_DECREF(loader);
335b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    return result;
33685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan}
33785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan
33885e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlanint
33995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        PyCompilerFlags *flags)
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d, *v;
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    const char *ext;
3445c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    int set_file_name = 0, ret = -1;
3450fcab4a3ed5e39769609b60d6179c4c801e45985Victor Stinner    size_t len;
346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
3505c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    Py_INCREF(m);
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_GetItemString(d, "__file__") == NULL) {
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *f;
3544c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner        f = PyUnicode_DecodeFSDefault(filename);
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (f == NULL)
3565c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyDict_SetItemString(d, "__file__", f) < 0) {
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(f);
3595c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
361916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw        if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) {
362916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw            Py_DECREF(f);
3635c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
364916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw        }
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        set_file_name = 1;
366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(f);
367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    len = strlen(filename);
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ext = filename + len - (len > 4 ? 4 : 0);
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (maybe_pyc_file(fp, filename, ext, closeit)) {
37104ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        FILE *pyc_fp;
372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Try to run a pyc file. First, re-open in binary */
373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (closeit)
374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
375daf455554bc21b6b5df0a016ab5fa639d36cc595Victor Stinner        if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) {
376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "python: Can't reopen .pyc file\n");
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto done;
378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
37985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan
38085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
38185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            fprintf(stderr, "python: failed to set __main__.__loader__\n");
38285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            ret = -1;
38304ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes            fclose(pyc_fp);
38485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            goto done;
38585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
38604ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        v = run_pyc_file(pyc_fp, filename, d, d, flags);
38704ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        fclose(pyc_fp);
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
38985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        /* When running from stdin, leave __main__.__loader__ alone */
39085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (strcmp(filename, "<stdin>") != 0 &&
39185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            set_main_loader(d, filename, "SourceFileLoader") < 0) {
39285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            fprintf(stderr, "python: failed to set __main__.__loader__\n");
39385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            ret = -1;
39485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            goto done;
39585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              closeit, flags);
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flush_io();
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto done;
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ret = 0;
406d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum  done:
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (set_file_name && PyDict_DelItemString(d, "__file__"))
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
4095c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    Py_DECREF(m);
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
4111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
4121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
4131984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
41495292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
415393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum{
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d, *v;
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
4281984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
4291984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
430035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawstatic int
431efa7a0e155e508f21dd7ace708b311066637538fVictor Stinnerparse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
432efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                   int *lineno, int *offset, PyObject **text)
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
43456f6e76c680f47ad2b11bed9406305a000a1889aSerhiy Storchaka    int hold;
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
436bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(msg);
437bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(filename);
438bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(lineno);
439bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(offset);
440bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(text);
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
44280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    *message = NULL;
443efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner    *filename = NULL;
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
44580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    /* new style errors.  `err' is an instance */
4460a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    *message = _PyObject_GetAttrId(err, &PyId_msg);
44780d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!*message)
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4500a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_filename);
45180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
45380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (v == Py_None) {
45480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
455efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        *filename = _PyUnicode_FromId(&PyId_string);
456efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        if (*filename == NULL)
457efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            goto finally;
458efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        Py_INCREF(*filename);
45980d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
46080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    else {
461efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        *filename = v;
46280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4640a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_lineno);
46580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
46756f6e76c680f47ad2b11bed9406305a000a1889aSerhiy Storchaka    hold = _PyLong_AsInt(v);
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (hold < 0 && PyErr_Occurred())
470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
47156f6e76c680f47ad2b11bed9406305a000a1889aSerhiy Storchaka    *lineno = hold;
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4730a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_offset);
47480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == Py_None) {
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *offset = -1;
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
48056f6e76c680f47ad2b11bed9406305a000a1889aSerhiy Storchaka        hold = _PyLong_AsInt(v);
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (hold < 0 && PyErr_Occurred())
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto finally;
48456f6e76c680f47ad2b11bed9406305a000a1889aSerhiy Storchaka        *offset = hold;
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4870a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_text);
48880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
49080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (v == Py_None) {
49180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *text = NULL;
49380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
49480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    else {
495efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        *text = v;
49680d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
498035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
499035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawfinally:
50080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    Py_XDECREF(*message);
501efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner    Py_XDECREF(*filename);
502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
503035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw}
504035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
5051984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
506f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_Print(void)
5071984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_PrintEx(1);
509a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
510a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
5119f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hyltonstatic void
512efa7a0e155e508f21dd7ace708b311066637538fVictor Stinnerprint_error_text(PyObject *f, int offset, PyObject *text_obj)
5139f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton{
514efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner    char *text;
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *nl;
516efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
51706515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka    text = PyUnicode_AsUTF8(text_obj);
518efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner    if (text == NULL)
519efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        return;
520efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (offset >= 0) {
52298ea54c35c37e4f9a7d7a923a7ccd792f4b7ff90Victor Stinner        if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n')
523a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson            offset--;
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (;;) {
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            nl = strchr(text, '\n');
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (nl == NULL || nl-text >= offset)
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            offset -= (int)(nl+1-text);
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            text = nl+1;
530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
531ca3263c50c3b3a3719d2ec3ee7b30b8c669dcb19Martin Panter        while (*text == ' ' || *text == '\t' || *text == '\f') {
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            text++;
533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            offset--;
534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("    ", f);
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString(text, f);
538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (*text == '\0' || text[strlen(text)-1] != '\n')
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString("\n", f);
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (offset == -1)
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("    ", f);
543a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson    while (--offset > 0)
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString(" ", f);
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("^\n", f);
5469f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton}
5479f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton
54866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumstatic void
54966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumhandle_system_exit(void)
55026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee{
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *exception, *value, *tb;
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int exitcode = 0;
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag)
555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Don't exit if -i flag was given. This flag is set to 0
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         * when entering interactive mode for inspecting. */
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&exception, &value, &tb);
560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stdout);
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (value == NULL || value == Py_None)
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto done;
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyExceptionInstance_Check(value)) {
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* The error code should be in the `code' attribute. */
565bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis        _Py_IDENTIFIER(code);
5661ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis        PyObject *code = _PyObject_GetAttrId(value, &PyId_code);
567f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (code) {
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(value);
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            value = code;
570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (value == Py_None)
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto done;
572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* If we failed to dig out the 'code' attribute,
574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           just let the else clause below print the error. */
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyLong_Check(value))
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        exitcode = (int)PyLong_AsLong(value);
578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
579bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner        PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr);
580d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan        /* We clear the exception here to avoid triggering the assertion
581d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan         * in PyObject_Str that ensures it won't silently lose exception
582d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan         * details.
583d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan         */
584d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan        PyErr_Clear();
5857126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        if (sys_stderr != NULL && sys_stderr != Py_None) {
5867126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
5877126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        } else {
5887126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            PyObject_Print(value, stderr, Py_PRINT_RAW);
5897126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            fflush(stderr);
5907126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        }
591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_WriteStderr("\n");
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        exitcode = 1;
593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
594cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters done:
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Restore and clear the exception info, in order to properly decref
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the exception, value, and traceback.      If we just exit instead,
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * these leak, which confuses PYTHONDUMPREFS output, and may prevent
598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * some finalizers from running.
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Restore(exception, value, tb);
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Exit(exitcode);
603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* NOTREACHED */
60426fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee}
60526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee
60626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yeevoid
607f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_PrintEx(int set_sys_last_vars)
608a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *exception, *v, *tb, *hook;
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        handle_system_exit();
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&exception, &v, &tb);
615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exception == NULL)
616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_NormalizeException(&exception, &v, &tb);
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tb == NULL) {
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        tb = Py_None;
620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(tb);
621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyException_SetTraceback(v, tb);
623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exception == NULL)
624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Now we know v != NULL too */
626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (set_sys_last_vars) {
627090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner        _PySys_SetObjectId(&PyId_last_type, exception);
628090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner        _PySys_SetObjectId(&PyId_last_value, v);
629090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner        _PySys_SetObjectId(&PyId_last_traceback, tb);
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
631090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner    hook = _PySys_GetObjectId(&PyId_excepthook);
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (hook) {
63371cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner        PyObject* stack[3];
63471cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner        PyObject *result;
63571cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner
63671cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner        stack[0] = exception;
63771cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner        stack[1] = v;
63871cb64acc27723fa4d648374d084a07030ab10fbVictor Stinner        stack[2] = tb;
639559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner        result = _PyObject_FastCall(hook, stack, 3);
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result == NULL) {
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *exception2, *v2, *tb2;
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                handle_system_exit();
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Fetch(&exception2, &v2, &tb2);
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_NormalizeException(&exception2, &v2, &tb2);
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* It should not be possible for exception2 or v2
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               to be NULL. However PyErr_Display() can't
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               tolerate NULLs, so just be safe. */
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (exception2 == NULL) {
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                exception2 = Py_None;
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_INCREF(exception2);
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (v2 == NULL) {
655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                v2 = Py_None;
656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_INCREF(v2);
657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fflush(stdout);
659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Error in sys.excepthook:\n");
660f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Display(exception2, v2, tb2);
661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("\nOriginal exception was:\n");
662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Display(exception, v, tb);
663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(exception2);
664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v2);
665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(tb2);
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(result);
668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_WriteStderr("sys.excepthook is missing\n");
670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Display(exception, v, tb);
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(exception);
673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(tb);
675b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee}
676b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee
677e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void
678e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception(PyObject *f, PyObject *value)
679b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int err = 0;
681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *type, *tb;
6821c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    _Py_IDENTIFIER(print_file_and_line);
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyExceptionInstance_Check(value)) {
68552ce3b04d094b568c303968b2273e2322b422e38Victor Stinner        err = PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
68652ce3b04d094b568c303968b2273e2322b422e38Victor Stinner        err += PyFile_WriteString(Py_TYPE(value)->tp_name, f);
68752ce3b04d094b568c303968b2273e2322b422e38Victor Stinner        err += PyFile_WriteString(" found\n", f);
68852ce3b04d094b568c303968b2273e2322b422e38Victor Stinner        if (err)
68952ce3b04d094b568c303968b2273e2322b422e38Victor Stinner            PyErr_Clear();
690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(value);
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stdout);
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type = (PyObject *) Py_TYPE(value);
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    tb = PyException_GetTraceback(value);
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tb && tb != Py_None)
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err = PyTraceBack_Print(tb, f);
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err == 0 &&
7001c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis        _PyObject_HasAttrId(value, &PyId_print_file_and_line))
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
702efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner        PyObject *message, *filename, *text;
703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int lineno, offset;
704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!parse_syntax_error(value, &message, &filename,
705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                &lineno, &offset, &text))
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
708efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            PyObject *line;
709efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(value);
711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            value = message;
712efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
713efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            line = PyUnicode_FromFormat("  File \"%U\", line %d\n",
714efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                                          filename, lineno);
715efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            Py_DECREF(filename);
716efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            if (line != NULL) {
717efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                PyFile_WriteObject(line, f, Py_PRINT_RAW);
718efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                Py_DECREF(line);
719efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            }
720efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
721efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            if (text != NULL) {
722efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                print_error_text(f, offset, text);
723efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner                Py_DECREF(text);
724efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner            }
725efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner
726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Can't be bothered to check all those
727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               PyFile_WriteString() calls */
728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_Occurred())
729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                err = -1;
730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err) {
733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Don't do anything else */
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject* moduleName;
737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char* className;
738bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis        _Py_IDENTIFIER(__module__);
739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        assert(PyExceptionClass_Check(type));
740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        className = PyExceptionClass_Name(type);
741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (className != NULL) {
742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            char *dot = strrchr(className, '.');
743f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (dot != NULL)
744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                className = dot+1;
745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
7471ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis        moduleName = _PyObject_GetAttrId(type, &PyId___module__);
748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (moduleName == NULL || !PyUnicode_Check(moduleName))
749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        {
75013b21bd749aef0f6b18cec0e7e5d1d3e643f106aVictor Stinner            Py_XDECREF(moduleName);
751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = PyFile_WriteString("<unknown>", f);
752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
754f5894dd646f5e39918377b37b8c8694cebdca103Serhiy Storchaka            if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins))
755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
756937114f7043d6a52172a34fe04febcc5ed0eaed9Victor Stinner                err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW);
757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                err += PyFile_WriteString(".", f);
758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(moduleName);
760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err == 0) {
762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (className == NULL)
763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      err = PyFile_WriteString("<unknown>", f);
764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else
765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      err = PyFile_WriteString(className, f);
766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
768f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err == 0 && (value != Py_None)) {
769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *s = PyObject_Str(value);
770f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* only print colon if the str() of the
771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           object is not the empty string
772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
7733263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter        if (s == NULL) {
7743263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter            PyErr_Clear();
775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = -1;
7763263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter            PyFile_WriteString(": <exception str() failed>", f);
7773263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter        }
778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (!PyUnicode_Check(s) ||
779e251d6d69d27c0a9e4621fd98711db8958920409Victor Stinner            PyUnicode_GetLength(s) != 0)
780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = PyFile_WriteString(": ", f);
781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err == 0)
782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou          err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(s);
784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* try to write a newline in any case */
7863263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter    if (err < 0) {
7873263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter        PyErr_Clear();
7883263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter    }
789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    err += PyFile_WriteString("\n", f);
790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(tb);
791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(value);
792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* If an error happened here, don't show it.
793f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       XXX This is wrong, but too many callers rely on this behavior. */
794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err != 0)
795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
7961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
7971984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
7982d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char cause_message[] =
799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "\nThe above exception was the direct cause "
800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "of the following exception:\n\n";
801e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
8022d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char context_message[] =
803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "\nDuring handling of the above exception, "
804f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "another exception occurred:\n\n";
805e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
806e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void
807e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
808e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{
809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int err = 0, res;
810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *cause, *context;
811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (seen != NULL) {
813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Exception chaining */
814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PySet_Add(seen, value) == -1)
815f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (PyExceptionInstance_Check(value)) {
817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            cause = PyException_GetCause(value);
818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            context = PyException_GetContext(value);
819d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson            if (cause) {
820f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                res = PySet_Contains(seen, cause);
821f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == -1)
822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_Clear();
823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == 0) {
824f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    print_exception_recursive(
825f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        f, cause, seen);
826f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    err |= PyFile_WriteString(
827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        cause_message, f);
828f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
829f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
830d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson            else if (context &&
831d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson                !((PyBaseExceptionObject *)value)->suppress_context) {
832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                res = PySet_Contains(seen, context);
833f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == -1)
834f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_Clear();
835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == 0) {
836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    print_exception_recursive(
837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        f, context, seen);
838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    err |= PyFile_WriteString(
839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        context_message, f);
840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(context);
843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(cause);
844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
845f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
846f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    print_exception(f, value);
847f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err != 0)
848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
849e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson}
850e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
851e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonvoid
852e65282114e96efb9e7eee77c57244943b746f6feBenjamin PetersonPyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
853e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{
854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *seen;
855bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    PyObject *f = _PySys_GetObjectId(&PyId_stderr);
85624201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou    if (PyExceptionInstance_Check(value)
85724201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        && tb != NULL && PyTraceBack_Check(tb)) {
85824201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        /* Put the traceback on the exception, otherwise it won't get
85924201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou           displayed.  See issue #18776. */
86024201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        PyObject *cur_tb = PyException_GetTraceback(value);
86124201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        if (cur_tb == NULL)
86224201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou            PyException_SetTraceback(value, tb);
86324201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        else
86424201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou            Py_DECREF(cur_tb);
86524201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou    }
866f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f == Py_None) {
867f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* pass */
868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
869f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (f == NULL) {
870f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyObject_Dump(value);
871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "lost sys.stderr\n");
872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* We choose to ignore seen being possibly NULL, and report
875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           at least the main exception (it could be a MemoryError).
876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        seen = PySet_New(NULL);
878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (seen == NULL)
879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        print_exception_recursive(f, value, seen);
881f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(seen);
882f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
883e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson}
884e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
88582598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
8864d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_StringFlags(const char *str, int start, PyObject *globals,
887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyObject *locals, PyCompilerFlags *flags)
8881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
889f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *ret = NULL;
890f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
89195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyArena *arena;
89295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *filename;
89395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
89495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    filename = _PyUnicode_FromId(&PyId_string); /* borrowed */
89595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (filename == NULL)
89695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        return NULL;
89795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
89895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    arena = PyArena_New();
899f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
900f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
90198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
90295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
903f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod != NULL)
90495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        ret = run_mod(mod, filename, globals, locals, flags, arena);
905f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
906f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
907bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
908bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
909bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy HyltonPyObject *
91095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals,
911f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyObject *locals, int closeit, PyCompilerFlags *flags)
912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
91395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *ret = NULL;
914f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
91595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyArena *arena = NULL;
91695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    PyObject *filename;
91795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
91895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
91995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (filename == NULL)
92095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        goto exit;
92195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
92295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    arena = PyArena_New();
923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
92495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        goto exit;
925f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
92695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0,
92795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner                                     flags, NULL, arena);
928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (closeit)
929f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fclose(fp);
930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
93195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        goto exit;
932f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
933f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ret = run_mod(mod, filename, globals, locals, flags, arena);
93495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner
93595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerexit:
93695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    Py_XDECREF(filename);
93795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    if (arena != NULL)
93895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner        PyArena_Free(arena);
939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
940bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
941bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
9426c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumstatic void
9436c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumflush_io(void)
9446c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum{
945f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *f, *r;
946f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *type, *value, *traceback;
9479ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Save the current exception */
949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&type, &value, &traceback);
9509ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
951bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    f = _PySys_GetObjectId(&PyId_stderr);
952f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f != NULL) {
9533466bde1cc113750450ffed028cc6fc7c95faeddVictor Stinner        r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (r)
955f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(r);
956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
957f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
959bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    f = _PySys_GetObjectId(&PyId_stdout);
960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f != NULL) {
9613466bde1cc113750450ffed028cc6fc7c95faeddVictor Stinner        r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
962f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (r)
963f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(r);
964f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
965f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
966f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
9679ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
968f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Restore(type, value, traceback);
9696c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum}
9706c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum
97182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
97295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerrun_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
97395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner            PyCompilerFlags *flags, PyArena *arena)
9741984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
976f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
97795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner    co = PyAST_CompileObject(mod, filename, flags, -1, arena);
978f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (co == NULL)
979f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
9804d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    v = PyEval_EvalCode((PyObject*)co, globals, locals);
981f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(co);
982f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
9831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
9841984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
98582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
9864d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Woutersrun_pyc_file(FILE *fp, const char *filename, PyObject *globals,
987f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             PyObject *locals, PyCompilerFlags *flags)
988f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
989f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
990f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
991f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long magic;
992f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long PyImport_GetMagicNumber(void);
993f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
994f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    magic = PyMarshal_ReadLongFromFile(fp);
995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (magic != PyImport_GetMagicNumber()) {
9965200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner        if (!PyErr_Occurred())
9975200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner            PyErr_SetString(PyExc_RuntimeError,
9985200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner                       "Bad magic number in .pyc file");
999f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1000f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
10015136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou    /* Skip mtime and size */
10025136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou    (void) PyMarshal_ReadLongFromFile(fp);
1003f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (void) PyMarshal_ReadLongFromFile(fp);
10045200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner    if (PyErr_Occurred())
10055200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner        return NULL;
10065200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner
1007f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyMarshal_ReadLastObjectFromFile(fp);
1008f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL || !PyCode_Check(v)) {
1009f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
1010f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError,
1011f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "Bad code object in .pyc file");
1012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1013f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1014f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    co = (PyCodeObject *)v;
10154d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    v = PyEval_EvalCode((PyObject*)co, globals, locals);
1016f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v && flags)
1017f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= (co->co_flags & PyCF_MASK);
1018f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(co);
1019f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
1020fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum}
1021fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum
102282598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
102314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_CompileStringObject(const char *str, PyObject *filename, int start,
102414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                       PyCompilerFlags *flags, int optimize)
1025f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1026f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
1027f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1028f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena = PyArena_New();
1029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
1030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
103214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
1033f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
1034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1035f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1036f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1037f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
1038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *result = PyAST_mod2obj(mod);
1039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1040f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return result;
1041f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
104214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
1043f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
1044f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (PyObject *)co;
10455b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum}
10465b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum
104714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyObject *
104814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_CompileStringExFlags(const char *str, const char *filename_str, int start,
104914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                        PyCompilerFlags *flags, int optimize)
105014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{
105114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    PyObject *filename, *co;
105214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
105314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    if (filename == NULL)
105414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        return NULL;
105514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    co = Py_CompileStringObject(str, filename, start, flags, optimize);
105614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    Py_DECREF(filename);
105714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    return co;
105814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner}
105914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
10604d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis/* For use in Py_LIMITED_API */
10614d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis#undef Py_CompileString
10624d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyObject *
10634d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyCompileString(const char *str, const char *filename, int start)
10644d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis{
10654d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    return Py_CompileStringFlags(str, filename, start, NULL);
10664d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis}
10674d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis
10684b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable *
106914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_SymtableStringObject(const char *str, PyObject *filename, int start)
10704b38da664c107bc08768235a66621429beef5444Jeremy Hylton{
1071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    struct symtable *st;
1072f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags flags;
107414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    PyArena *arena;
107514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
107614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    arena = PyArena_New();
1077f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
1078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
10790e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters
1080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flags.cf_flags = 0;
108114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena);
1082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
1083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1084f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1085f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
108614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    st = PySymtable_BuildObject(mod, filename, 0);
1087f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
1088f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return st;
10894b38da664c107bc08768235a66621429beef5444Jeremy Hylton}
10904b38da664c107bc08768235a66621429beef5444Jeremy Hylton
109114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnerstruct symtable *
109214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_SymtableString(const char *str, const char *filename_str, int start)
109314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{
109414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    PyObject *filename;
109514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    struct symtable *st;
109614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
109714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
109814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    if (filename == NULL)
109914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        return NULL;
110014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    st = Py_SymtableStringObject(str, filename, start);
110114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    Py_DECREF(filename);
110214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    return st;
110314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner}
110414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
11053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Preferred access to parser is through AST. */
11063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
110714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromStringObject(const char *s, PyObject *filename, int start,
110814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                             PyCompilerFlags *flags, PyArena *arena)
1109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags localflags;
1112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
1113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int iflags = PARSER_FLAGS(flags);
1114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
111514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    node *n = PyParser_ParseStringObject(s, filename,
111614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                                         &_PyParser_Grammar, start, &err,
111714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                                         &iflags);
1118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
1119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        localflags.cf_flags = 0;
1120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &localflags;
1121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n) {
1123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= iflags & PyCF_MASK;
112414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        mod = PyAST_FromNodeObject(n, flags, filename, arena);
1125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyNode_Free(n);
1126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
11297f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner        mod = NULL;
1130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
11317f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
11327f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    return mod;
11333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
11343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
11353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
113614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromString(const char *s, const char *filename_str, int start,
113714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                       PyCompilerFlags *flags, PyArena *arena)
113814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{
113914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    PyObject *filename;
114014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod_ty mod;
114114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
114214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    if (filename == NULL)
114314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        return NULL;
114414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena);
114514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    Py_DECREF(filename);
114614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    return mod;
114714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner}
114814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
114914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnermod_ty
115014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc,
1151ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchaka                           int start, const char *ps1,
1152ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchaka                           const char *ps2, PyCompilerFlags *flags, int *errcode,
115314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                           PyArena *arena)
1154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags localflags;
1157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
1158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int iflags = PARSER_FLAGS(flags);
1159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
116014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    node *n = PyParser_ParseFileObject(fp, filename, enc,
116114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                                       &_PyParser_Grammar,
116214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                                       start, ps1, ps2, &err, &iflags);
1163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
1164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        localflags.cf_flags = 0;
1165f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &localflags;
1166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n) {
1168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= iflags & PyCF_MASK;
116914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        mod = PyAST_FromNodeObject(n, flags, filename, arena);
1170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyNode_Free(n);
1171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
1174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errcode)
1175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *errcode = err.error;
11767f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner        mod = NULL;
1177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
11787f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
11797f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    return mod;
11803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
11813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
118214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnermod_ty
118314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc,
1184ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchaka                     int start, const char *ps1,
1185ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchaka                     const char *ps2, PyCompilerFlags *flags, int *errcode,
118614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                     PyArena *arena)
118714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{
118814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod_ty mod;
118914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    PyObject *filename;
119014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    filename = PyUnicode_DecodeFSDefault(filename_str);
119114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    if (filename == NULL)
119214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner        return NULL;
119314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2,
119414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner                                     flags, errcode, arena);
119514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    Py_DECREF(filename);
119614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner    return mod;
119714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner}
119814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner
1199a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsefile -- return node or set exception */
12001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1201a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
120295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
12031984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
1205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                      &_PyParser_Grammar,
1207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                      start, NULL, NULL, &err, flags);
1208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
1209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
12107f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
12114d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters
1212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
12131984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
12141984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1215a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsestring -- return node or set exception */
12161984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1217a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
121895292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlags(const char *str, int start, int flags)
12191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
1221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                        start, &err, flags);
1223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
1224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
12257f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
1226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
1227a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum}
1228a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
1229fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Petersnode *
123095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
1231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                        int start, int flags)
12326b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
1233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
1234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseStringFlagsFilename(str, filename,
1235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            &_PyParser_Grammar, start, &err, flags);
1236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
1237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
12387f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
1239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
12406b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
12416b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
12426b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Hellernode *
124395292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
12446b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
1245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
12466b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
12476b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
124866ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum/* May want to move a more generalized form of this to parsetok.c or
124966ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum   even parser modules. */
125066ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
125166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossumvoid
12527f2fee36401f7b987a368fe043637b3ae7116600Victor StinnerPyParser_ClearError(perrdetail *err)
12537f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{
12547f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(err);
12557f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner}
12567f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner
12577f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnervoid
125866ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van RossumPyParser_SetError(perrdetail *err)
125966ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum{
1260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    err_input(err);
126166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum}
126266ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
12637f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void
12647f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnererr_free(perrdetail *err)
12657f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{
12667f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    Py_CLEAR(err->filename);
12677f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner}
12687f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner
1269a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Set the error appropriate to the given input error code (see errcode.h) */
1270a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
1271a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumstatic void
1272f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterserr_input(perrdetail *err)
1273a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum{
1274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v, *w, *errtype, *errtext;
1275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *msg_obj = NULL;
1276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *msg = NULL;
127765fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka    int offset = err->offset;
12784c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner
1279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    errtype = PyExc_SyntaxError;
1280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    switch (err->error) {
1281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_ERROR:
1282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_SYNTAX:
1284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
1285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err->expected == INDENT)
1286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "expected an indented block";
1287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (err->token == INDENT)
1288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "unexpected indent";
1289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (err->token == DEDENT)
1290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "unexpected unindent";
1291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
1292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errtype = PyExc_SyntaxError;
1293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "invalid syntax";
1294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TOKEN:
1297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "invalid token";
1298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOFS:
1300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "EOF while scanning triple-quoted string literal";
1301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1302f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOLS:
1303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "EOL while scanning string literal";
1304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_INTR:
1306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!PyErr_Occurred())
1307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetNone(PyExc_KeyboardInterrupt);
1308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto cleanup;
1309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_NOMEM:
1310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_NoMemory();
1311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto cleanup;
1312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOF:
1313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unexpected EOF while parsing";
1314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TABSPACE:
1316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_TabError;
1317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "inconsistent use of tabs and spaces in indentation";
1318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_OVERFLOW:
1320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "expression too long";
1321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_DEDENT:
1323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
1324f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unindent does not match any outer indentation level";
1325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TOODEEP:
1327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
1328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "too many levels of indentation";
1329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_DECODE: {
1331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *type, *value, *tb;
1332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Fetch(&type, &value, &tb);
1333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unknown decode error";
1334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (value != NULL)
1335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg_obj = PyObject_Str(value);
1336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(type);
1337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(value);
1338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(tb);
1339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_LINECONT:
1342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unexpected character after line continuation character";
1343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1345f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_IDENTIFIER:
1346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "invalid character in identifier";
1347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1348fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge    case E_BADSINGLE:
1349fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge        msg = "multiple statements found while compiling a single statement";
1350fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge        break;
1351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    default:
1352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "error=%d\n", err->error);
1353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unknown parsing error";
1354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
1355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* err->text may not be UTF-8 in case of decoding errors.
1357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       Explicitly convert to an object. */
1358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!err->text) {
1359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtext = Py_None;
1360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(Py_None);
1361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
136265fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        errtext = PyUnicode_DecodeUTF8(err->text, err->offset,
1363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                       "replace");
136465fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        if (errtext != NULL) {
136565fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            Py_ssize_t len = strlen(err->text);
136665fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            offset = (int)PyUnicode_GET_LENGTH(errtext);
136765fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            if (len != err->offset) {
136865fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                Py_DECREF(errtext);
136965fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                errtext = PyUnicode_DecodeUTF8(err->text, len,
137065fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                                               "replace");
137165fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            }
137265fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        }
1373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
13747f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    v = Py_BuildValue("(OiiN)", err->filename,
137565fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                      err->lineno, offset, errtext);
1376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v != NULL) {
1377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (msg_obj)
1378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w = Py_BuildValue("(OO)", msg_obj, v);
1379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
1380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w = Py_BuildValue("(sO)", msg, v);
1381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else
1382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        w = NULL;
1383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
1384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_SetObject(errtype, w);
1385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(w);
13863dbca81c9b7903e8d808089a6a76dc97807b3df3Georg Brandlcleanup:
1387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(msg_obj);
1388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err->text != NULL) {
1389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject_FREE(err->text);
1390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err->text = NULL;
1391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
13921984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
13931984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
13942f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
1395c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#if defined(USE_STACKCHECK)
1396c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#if defined(WIN32) && defined(_MSC_VER)
1397c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1398c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/* Stack checking for Microsoft C */
1399c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1400c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#include <malloc.h>
1401c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#include <excpt.h>
1402c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1403c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/*
1404c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware * Return non-zero when we run out of memory on the stack; zero otherwise.
1405c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware */
1406c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Wareint
1407c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary WarePyOS_CheckStack(void)
1408c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware{
1409c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware    __try {
1410c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        /* alloca throws a stack overflow exception if there's
1411c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware           not enough space left on the stack */
1412c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        alloca(PYOS_STACK_MARGIN * sizeof(void*));
1413c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        return 0;
1414c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware    } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
1415c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware                    EXCEPTION_EXECUTE_HANDLER :
1416c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware            EXCEPTION_CONTINUE_SEARCH) {
1417c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        int errcode = _resetstkoflw();
1418c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        if (errcode == 0)
1419c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        {
1420c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware            Py_FatalError("Could not reset the stack!");
1421c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware        }
1422c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware    }
1423c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware    return 1;
1424c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware}
1425c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1426c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#endif /* WIN32 && _MSC_VER */
1427c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1428c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/* Alternate implementations can be added here... */
1429c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
1430c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#endif /* USE_STACKCHECK */
1431c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware
143246f50726a0047ae81d478c3a206f587b8f35ed08Martin Panter/* Deprecated C API functions still provided for binary compatibility */
14333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
14343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseFile
143549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *)
14363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
14373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
14393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
14403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
144149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyParser_SimpleParseString
144249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *)
14433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseString(const char *str, int start)
14443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseStringFlags(str, start, 0);
14463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
144749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
144849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFile
144949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
145049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFile(FILE *fp, const char *name)
145149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, 0, NULL);
145349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
145449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
145549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileEx
145649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
145749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
145849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
146049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
146149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
146249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileFlags
146349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
146449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
146549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, 0, flags);
146749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
146849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
146949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_File
147049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
147149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
147249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
147449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
147549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
147649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileEx
147749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
147849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
147949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
148149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
148249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
148349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileFlags
148449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
148549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                PyCompilerFlags *flags)
148749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
148949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
149049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
149149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFile
149249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
149349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFile(FILE *f, const char *p)
149449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleFileExFlags(f, p, 0, NULL);
149649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
149749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
149849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFileEx
149949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
150049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFileEx(FILE *f, const char *p, int c)
150149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleFileExFlags(f, p, c, NULL);
150349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
150449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
150549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
150649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_String
150749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
150849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_String(const char *str, int s, PyObject *g, PyObject *l)
150949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_StringFlags(str, s, g, l, NULL);
151149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
151249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
151349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleString
151449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
151549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleString(const char *s)
151649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleStringFlags(s, NULL);
151849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
151949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
152049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef Py_CompileString
152149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
152249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPy_CompileString(const char *str, const char *p, int s)
152349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
15248334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl    return Py_CompileStringExFlags(str, p, s, NULL, -1);
15258334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl}
15268334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl
15278334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl#undef Py_CompileStringFlags
15288334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPyAPI_FUNC(PyObject *)
15298334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPy_CompileStringFlags(const char *str, const char *p, int s,
15308334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl                      PyCompilerFlags *flags)
15318334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl{
15328334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl    return Py_CompileStringExFlags(str, p, s, flags, -1);
153349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
153449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
153549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveOne
153649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
153749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveOne(FILE *f, const char *p)
153849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_InteractiveOneFlags(f, p, NULL);
154049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
154149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
154249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveLoop
154349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
154449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveLoop(FILE *f, const char *p)
154549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
1546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_InteractiveLoopFlags(f, p, NULL);
154749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
154849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
154949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
155049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
155149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
1552