Commit a74288bc authored by Robert Bradshaw's avatar Robert Bradshaw

Avoid crashes in refnanny when PyFinalize gets messy, Sage now exits cleanly.

parent 55df14e8
...@@ -62,7 +62,7 @@ class Context(object): ...@@ -62,7 +62,7 @@ class Context(object):
else: else:
return None return None
def report_unraisable(e): cpdef report_unraisable(e):
try: try:
print "refnanny raised an exception: %s" % e print "refnanny raised an exception: %s" % e
except: except:
...@@ -73,6 +73,11 @@ def report_unraisable(e): ...@@ -73,6 +73,11 @@ def report_unraisable(e):
# exception-handling code. # exception-handling code.
cdef PyObject* NewContext(char* funcname, int lineno, char* filename) except NULL: cdef PyObject* NewContext(char* funcname, int lineno, char* filename) except NULL:
if Context is None:
# Context may be None during finalize phase.
# In that case, we don't want to be doing anything fancy
# like caching and resetting exceptions.
return NULL
cdef PyObject* type = NULL, *value = NULL, *tb = NULL cdef PyObject* type = NULL, *value = NULL, *tb = NULL
cdef PyObject* result = NULL cdef PyObject* result = NULL
PyErr_Fetch(&type, &value, &tb) PyErr_Fetch(&type, &value, &tb)
...@@ -125,18 +130,18 @@ cdef void DECREF(PyObject* ctx, PyObject* obj, int lineno): ...@@ -125,18 +130,18 @@ cdef void DECREF(PyObject* ctx, PyObject* obj, int lineno):
if obj is not NULL: Py_DECREF(<object>obj) if obj is not NULL: Py_DECREF(<object>obj)
cdef void FinishContext(PyObject** ctx): cdef void FinishContext(PyObject** ctx):
if ctx == NULL or ctx[0] == NULL:
# We should have reported an error earlier.
return
cdef PyObject* type = NULL, *value = NULL, *tb = NULL cdef PyObject* type = NULL, *value = NULL, *tb = NULL
cdef object errors = None cdef object errors = None
PyErr_Fetch(&type, &value, &tb) PyErr_Fetch(&type, &value, &tb)
try: try:
if ctx == NULL: assert False, "ctx is NULL"
if ctx[0] == NULL: assert False, "ctx[0] is NULL"
errors = (<object>ctx[0]).end() errors = (<object>ctx[0]).end()
pos = (<object>ctx[0]).filename, (<object>ctx[0]).name pos = (<object>ctx[0]).filename, (<object>ctx[0]).name
if errors: if errors:
print u"%s: %s()" % pos print u"%s: %s()" % pos
print errors # raise Error(errors) print errors
except Exception, e: except Exception, e:
report_unraisable(e) report_unraisable(e)
Py_XDECREF(<object>ctx[0]) Py_XDECREF(<object>ctx[0])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment