diff options
Diffstat (limited to 'Python/pythonrun.c')
| -rw-r--r-- | Python/pythonrun.c | 79 | 
1 files changed, 43 insertions, 36 deletions
| diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 2f8318b..afb4c51 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -76,7 +76,7 @@ extern void _PyGILState_Fini(void);  int Py_DebugFlag; /* Needed by parser.c */  int Py_VerboseFlag; /* Needed by import.c */  int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */ -int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */ +int Py_InspectFlag; /* Needed to determine whether to exit at SystemExit */  int Py_NoSiteFlag; /* Suppress 'import site' */  int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */  int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */ @@ -191,6 +191,9 @@ Py_InitializeEx(int install_sigs)      if (!_PyInt_Init())          Py_FatalError("Py_Initialize: can't init ints"); +    if (!_PyLong_Init()) +        Py_FatalError("Py_Initialize: can't init longs"); +      if (!PyByteArray_Init())          Py_FatalError("Py_Initialize: can't init bytearray"); @@ -705,7 +708,7 @@ initmain(void)          if (bimod == NULL ||              PyDict_SetItemString(d, "__builtins__", bimod) != 0)              Py_FatalError("can't add __builtins__ to __main__"); -        Py_DECREF(bimod); +        Py_XDECREF(bimod);      }  } @@ -714,20 +717,12 @@ initmain(void)  static void  initsite(void)  { -    PyObject *m, *f; +    PyObject *m;      m = PyImport_ImportModule("site");      if (m == NULL) { -        f = PySys_GetObject("stderr"); -        if (Py_VerboseFlag) { -            PyFile_WriteString( -                "'import site' failed; traceback:\n", f); -            PyErr_Print(); -        } -        else { -            PyFile_WriteString( -              "'import site' failed; use -v for traceback\n", f); -            PyErr_Clear(); -        } +        PyErr_Print(); +        Py_Finalize(); +        exit(1);      }      else {          Py_DECREF(m); @@ -994,55 +989,67 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,          return PyArg_ParseTuple(err, "O(ziiz)", message, filename,                                  lineno, offset, text); -    /* new style errors.  `err' is an instance */ +    *message = NULL; -    if (! (v = PyObject_GetAttrString(err, "msg"))) +    /* new style errors.  `err' is an instance */ +    *message = PyObject_GetAttrString(err, "msg"); +    if (!*message)          goto finally; -    *message = v; -    if (!(v = PyObject_GetAttrString(err, "filename"))) +    v = PyObject_GetAttrString(err, "filename"); +    if (!v)          goto finally; -    if (v == Py_None) +    if (v == Py_None) { +        Py_DECREF(v);          *filename = NULL; -    else if (! (*filename = PyString_AsString(v))) -        goto finally; +    } +    else { +        *filename = PyString_AsString(v); +        Py_DECREF(v); +        if (!*filename) +            goto finally; +    } -    Py_DECREF(v); -    if (!(v = PyObject_GetAttrString(err, "lineno"))) +    v = PyObject_GetAttrString(err, "lineno"); +    if (!v)          goto finally;      hold = PyInt_AsLong(v);      Py_DECREF(v); -    v = NULL;      if (hold < 0 && PyErr_Occurred())          goto finally;      *lineno = (int)hold; -    if (!(v = PyObject_GetAttrString(err, "offset"))) +    v = PyObject_GetAttrString(err, "offset"); +    if (!v)          goto finally;      if (v == Py_None) {          *offset = -1;          Py_DECREF(v); -        v = NULL;      } else {          hold = PyInt_AsLong(v);          Py_DECREF(v); -        v = NULL;          if (hold < 0 && PyErr_Occurred())              goto finally;          *offset = (int)hold;      } -    if (!(v = PyObject_GetAttrString(err, "text"))) +    v = PyObject_GetAttrString(err, "text"); +    if (!v)          goto finally; -    if (v == Py_None) +    if (v == Py_None) { +        Py_DECREF(v);          *text = NULL; -    else if (! (*text = PyString_AsString(v))) -        goto finally; -    Py_DECREF(v); +    } +    else { +        *text = PyString_AsString(v); +        Py_DECREF(v); +        if (!*text) +            goto finally; +    }      return 1;  finally: -    Py_XDECREF(v); +    Py_XDECREF(*message);      return 0;  } @@ -1057,7 +1064,7 @@ print_error_text(PyObject *f, int offset, const char *text)  {      char *nl;      if (offset >= 0) { -        if (offset > 0 && offset == (int)strlen(text)) +        if (offset > 0 && offset == strlen(text) && text[offset - 1] == '\n')              offset--;          for (;;) {              nl = strchr(text, '\n'); @@ -1161,7 +1168,7 @@ PyErr_PrintEx(int set_sys_last_vars)          PySys_SetObject("last_traceback", tb);      }      hook = PySys_GetObject("excepthook"); -    if (hook) { +    if (hook && hook != Py_None) {          PyObject *args = PyTuple_Pack(3,              exception, v, tb ? tb : Py_None);          PyObject *result = PyEval_CallObject(hook, args); @@ -1211,7 +1218,7 @@ PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)      int err = 0;      PyObject *f = PySys_GetObject("stderr");      Py_INCREF(value); -    if (f == NULL) +    if (f == NULL || f == Py_None)          fprintf(stderr, "lost sys.stderr\n");      else {          if (Py_FlushLine()) | 
