Home | History | Annotate | Download | only in Python
      1 
      2 /* Top level execution of Python code (including in __main__) */
      3 
      4 /* To help control the interfaces between the startup, execution and
      5  * shutdown code, the phases are split across separate modules (boostrap,
      6  * pythonrun, shutdown)
      7  */
      8 
      9 /* TODO: Cull includes following phase split */
     10 
     11 #include "Python.h"
     12 
     13 #include "Python-ast.h"
     14 #undef Yield /* undefine macro conflicting with winbase.h */
     15 #include "internal/pystate.h"
     16 #include "grammar.h"
     17 #include "node.h"
     18 #include "token.h"
     19 #include "parsetok.h"
     20 #include "errcode.h"
     21 #include "code.h"
     22 #include "symtable.h"
     23 #include "ast.h"
     24 #include "marshal.h"
     25 #include "osdefs.h"
     26 #include <locale.h>
     27 
     28 #ifdef HAVE_SIGNAL_H
     29 #include <signal.h>
     30 #endif
     31 
     32 #ifdef MS_WINDOWS
     33 #include "malloc.h" /* for alloca */
     34 #endif
     35 
     36 #ifdef MS_WINDOWS
     37 #undef BYTE
     38 #include "windows.h"
     39 #endif
     40 
     41 _Py_IDENTIFIER(builtins);
     42 _Py_IDENTIFIER(excepthook);
     43 _Py_IDENTIFIER(flush);
     44 _Py_IDENTIFIER(last_traceback);
     45 _Py_IDENTIFIER(last_type);
     46 _Py_IDENTIFIER(last_value);
     47 _Py_IDENTIFIER(ps1);
     48 _Py_IDENTIFIER(ps2);
     49 _Py_IDENTIFIER(stdin);
     50 _Py_IDENTIFIER(stdout);
     51 _Py_IDENTIFIER(stderr);
     52 _Py_static_string(PyId_string, "<string>");
     53 
     54 #ifdef __cplusplus
     55 extern "C" {
     56 #endif
     57 
     58 extern grammar _PyParser_Grammar; /* From graminit.c */
     59 
     60 /* Forward */
     61 static void flush_io(void);
     62 static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *,
     63                           PyCompilerFlags *, PyArena *);
     64 static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
     65                               PyCompilerFlags *);
     66 static void err_input(perrdetail *);
     67 static void err_free(perrdetail *);
     68 static int PyRun_InteractiveOneObjectEx(FILE *, PyObject *, PyCompilerFlags *);
     69 
     70 /* Parse input from a file and execute it */
     71 int
     72 PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
     73                      PyCompilerFlags *flags)
     74 {
     75     if (filename == NULL)
     76         filename = "???";
     77     if (Py_FdIsInteractive(fp, filename)) {
     78         int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
     79         if (closeit)
     80             fclose(fp);
     81         return err;
     82     }
     83     else
     84         return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
     85 }
     86 
     87 int
     88 PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
     89 {
     90     PyObject *filename, *v;
     91     int ret, err;
     92     PyCompilerFlags local_flags;
     93     int nomem_count = 0;
     94 #ifdef Py_REF_DEBUG
     95     int show_ref_count = PyThreadState_GET()->interp->core_config.show_ref_count;
     96 #endif
     97 
     98     filename = PyUnicode_DecodeFSDefault(filename_str);
     99     if (filename == NULL) {
    100         PyErr_Print();
    101         return -1;
    102     }
    103 
    104     if (flags == NULL) {
    105         flags = &local_flags;
    106         local_flags.cf_flags = 0;
    107     }
    108     v = _PySys_GetObjectId(&PyId_ps1);
    109     if (v == NULL) {
    110         _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> "));
    111         Py_XDECREF(v);
    112     }
    113     v = _PySys_GetObjectId(&PyId_ps2);
    114     if (v == NULL) {
    115         _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... "));
    116         Py_XDECREF(v);
    117     }
    118     err = 0;
    119     do {
    120         ret = PyRun_InteractiveOneObjectEx(fp, filename, flags);
    121         if (ret == -1 && PyErr_Occurred()) {
    122             /* Prevent an endless loop after multiple consecutive MemoryErrors
    123              * while still allowing an interactive command to fail with a
    124              * MemoryError. */
    125             if (PyErr_ExceptionMatches(PyExc_MemoryError)) {
    126                 if (++nomem_count > 16) {
    127                     PyErr_Clear();
    128                     err = -1;
    129                     break;
    130                 }
    131             } else {
    132                 nomem_count = 0;
    133             }
    134             PyErr_Print();
    135             flush_io();
    136         } else {
    137             nomem_count = 0;
    138         }
    139 #ifdef Py_REF_DEBUG
    140         if (show_ref_count) {
    141             _PyDebug_PrintTotalRefs();
    142         }
    143 #endif
    144     } while (ret != E_EOF);
    145     Py_DECREF(filename);
    146     return err;
    147 }
    148 
    149 /* compute parser flags based on compiler flags */
    150 static int PARSER_FLAGS(PyCompilerFlags *flags)
    151 {
    152     int parser_flags = 0;
    153     if (!flags)
    154         return 0;
    155     if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT)
    156         parser_flags |= PyPARSE_DONT_IMPLY_DEDENT;
    157     if (flags->cf_flags & PyCF_IGNORE_COOKIE)
    158         parser_flags |= PyPARSE_IGNORE_COOKIE;
    159     if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL)
    160         parser_flags |= PyPARSE_BARRY_AS_BDFL;
    161     return parser_flags;
    162 }
    163 
    164 #if 0
    165 /* Keep an example of flags with future keyword support. */
    166 #define PARSER_FLAGS(flags) \
    167     ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
    168                   PyPARSE_DONT_IMPLY_DEDENT : 0) \
    169                 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
    170                    PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
    171 #endif
    172 
    173 /* A PyRun_InteractiveOneObject() auxiliary function that does not print the
    174  * error on failure. */
    175 static int
    176 PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename,
    177                              PyCompilerFlags *flags)
    178 {
    179     PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name;
    180     mod_ty mod;
    181     PyArena *arena;
    182     const char *ps1 = "", *ps2 = "", *enc = NULL;
    183     int errcode = 0;
    184     _Py_IDENTIFIER(encoding);
    185     _Py_IDENTIFIER(__main__);
    186 
    187     mod_name = _PyUnicode_FromId(&PyId___main__); /* borrowed */
    188     if (mod_name == NULL) {
    189         return -1;
    190     }
    191 
    192     if (fp == stdin) {
    193         /* Fetch encoding from sys.stdin if possible. */
    194         v = _PySys_GetObjectId(&PyId_stdin);
    195         if (v && v != Py_None) {
    196             oenc = _PyObject_GetAttrId(v, &PyId_encoding);
    197             if (oenc)
    198                 enc = PyUnicode_AsUTF8(oenc);
    199             if (!enc)
    200                 PyErr_Clear();
    201         }
    202     }
    203     v = _PySys_GetObjectId(&PyId_ps1);
    204     if (v != NULL) {
    205         v = PyObject_Str(v);
    206         if (v == NULL)
    207             PyErr_Clear();
    208         else if (PyUnicode_Check(v)) {
    209             ps1 = PyUnicode_AsUTF8(v);
    210             if (ps1 == NULL) {
    211                 PyErr_Clear();
    212                 ps1 = "";
    213             }
    214         }
    215     }
    216     w = _PySys_GetObjectId(&PyId_ps2);
    217     if (w != NULL) {
    218         w = PyObject_Str(w);
    219         if (w == NULL)
    220             PyErr_Clear();
    221         else if (PyUnicode_Check(w)) {
    222             ps2 = PyUnicode_AsUTF8(w);
    223             if (ps2 == NULL) {
    224                 PyErr_Clear();
    225                 ps2 = "";
    226             }
    227         }
    228     }
    229     arena = PyArena_New();
    230     if (arena == NULL) {
    231         Py_XDECREF(v);
    232         Py_XDECREF(w);
    233         Py_XDECREF(oenc);
    234         return -1;
    235     }
    236     mod = PyParser_ASTFromFileObject(fp, filename, enc,
    237                                      Py_single_input, ps1, ps2,
    238                                      flags, &errcode, arena);
    239     Py_XDECREF(v);
    240     Py_XDECREF(w);
    241     Py_XDECREF(oenc);
    242     if (mod == NULL) {
    243         PyArena_Free(arena);
    244         if (errcode == E_EOF) {
    245             PyErr_Clear();
    246             return E_EOF;
    247         }
    248         return -1;
    249     }
    250     m = PyImport_AddModuleObject(mod_name);
    251     if (m == NULL) {
    252         PyArena_Free(arena);
    253         return -1;
    254     }
    255     d = PyModule_GetDict(m);
    256     v = run_mod(mod, filename, d, d, flags, arena);
    257     PyArena_Free(arena);
    258     if (v == NULL) {
    259         return -1;
    260     }
    261     Py_DECREF(v);
    262     flush_io();
    263     return 0;
    264 }
    265 
    266 int
    267 PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
    268 {
    269     int res;
    270 
    271     res = PyRun_InteractiveOneObjectEx(fp, filename, flags);
    272     if (res == -1) {
    273         PyErr_Print();
    274         flush_io();
    275     }
    276     return res;
    277 }
    278 
    279 int
    280 PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags)
    281 {
    282     PyObject *filename;
    283     int res;
    284 
    285     filename = PyUnicode_DecodeFSDefault(filename_str);
    286     if (filename == NULL) {
    287         PyErr_Print();
    288         return -1;
    289     }
    290     res = PyRun_InteractiveOneObject(fp, filename, flags);
    291     Py_DECREF(filename);
    292     return res;
    293 }
    294 
    295 
    296 /* Check whether a file maybe a pyc file: Look at the extension,
    297    the file type, and, if we may close it, at the first few bytes. */
    298 
    299 static int
    300 maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
    301 {
    302     if (strcmp(ext, ".pyc") == 0)
    303         return 1;
    304 
    305     /* Only look into the file if we are allowed to close it, since
    306        it then should also be seekable. */
    307     if (closeit) {
    308         /* Read only two bytes of the magic. If the file was opened in
    309            text mode, the bytes 3 and 4 of the magic (\r\n) might not
    310            be read as they are on disk. */
    311         unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
    312         unsigned char buf[2];
    313         /* Mess:  In case of -x, the stream is NOT at its start now,
    314            and ungetc() was used to push back the first newline,
    315            which makes the current stream position formally undefined,
    316            and a x-platform nightmare.
    317            Unfortunately, we have no direct way to know whether -x
    318            was specified.  So we use a terrible hack:  if the current
    319            stream position is not 0, we assume -x was specified, and
    320            give up.  Bug 132850 on SourceForge spells out the
    321            hopelessness of trying anything else (fseek and ftell
    322            don't work predictably x-platform for text-mode files).
    323         */
    324         int ispyc = 0;
    325         if (ftell(fp) == 0) {
    326             if (fread(buf, 1, 2, fp) == 2 &&
    327                 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
    328                 ispyc = 1;
    329             rewind(fp);
    330         }
    331         return ispyc;
    332     }
    333     return 0;
    334 }
    335 
    336 static int
    337 set_main_loader(PyObject *d, const char *filename, const char *loader_name)
    338 {
    339     PyInterpreterState *interp;
    340     PyThreadState *tstate;
    341     PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader;
    342     int result = 0;
    343 
    344     filename_obj = PyUnicode_DecodeFSDefault(filename);
    345     if (filename_obj == NULL)
    346         return -1;
    347     /* Get current thread state and interpreter pointer */
    348     tstate = PyThreadState_GET();
    349     interp = tstate->interp;
    350     bootstrap = PyObject_GetAttrString(interp->importlib,
    351                                        "_bootstrap_external");
    352     if (bootstrap != NULL) {
    353         loader_type = PyObject_GetAttrString(bootstrap, loader_name);
    354         Py_DECREF(bootstrap);
    355     }
    356     if (loader_type == NULL) {
    357         Py_DECREF(filename_obj);
    358         return -1;
    359     }
    360     loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj);
    361     Py_DECREF(loader_type);
    362     if (loader == NULL) {
    363         return -1;
    364     }
    365     if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
    366         result = -1;
    367     }
    368     Py_DECREF(loader);
    369     return result;
    370 }
    371 
    372 int
    373 PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
    374                         PyCompilerFlags *flags)
    375 {
    376     PyObject *m, *d, *v;
    377     const char *ext;
    378     int set_file_name = 0, ret = -1;
    379     size_t len;
    380 
    381     m = PyImport_AddModule("__main__");
    382     if (m == NULL)
    383         return -1;
    384     Py_INCREF(m);
    385     d = PyModule_GetDict(m);
    386     if (PyDict_GetItemString(d, "__file__") == NULL) {
    387         PyObject *f;
    388         f = PyUnicode_DecodeFSDefault(filename);
    389         if (f == NULL)
    390             goto done;
    391         if (PyDict_SetItemString(d, "__file__", f) < 0) {
    392             Py_DECREF(f);
    393             goto done;
    394         }
    395         if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) {
    396             Py_DECREF(f);
    397             goto done;
    398         }
    399         set_file_name = 1;
    400         Py_DECREF(f);
    401     }
    402     len = strlen(filename);
    403     ext = filename + len - (len > 4 ? 4 : 0);
    404     if (maybe_pyc_file(fp, filename, ext, closeit)) {
    405         FILE *pyc_fp;
    406         /* Try to run a pyc file. First, re-open in binary */
    407         if (closeit)
    408             fclose(fp);
    409         if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) {
    410             fprintf(stderr, "python: Can't reopen .pyc file\n");
    411             goto done;
    412         }
    413 
    414         if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
    415             fprintf(stderr, "python: failed to set __main__.__loader__\n");
    416             ret = -1;
    417             fclose(pyc_fp);
    418             goto done;
    419         }
    420         v = run_pyc_file(pyc_fp, filename, d, d, flags);
    421     } else {
    422         /* When running from stdin, leave __main__.__loader__ alone */
    423         if (strcmp(filename, "<stdin>") != 0 &&
    424             set_main_loader(d, filename, "SourceFileLoader") < 0) {
    425             fprintf(stderr, "python: failed to set __main__.__loader__\n");
    426             ret = -1;
    427             goto done;
    428         }
    429         v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
    430                               closeit, flags);
    431     }
    432     flush_io();
    433     if (v == NULL) {
    434         Py_CLEAR(m);
    435         PyErr_Print();
    436         goto done;
    437     }
    438     Py_DECREF(v);
    439     ret = 0;
    440   done:
    441     if (set_file_name && PyDict_DelItemString(d, "__file__"))
    442         PyErr_Clear();
    443     Py_XDECREF(m);
    444     return ret;
    445 }
    446 
    447 int
    448 PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
    449 {
    450     PyObject *m, *d, *v;
    451     m = PyImport_AddModule("__main__");
    452     if (m == NULL)
    453         return -1;
    454     d = PyModule_GetDict(m);
    455     v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
    456     if (v == NULL) {
    457         PyErr_Print();
    458         return -1;
    459     }
    460     Py_DECREF(v);
    461     return 0;
    462 }
    463 
    464 static int
    465 parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
    466                    int *lineno, int *offset, PyObject **text)
    467 {
    468     int hold;
    469     PyObject *v;
    470     _Py_IDENTIFIER(msg);
    471     _Py_IDENTIFIER(filename);
    472     _Py_IDENTIFIER(lineno);
    473     _Py_IDENTIFIER(offset);
    474     _Py_IDENTIFIER(text);
    475 
    476     *message = NULL;
    477     *filename = NULL;
    478 
    479     /* new style errors.  `err' is an instance */
    480     *message = _PyObject_GetAttrId(err, &PyId_msg);
    481     if (!*message)
    482         goto finally;
    483 
    484     v = _PyObject_GetAttrId(err, &PyId_filename);
    485     if (!v)
    486         goto finally;
    487     if (v == Py_None) {
    488         Py_DECREF(v);
    489         *filename = _PyUnicode_FromId(&PyId_string);
    490         if (*filename == NULL)
    491             goto finally;
    492         Py_INCREF(*filename);
    493     }
    494     else {
    495         *filename = v;
    496     }
    497 
    498     v = _PyObject_GetAttrId(err, &PyId_lineno);
    499     if (!v)
    500         goto finally;
    501     hold = _PyLong_AsInt(v);
    502     Py_DECREF(v);
    503     if (hold < 0 && PyErr_Occurred())
    504         goto finally;
    505     *lineno = hold;
    506 
    507     v = _PyObject_GetAttrId(err, &PyId_offset);
    508     if (!v)
    509         goto finally;
    510     if (v == Py_None) {
    511         *offset = -1;
    512         Py_DECREF(v);
    513     } else {
    514         hold = _PyLong_AsInt(v);
    515         Py_DECREF(v);
    516         if (hold < 0 && PyErr_Occurred())
    517             goto finally;
    518         *offset = hold;
    519     }
    520 
    521     v = _PyObject_GetAttrId(err, &PyId_text);
    522     if (!v)
    523         goto finally;
    524     if (v == Py_None) {
    525         Py_DECREF(v);
    526         *text = NULL;
    527     }
    528     else {
    529         *text = v;
    530     }
    531     return 1;
    532 
    533 finally:
    534     Py_XDECREF(*message);
    535     Py_XDECREF(*filename);
    536     return 0;
    537 }
    538 
    539 void
    540 PyErr_Print(void)
    541 {
    542     PyErr_PrintEx(1);
    543 }
    544 
    545 static void
    546 print_error_text(PyObject *f, int offset, PyObject *text_obj)
    547 {
    548     const char *text;
    549     const char *nl;
    550 
    551     text = PyUnicode_AsUTF8(text_obj);
    552     if (text == NULL)
    553         return;
    554 
    555     if (offset >= 0) {
    556         if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n')
    557             offset--;
    558         for (;;) {
    559             nl = strchr(text, '\n');
    560             if (nl == NULL || nl-text >= offset)
    561                 break;
    562             offset -= (int)(nl+1-text);
    563             text = nl+1;
    564         }
    565         while (*text == ' ' || *text == '\t' || *text == '\f') {
    566             text++;
    567             offset--;
    568         }
    569     }
    570     PyFile_WriteString("    ", f);
    571     PyFile_WriteString(text, f);
    572     if (*text == '\0' || text[strlen(text)-1] != '\n')
    573         PyFile_WriteString("\n", f);
    574     if (offset == -1)
    575         return;
    576     PyFile_WriteString("    ", f);
    577     while (--offset > 0)
    578         PyFile_WriteString(" ", f);
    579     PyFile_WriteString("^\n", f);
    580 }
    581 
    582 static void
    583 handle_system_exit(void)
    584 {
    585     PyObject *exception, *value, *tb;
    586     int exitcode = 0;
    587 
    588     if (Py_InspectFlag)
    589         /* Don't exit if -i flag was given. This flag is set to 0
    590          * when entering interactive mode for inspecting. */
    591         return;
    592 
    593     PyErr_Fetch(&exception, &value, &tb);
    594     fflush(stdout);
    595     if (value == NULL || value == Py_None)
    596         goto done;
    597     if (PyExceptionInstance_Check(value)) {
    598         /* The error code should be in the `code' attribute. */
    599         _Py_IDENTIFIER(code);
    600         PyObject *code = _PyObject_GetAttrId(value, &PyId_code);
    601         if (code) {
    602             Py_DECREF(value);
    603             value = code;
    604             if (value == Py_None)
    605                 goto done;
    606         }
    607         /* If we failed to dig out the 'code' attribute,
    608            just let the else clause below print the error. */
    609     }
    610     if (PyLong_Check(value))
    611         exitcode = (int)PyLong_AsLong(value);
    612     else {
    613         PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr);
    614         /* We clear the exception here to avoid triggering the assertion
    615          * in PyObject_Str that ensures it won't silently lose exception
    616          * details.
    617          */
    618         PyErr_Clear();
    619         if (sys_stderr != NULL && sys_stderr != Py_None) {
    620             PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
    621         } else {
    622             PyObject_Print(value, stderr, Py_PRINT_RAW);
    623             fflush(stderr);
    624         }
    625         PySys_WriteStderr("\n");
    626         exitcode = 1;
    627     }
    628  done:
    629     /* Restore and clear the exception info, in order to properly decref
    630      * the exception, value, and traceback.      If we just exit instead,
    631      * these leak, which confuses PYTHONDUMPREFS output, and may prevent
    632      * some finalizers from running.
    633      */
    634     PyErr_Restore(exception, value, tb);
    635     PyErr_Clear();
    636     Py_Exit(exitcode);
    637     /* NOTREACHED */
    638 }
    639 
    640 void
    641 PyErr_PrintEx(int set_sys_last_vars)
    642 {
    643     PyObject *exception, *v, *tb, *hook;
    644 
    645     if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
    646         handle_system_exit();
    647     }
    648     PyErr_Fetch(&exception, &v, &tb);
    649     if (exception == NULL)
    650         return;
    651     PyErr_NormalizeException(&exception, &v, &tb);
    652     if (tb == NULL) {
    653         tb = Py_None;
    654         Py_INCREF(tb);
    655     }
    656     PyException_SetTraceback(v, tb);
    657     if (exception == NULL)
    658         return;
    659     /* Now we know v != NULL too */
    660     if (set_sys_last_vars) {
    661         if (_PySys_SetObjectId(&PyId_last_type, exception) < 0) {
    662             PyErr_Clear();
    663         }
    664         if (_PySys_SetObjectId(&PyId_last_value, v) < 0) {
    665             PyErr_Clear();
    666         }
    667         if (_PySys_SetObjectId(&PyId_last_traceback, tb) < 0) {
    668             PyErr_Clear();
    669         }
    670     }
    671     hook = _PySys_GetObjectId(&PyId_excepthook);
    672     if (hook) {
    673         PyObject* stack[3];
    674         PyObject *result;
    675 
    676         stack[0] = exception;
    677         stack[1] = v;
    678         stack[2] = tb;
    679         result = _PyObject_FastCall(hook, stack, 3);
    680         if (result == NULL) {
    681             PyObject *exception2, *v2, *tb2;
    682             if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
    683                 handle_system_exit();
    684             }
    685             PyErr_Fetch(&exception2, &v2, &tb2);
    686             PyErr_NormalizeException(&exception2, &v2, &tb2);
    687             /* It should not be possible for exception2 or v2
    688                to be NULL. However PyErr_Display() can't
    689                tolerate NULLs, so just be safe. */
    690             if (exception2 == NULL) {
    691                 exception2 = Py_None;
    692                 Py_INCREF(exception2);
    693             }
    694             if (v2 == NULL) {
    695                 v2 = Py_None;
    696                 Py_INCREF(v2);
    697             }
    698             fflush(stdout);
    699             PySys_WriteStderr("Error in sys.excepthook:\n");
    700             PyErr_Display(exception2, v2, tb2);
    701             PySys_WriteStderr("\nOriginal exception was:\n");
    702             PyErr_Display(exception, v, tb);
    703             Py_DECREF(exception2);
    704             Py_DECREF(v2);
    705             Py_XDECREF(tb2);
    706         }
    707         Py_XDECREF(result);
    708     } else {
    709         PySys_WriteStderr("sys.excepthook is missing\n");
    710         PyErr_Display(exception, v, tb);
    711     }
    712     Py_XDECREF(exception);
    713     Py_XDECREF(v);
    714     Py_XDECREF(tb);
    715 }
    716 
    717 static void
    718 print_exception(PyObject *f, PyObject *value)
    719 {
    720     int err = 0;
    721     PyObject *type, *tb;
    722     _Py_IDENTIFIER(print_file_and_line);
    723 
    724     if (!PyExceptionInstance_Check(value)) {
    725         err = PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
    726         err += PyFile_WriteString(Py_TYPE(value)->tp_name, f);
    727         err += PyFile_WriteString(" found\n", f);
    728         if (err)
    729             PyErr_Clear();
    730         return;
    731     }
    732 
    733     Py_INCREF(value);
    734     fflush(stdout);
    735     type = (PyObject *) Py_TYPE(value);
    736     tb = PyException_GetTraceback(value);
    737     if (tb && tb != Py_None)
    738         err = PyTraceBack_Print(tb, f);
    739     if (err == 0 &&
    740         _PyObject_HasAttrId(value, &PyId_print_file_and_line))
    741     {
    742         PyObject *message, *filename, *text;
    743         int lineno, offset;
    744         if (!parse_syntax_error(value, &message, &filename,
    745                                 &lineno, &offset, &text))
    746             PyErr_Clear();
    747         else {
    748             PyObject *line;
    749 
    750             Py_DECREF(value);
    751             value = message;
    752 
    753             line = PyUnicode_FromFormat("  File \"%U\", line %d\n",
    754                                           filename, lineno);
    755             Py_DECREF(filename);
    756             if (line != NULL) {
    757                 PyFile_WriteObject(line, f, Py_PRINT_RAW);
    758                 Py_DECREF(line);
    759             }
    760 
    761             if (text != NULL) {
    762                 print_error_text(f, offset, text);
    763                 Py_DECREF(text);
    764             }
    765 
    766             /* Can't be bothered to check all those
    767                PyFile_WriteString() calls */
    768             if (PyErr_Occurred())
    769                 err = -1;
    770         }
    771     }
    772     if (err) {
    773         /* Don't do anything else */
    774     }
    775     else {
    776         PyObject* moduleName;
    777         char* className;
    778         _Py_IDENTIFIER(__module__);
    779         assert(PyExceptionClass_Check(type));
    780         className = PyExceptionClass_Name(type);
    781         if (className != NULL) {
    782             char *dot = strrchr(className, '.');
    783             if (dot != NULL)
    784                 className = dot+1;
    785         }
    786 
    787         moduleName = _PyObject_GetAttrId(type, &PyId___module__);
    788         if (moduleName == NULL || !PyUnicode_Check(moduleName))
    789         {
    790             Py_XDECREF(moduleName);
    791             err = PyFile_WriteString("<unknown>", f);
    792         }
    793         else {
    794             if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins))
    795             {
    796                 err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW);
    797                 err += PyFile_WriteString(".", f);
    798             }
    799             Py_DECREF(moduleName);
    800         }
    801         if (err == 0) {
    802             if (className == NULL)
    803                       err = PyFile_WriteString("<unknown>", f);
    804             else
    805                       err = PyFile_WriteString(className, f);
    806         }
    807     }
    808     if (err == 0 && (value != Py_None)) {
    809         PyObject *s = PyObject_Str(value);
    810         /* only print colon if the str() of the
    811            object is not the empty string
    812         */
    813         if (s == NULL) {
    814             PyErr_Clear();
    815             err = -1;
    816             PyFile_WriteString(": <exception str() failed>", f);
    817         }
    818         else if (!PyUnicode_Check(s) ||
    819             PyUnicode_GetLength(s) != 0)
    820             err = PyFile_WriteString(": ", f);
    821         if (err == 0)
    822           err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
    823         Py_XDECREF(s);
    824     }
    825     /* try to write a newline in any case */
    826     if (err < 0) {
    827         PyErr_Clear();
    828     }
    829     err += PyFile_WriteString("\n", f);
    830     Py_XDECREF(tb);
    831     Py_DECREF(value);
    832     /* If an error happened here, don't show it.
    833        XXX This is wrong, but too many callers rely on this behavior. */
    834     if (err != 0)
    835         PyErr_Clear();
    836 }
    837 
    838 static const char cause_message[] =
    839     "\nThe above exception was the direct cause "
    840     "of the following exception:\n\n";
    841 
    842 static const char context_message[] =
    843     "\nDuring handling of the above exception, "
    844     "another exception occurred:\n\n";
    845 
    846 static void
    847 print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
    848 {
    849     int err = 0, res;
    850     PyObject *cause, *context;
    851 
    852     if (seen != NULL) {
    853         /* Exception chaining */
    854         PyObject *value_id = PyLong_FromVoidPtr(value);
    855         if (value_id == NULL || PySet_Add(seen, value_id) == -1)
    856             PyErr_Clear();
    857         else if (PyExceptionInstance_Check(value)) {
    858             PyObject *check_id = NULL;
    859             cause = PyException_GetCause(value);
    860             context = PyException_GetContext(value);
    861             if (cause) {
    862                 check_id = PyLong_FromVoidPtr(cause);
    863                 if (check_id == NULL) {
    864                     res = -1;
    865                 } else {
    866                     res = PySet_Contains(seen, check_id);
    867                     Py_DECREF(check_id);
    868                 }
    869                 if (res == -1)
    870                     PyErr_Clear();
    871                 if (res == 0) {
    872                     print_exception_recursive(
    873                         f, cause, seen);
    874                     err |= PyFile_WriteString(
    875                         cause_message, f);
    876                 }
    877             }
    878             else if (context &&
    879                 !((PyBaseExceptionObject *)value)->suppress_context) {
    880                 check_id = PyLong_FromVoidPtr(context);
    881                 if (check_id == NULL) {
    882                     res = -1;
    883                 } else {
    884                     res = PySet_Contains(seen, check_id);
    885                     Py_DECREF(check_id);
    886                 }
    887                 if (res == -1)
    888                     PyErr_Clear();
    889                 if (res == 0) {
    890                     print_exception_recursive(
    891                         f, context, seen);
    892                     err |= PyFile_WriteString(
    893                         context_message, f);
    894                 }
    895             }
    896             Py_XDECREF(context);
    897             Py_XDECREF(cause);
    898         }
    899         Py_XDECREF(value_id);
    900     }
    901     print_exception(f, value);
    902     if (err != 0)
    903         PyErr_Clear();
    904 }
    905 
    906 void
    907 PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
    908 {
    909     PyObject *seen;
    910     PyObject *f = _PySys_GetObjectId(&PyId_stderr);
    911     if (PyExceptionInstance_Check(value)
    912         && tb != NULL && PyTraceBack_Check(tb)) {
    913         /* Put the traceback on the exception, otherwise it won't get
    914            displayed.  See issue #18776. */
    915         PyObject *cur_tb = PyException_GetTraceback(value);
    916         if (cur_tb == NULL)
    917             PyException_SetTraceback(value, tb);
    918         else
    919             Py_DECREF(cur_tb);
    920     }
    921     if (f == Py_None) {
    922         /* pass */
    923     }
    924     else if (f == NULL) {
    925         _PyObject_Dump(value);
    926         fprintf(stderr, "lost sys.stderr\n");
    927     }
    928     else {
    929         /* We choose to ignore seen being possibly NULL, and report
    930            at least the main exception (it could be a MemoryError).
    931         */
    932         seen = PySet_New(NULL);
    933         if (seen == NULL)
    934             PyErr_Clear();
    935         print_exception_recursive(f, value, seen);
    936         Py_XDECREF(seen);
    937     }
    938 }
    939 
    940 PyObject *
    941 PyRun_StringFlags(const char *str, int start, PyObject *globals,
    942                   PyObject *locals, PyCompilerFlags *flags)
    943 {
    944     PyObject *ret = NULL;
    945     mod_ty mod;
    946     PyArena *arena;
    947     PyObject *filename;
    948 
    949     filename = _PyUnicode_FromId(&PyId_string); /* borrowed */
    950     if (filename == NULL)
    951         return NULL;
    952 
    953     arena = PyArena_New();
    954     if (arena == NULL)
    955         return NULL;
    956 
    957     mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
    958     if (mod != NULL)
    959         ret = run_mod(mod, filename, globals, locals, flags, arena);
    960     PyArena_Free(arena);
    961     return ret;
    962 }
    963 
    964 PyObject *
    965 PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals,
    966                   PyObject *locals, int closeit, PyCompilerFlags *flags)
    967 {
    968     PyObject *ret = NULL;
    969     mod_ty mod;
    970     PyArena *arena = NULL;
    971     PyObject *filename;
    972 
    973     filename = PyUnicode_DecodeFSDefault(filename_str);
    974     if (filename == NULL)
    975         goto exit;
    976 
    977     arena = PyArena_New();
    978     if (arena == NULL)
    979         goto exit;
    980 
    981     mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0,
    982                                      flags, NULL, arena);
    983     if (closeit)
    984         fclose(fp);
    985     if (mod == NULL) {
    986         goto exit;
    987     }
    988     ret = run_mod(mod, filename, globals, locals, flags, arena);
    989 
    990 exit:
    991     Py_XDECREF(filename);
    992     if (arena != NULL)
    993         PyArena_Free(arena);
    994     return ret;
    995 }
    996 
    997 static void
    998 flush_io(void)
    999 {
   1000     PyObject *f, *r;
   1001     PyObject *type, *value, *traceback;
   1002 
   1003     /* Save the current exception */
   1004     PyErr_Fetch(&type, &value, &traceback);
   1005 
   1006     f = _PySys_GetObjectId(&PyId_stderr);
   1007     if (f != NULL) {
   1008         r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
   1009         if (r)
   1010             Py_DECREF(r);
   1011         else
   1012             PyErr_Clear();
   1013     }
   1014     f = _PySys_GetObjectId(&PyId_stdout);
   1015     if (f != NULL) {
   1016         r = _PyObject_CallMethodId(f, &PyId_flush, NULL);
   1017         if (r)
   1018             Py_DECREF(r);
   1019         else
   1020             PyErr_Clear();
   1021     }
   1022 
   1023     PyErr_Restore(type, value, traceback);
   1024 }
   1025 
   1026 static PyObject *
   1027 run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
   1028             PyCompilerFlags *flags, PyArena *arena)
   1029 {
   1030     PyCodeObject *co;
   1031     PyObject *v;
   1032     co = PyAST_CompileObject(mod, filename, flags, -1, arena);
   1033     if (co == NULL)
   1034         return NULL;
   1035     v = PyEval_EvalCode((PyObject*)co, globals, locals);
   1036     Py_DECREF(co);
   1037     return v;
   1038 }
   1039 
   1040 static PyObject *
   1041 run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
   1042              PyObject *locals, PyCompilerFlags *flags)
   1043 {
   1044     PyCodeObject *co;
   1045     PyObject *v;
   1046     long magic;
   1047     long PyImport_GetMagicNumber(void);
   1048 
   1049     magic = PyMarshal_ReadLongFromFile(fp);
   1050     if (magic != PyImport_GetMagicNumber()) {
   1051         if (!PyErr_Occurred())
   1052             PyErr_SetString(PyExc_RuntimeError,
   1053                        "Bad magic number in .pyc file");
   1054         goto error;
   1055     }
   1056     /* Skip the rest of the header. */
   1057     (void) PyMarshal_ReadLongFromFile(fp);
   1058     (void) PyMarshal_ReadLongFromFile(fp);
   1059     (void) PyMarshal_ReadLongFromFile(fp);
   1060     if (PyErr_Occurred()) {
   1061         goto error;
   1062     }
   1063     v = PyMarshal_ReadLastObjectFromFile(fp);
   1064     if (v == NULL || !PyCode_Check(v)) {
   1065         Py_XDECREF(v);
   1066         PyErr_SetString(PyExc_RuntimeError,
   1067                    "Bad code object in .pyc file");
   1068         goto error;
   1069     }
   1070     fclose(fp);
   1071     co = (PyCodeObject *)v;
   1072     v = PyEval_EvalCode((PyObject*)co, globals, locals);
   1073     if (v && flags)
   1074         flags->cf_flags |= (co->co_flags & PyCF_MASK);
   1075     Py_DECREF(co);
   1076     return v;
   1077 error:
   1078     fclose(fp);
   1079     return NULL;
   1080 }
   1081 
   1082 PyObject *
   1083 Py_CompileStringObject(const char *str, PyObject *filename, int start,
   1084                        PyCompilerFlags *flags, int optimize)
   1085 {
   1086     PyCodeObject *co;
   1087     mod_ty mod;
   1088     PyArena *arena = PyArena_New();
   1089     if (arena == NULL)
   1090         return NULL;
   1091 
   1092     mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena);
   1093     if (mod == NULL) {
   1094         PyArena_Free(arena);
   1095         return NULL;
   1096     }
   1097     if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
   1098         PyObject *result = PyAST_mod2obj(mod);
   1099         PyArena_Free(arena);
   1100         return result;
   1101     }
   1102     co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
   1103     PyArena_Free(arena);
   1104     return (PyObject *)co;
   1105 }
   1106 
   1107 PyObject *
   1108 Py_CompileStringExFlags(const char *str, const char *filename_str, int start,
   1109                         PyCompilerFlags *flags, int optimize)
   1110 {
   1111     PyObject *filename, *co;
   1112     filename = PyUnicode_DecodeFSDefault(filename_str);
   1113     if (filename == NULL)
   1114         return NULL;
   1115     co = Py_CompileStringObject(str, filename, start, flags, optimize);
   1116     Py_DECREF(filename);
   1117     return co;
   1118 }
   1119 
   1120 /* For use in Py_LIMITED_API */
   1121 #undef Py_CompileString
   1122 PyObject *
   1123 PyCompileString(const char *str, const char *filename, int start)
   1124 {
   1125     return Py_CompileStringFlags(str, filename, start, NULL);
   1126 }
   1127 
   1128 struct symtable *
   1129 Py_SymtableStringObject(const char *str, PyObject *filename, int start)
   1130 {
   1131     struct symtable *st;
   1132     mod_ty mod;
   1133     PyCompilerFlags flags;
   1134     PyArena *arena;
   1135 
   1136     arena = PyArena_New();
   1137     if (arena == NULL)
   1138         return NULL;
   1139 
   1140     flags.cf_flags = 0;
   1141     mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena);
   1142     if (mod == NULL) {
   1143         PyArena_Free(arena);
   1144         return NULL;
   1145     }
   1146     st = PySymtable_BuildObject(mod, filename, 0);
   1147     PyArena_Free(arena);
   1148     return st;
   1149 }
   1150 
   1151 struct symtable *
   1152 Py_SymtableString(const char *str, const char *filename_str, int start)
   1153 {
   1154     PyObject *filename;
   1155     struct symtable *st;
   1156 
   1157     filename = PyUnicode_DecodeFSDefault(filename_str);
   1158     if (filename == NULL)
   1159         return NULL;
   1160     st = Py_SymtableStringObject(str, filename, start);
   1161     Py_DECREF(filename);
   1162     return st;
   1163 }
   1164 
   1165 /* Preferred access to parser is through AST. */
   1166 mod_ty
   1167 PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start,
   1168                              PyCompilerFlags *flags, PyArena *arena)
   1169 {
   1170     mod_ty mod;
   1171     PyCompilerFlags localflags;
   1172     perrdetail err;
   1173     int iflags = PARSER_FLAGS(flags);
   1174 
   1175     node *n = PyParser_ParseStringObject(s, filename,
   1176                                          &_PyParser_Grammar, start, &err,
   1177                                          &iflags);
   1178     if (flags == NULL) {
   1179         localflags.cf_flags = 0;
   1180         flags = &localflags;
   1181     }
   1182     if (n) {
   1183         flags->cf_flags |= iflags & PyCF_MASK;
   1184         mod = PyAST_FromNodeObject(n, flags, filename, arena);
   1185         PyNode_Free(n);
   1186     }
   1187     else {
   1188         err_input(&err);
   1189         mod = NULL;
   1190     }
   1191     err_free(&err);
   1192     return mod;
   1193 }
   1194 
   1195 mod_ty
   1196 PyParser_ASTFromString(const char *s, const char *filename_str, int start,
   1197                        PyCompilerFlags *flags, PyArena *arena)
   1198 {
   1199     PyObject *filename;
   1200     mod_ty mod;
   1201     filename = PyUnicode_DecodeFSDefault(filename_str);
   1202     if (filename == NULL)
   1203         return NULL;
   1204     mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena);
   1205     Py_DECREF(filename);
   1206     return mod;
   1207 }
   1208 
   1209 mod_ty
   1210 PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc,
   1211                            int start, const char *ps1,
   1212                            const char *ps2, PyCompilerFlags *flags, int *errcode,
   1213                            PyArena *arena)
   1214 {
   1215     mod_ty mod;
   1216     PyCompilerFlags localflags;
   1217     perrdetail err;
   1218     int iflags = PARSER_FLAGS(flags);
   1219 
   1220     node *n = PyParser_ParseFileObject(fp, filename, enc,
   1221                                        &_PyParser_Grammar,
   1222                                        start, ps1, ps2, &err, &iflags);
   1223     if (flags == NULL) {
   1224         localflags.cf_flags = 0;
   1225         flags = &localflags;
   1226     }
   1227     if (n) {
   1228         flags->cf_flags |= iflags & PyCF_MASK;
   1229         mod = PyAST_FromNodeObject(n, flags, filename, arena);
   1230         PyNode_Free(n);
   1231     }
   1232     else {
   1233         err_input(&err);
   1234         if (errcode)
   1235             *errcode = err.error;
   1236         mod = NULL;
   1237     }
   1238     err_free(&err);
   1239     return mod;
   1240 }
   1241 
   1242 mod_ty
   1243 PyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc,
   1244                      int start, const char *ps1,
   1245                      const char *ps2, PyCompilerFlags *flags, int *errcode,
   1246                      PyArena *arena)
   1247 {
   1248     mod_ty mod;
   1249     PyObject *filename;
   1250     filename = PyUnicode_DecodeFSDefault(filename_str);
   1251     if (filename == NULL)
   1252         return NULL;
   1253     mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2,
   1254                                      flags, errcode, arena);
   1255     Py_DECREF(filename);
   1256     return mod;
   1257 }
   1258 
   1259 /* Simplified interface to parsefile -- return node or set exception */
   1260 
   1261 node *
   1262 PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
   1263 {
   1264     perrdetail err;
   1265     node *n = PyParser_ParseFileFlags(fp, filename, NULL,
   1266                                       &_PyParser_Grammar,
   1267                                       start, NULL, NULL, &err, flags);
   1268     if (n == NULL)
   1269         err_input(&err);
   1270     err_free(&err);
   1271 
   1272     return n;
   1273 }
   1274 
   1275 /* Simplified interface to parsestring -- return node or set exception */
   1276 
   1277 node *
   1278 PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
   1279 {
   1280     perrdetail err;
   1281     node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
   1282                                         start, &err, flags);
   1283     if (n == NULL)
   1284         err_input(&err);
   1285     err_free(&err);
   1286     return n;
   1287 }
   1288 
   1289 node *
   1290 PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
   1291                                         int start, int flags)
   1292 {
   1293     perrdetail err;
   1294     node *n = PyParser_ParseStringFlagsFilename(str, filename,
   1295                             &_PyParser_Grammar, start, &err, flags);
   1296     if (n == NULL)
   1297         err_input(&err);
   1298     err_free(&err);
   1299     return n;
   1300 }
   1301 
   1302 node *
   1303 PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
   1304 {
   1305     return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
   1306 }
   1307 
   1308 /* May want to move a more generalized form of this to parsetok.c or
   1309    even parser modules. */
   1310 
   1311 void
   1312 PyParser_ClearError(perrdetail *err)
   1313 {
   1314     err_free(err);
   1315 }
   1316 
   1317 void
   1318 PyParser_SetError(perrdetail *err)
   1319 {
   1320     err_input(err);
   1321 }
   1322 
   1323 static void
   1324 err_free(perrdetail *err)
   1325 {
   1326     Py_CLEAR(err->filename);
   1327 }
   1328 
   1329 /* Set the error appropriate to the given input error code (see errcode.h) */
   1330 
   1331 static void
   1332 err_input(perrdetail *err)
   1333 {
   1334     PyObject *v, *w, *errtype, *errtext;
   1335     PyObject *msg_obj = NULL;
   1336     const char *msg = NULL;
   1337     int offset = err->offset;
   1338 
   1339     errtype = PyExc_SyntaxError;
   1340     switch (err->error) {
   1341     case E_ERROR:
   1342         goto cleanup;
   1343     case E_SYNTAX:
   1344         errtype = PyExc_IndentationError;
   1345         if (err->expected == INDENT)
   1346             msg = "expected an indented block";
   1347         else if (err->token == INDENT)
   1348             msg = "unexpected indent";
   1349         else if (err->token == DEDENT)
   1350             msg = "unexpected unindent";
   1351         else if (err->expected == NOTEQUAL) {
   1352             errtype = PyExc_SyntaxError;
   1353             msg = "with Barry as BDFL, use '<>' instead of '!='";
   1354         }
   1355         else {
   1356             errtype = PyExc_SyntaxError;
   1357             msg = "invalid syntax";
   1358         }
   1359         break;
   1360     case E_TOKEN:
   1361         msg = "invalid token";
   1362         break;
   1363     case E_EOFS:
   1364         msg = "EOF while scanning triple-quoted string literal";
   1365         break;
   1366     case E_EOLS:
   1367         msg = "EOL while scanning string literal";
   1368         break;
   1369     case E_INTR:
   1370         if (!PyErr_Occurred())
   1371             PyErr_SetNone(PyExc_KeyboardInterrupt);
   1372         goto cleanup;
   1373     case E_NOMEM:
   1374         PyErr_NoMemory();
   1375         goto cleanup;
   1376     case E_EOF:
   1377         msg = "unexpected EOF while parsing";
   1378         break;
   1379     case E_TABSPACE:
   1380         errtype = PyExc_TabError;
   1381         msg = "inconsistent use of tabs and spaces in indentation";
   1382         break;
   1383     case E_OVERFLOW:
   1384         msg = "expression too long";
   1385         break;
   1386     case E_DEDENT:
   1387         errtype = PyExc_IndentationError;
   1388         msg = "unindent does not match any outer indentation level";
   1389         break;
   1390     case E_TOODEEP:
   1391         errtype = PyExc_IndentationError;
   1392         msg = "too many levels of indentation";
   1393         break;
   1394     case E_DECODE: {
   1395         PyObject *type, *value, *tb;
   1396         PyErr_Fetch(&type, &value, &tb);
   1397         msg = "unknown decode error";
   1398         if (value != NULL)
   1399             msg_obj = PyObject_Str(value);
   1400         Py_XDECREF(type);
   1401         Py_XDECREF(value);
   1402         Py_XDECREF(tb);
   1403         break;
   1404     }
   1405     case E_LINECONT:
   1406         msg = "unexpected character after line continuation character";
   1407         break;
   1408 
   1409     case E_IDENTIFIER:
   1410         msg = "invalid character in identifier";
   1411         break;
   1412     case E_BADSINGLE:
   1413         msg = "multiple statements found while compiling a single statement";
   1414         break;
   1415     default:
   1416         fprintf(stderr, "error=%d\n", err->error);
   1417         msg = "unknown parsing error";
   1418         break;
   1419     }
   1420     /* err->text may not be UTF-8 in case of decoding errors.
   1421        Explicitly convert to an object. */
   1422     if (!err->text) {
   1423         errtext = Py_None;
   1424         Py_INCREF(Py_None);
   1425     } else {
   1426         errtext = PyUnicode_DecodeUTF8(err->text, err->offset,
   1427                                        "replace");
   1428         if (errtext != NULL) {
   1429             Py_ssize_t len = strlen(err->text);
   1430             offset = (int)PyUnicode_GET_LENGTH(errtext);
   1431             if (len != err->offset) {
   1432                 Py_DECREF(errtext);
   1433                 errtext = PyUnicode_DecodeUTF8(err->text, len,
   1434                                                "replace");
   1435             }
   1436         }
   1437     }
   1438     v = Py_BuildValue("(OiiN)", err->filename,
   1439                       err->lineno, offset, errtext);
   1440     if (v != NULL) {
   1441         if (msg_obj)
   1442             w = Py_BuildValue("(OO)", msg_obj, v);
   1443         else
   1444             w = Py_BuildValue("(sO)", msg, v);
   1445     } else
   1446         w = NULL;
   1447     Py_XDECREF(v);
   1448     PyErr_SetObject(errtype, w);
   1449     Py_XDECREF(w);
   1450 cleanup:
   1451     Py_XDECREF(msg_obj);
   1452     if (err->text != NULL) {
   1453         PyObject_FREE(err->text);
   1454         err->text = NULL;
   1455     }
   1456 }
   1457 
   1458 
   1459 #if defined(USE_STACKCHECK)
   1460 #if defined(WIN32) && defined(_MSC_VER)
   1461 
   1462 /* Stack checking for Microsoft C */
   1463 
   1464 #include <malloc.h>
   1465 #include <excpt.h>
   1466 
   1467 /*
   1468  * Return non-zero when we run out of memory on the stack; zero otherwise.
   1469  */
   1470 int
   1471 PyOS_CheckStack(void)
   1472 {
   1473     __try {
   1474         /* alloca throws a stack overflow exception if there's
   1475            not enough space left on the stack */
   1476         alloca(PYOS_STACK_MARGIN * sizeof(void*));
   1477         return 0;
   1478     } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
   1479                     EXCEPTION_EXECUTE_HANDLER :
   1480             EXCEPTION_CONTINUE_SEARCH) {
   1481         int errcode = _resetstkoflw();
   1482         if (errcode == 0)
   1483         {
   1484             Py_FatalError("Could not reset the stack!");
   1485         }
   1486     }
   1487     return 1;
   1488 }
   1489 
   1490 #endif /* WIN32 && _MSC_VER */
   1491 
   1492 /* Alternate implementations can be added here... */
   1493 
   1494 #endif /* USE_STACKCHECK */
   1495 
   1496 /* Deprecated C API functions still provided for binary compatibility */
   1497 
   1498 #undef PyParser_SimpleParseFile
   1499 PyAPI_FUNC(node *)
   1500 PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
   1501 {
   1502     return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
   1503 }
   1504 
   1505 #undef PyParser_SimpleParseString
   1506 PyAPI_FUNC(node *)
   1507 PyParser_SimpleParseString(const char *str, int start)
   1508 {
   1509     return PyParser_SimpleParseStringFlags(str, start, 0);
   1510 }
   1511 
   1512 #undef PyRun_AnyFile
   1513 PyAPI_FUNC(int)
   1514 PyRun_AnyFile(FILE *fp, const char *name)
   1515 {
   1516     return PyRun_AnyFileExFlags(fp, name, 0, NULL);
   1517 }
   1518 
   1519 #undef PyRun_AnyFileEx
   1520 PyAPI_FUNC(int)
   1521 PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
   1522 {
   1523     return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
   1524 }
   1525 
   1526 #undef PyRun_AnyFileFlags
   1527 PyAPI_FUNC(int)
   1528 PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
   1529 {
   1530     return PyRun_AnyFileExFlags(fp, name, 0, flags);
   1531 }
   1532 
   1533 #undef PyRun_File
   1534 PyAPI_FUNC(PyObject *)
   1535 PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
   1536 {
   1537     return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
   1538 }
   1539 
   1540 #undef PyRun_FileEx
   1541 PyAPI_FUNC(PyObject *)
   1542 PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
   1543 {
   1544     return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
   1545 }
   1546 
   1547 #undef PyRun_FileFlags
   1548 PyAPI_FUNC(PyObject *)
   1549 PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
   1550                 PyCompilerFlags *flags)
   1551 {
   1552     return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
   1553 }
   1554 
   1555 #undef PyRun_SimpleFile
   1556 PyAPI_FUNC(int)
   1557 PyRun_SimpleFile(FILE *f, const char *p)
   1558 {
   1559     return PyRun_SimpleFileExFlags(f, p, 0, NULL);
   1560 }
   1561 
   1562 #undef PyRun_SimpleFileEx
   1563 PyAPI_FUNC(int)
   1564 PyRun_SimpleFileEx(FILE *f, const char *p, int c)
   1565 {
   1566     return PyRun_SimpleFileExFlags(f, p, c, NULL);
   1567 }
   1568 
   1569 
   1570 #undef PyRun_String
   1571 PyAPI_FUNC(PyObject *)
   1572 PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
   1573 {
   1574     return PyRun_StringFlags(str, s, g, l, NULL);
   1575 }
   1576 
   1577 #undef PyRun_SimpleString
   1578 PyAPI_FUNC(int)
   1579 PyRun_SimpleString(const char *s)
   1580 {
   1581     return PyRun_SimpleStringFlags(s, NULL);
   1582 }
   1583 
   1584 #undef Py_CompileString
   1585 PyAPI_FUNC(PyObject *)
   1586 Py_CompileString(const char *str, const char *p, int s)
   1587 {
   1588     return Py_CompileStringExFlags(str, p, s, NULL, -1);
   1589 }
   1590 
   1591 #undef Py_CompileStringFlags
   1592 PyAPI_FUNC(PyObject *)
   1593 Py_CompileStringFlags(const char *str, const char *p, int s,
   1594                       PyCompilerFlags *flags)
   1595 {
   1596     return Py_CompileStringExFlags(str, p, s, flags, -1);
   1597 }
   1598 
   1599 #undef PyRun_InteractiveOne
   1600 PyAPI_FUNC(int)
   1601 PyRun_InteractiveOne(FILE *f, const char *p)
   1602 {
   1603     return PyRun_InteractiveOneFlags(f, p, NULL);
   1604 }
   1605 
   1606 #undef PyRun_InteractiveLoop
   1607 PyAPI_FUNC(int)
   1608 PyRun_InteractiveLoop(FILE *f, const char *p)
   1609 {
   1610     return PyRun_InteractiveLoopFlags(f, p, NULL);
   1611 }
   1612 
   1613 #ifdef __cplusplus
   1614 }
   1615 #endif
   1616