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