Author: Amaury Forgeot d'Arc <[email protected]>
Branch:
Changeset: r58280:075b5c1e232b
Date: 2012-10-20 21:15 +0200
http://bitbucket.org/pypy/pypy/changeset/075b5c1e232b/
Log: cpyext: add PyErr_Display
diff --git a/pypy/module/cpyext/pyerrors.py b/pypy/module/cpyext/pyerrors.py
--- a/pypy/module/cpyext/pyerrors.py
+++ b/pypy/module/cpyext/pyerrors.py
@@ -284,6 +284,20 @@
"""Alias for PyErr_PrintEx(1)."""
PyErr_PrintEx(space, 1)
+@cpython_api([PyObject, PyObject, PyObject], lltype.Void)
+def PyErr_Display(space, w_type, w_value, tb):
+ if tb:
+ w_tb = from_ref(space, tb)
+ else:
+ w_tb = space.w_None
+ try:
+ space.call_function(space.sys.get("excepthook"),
+ w_type, w_value, w_tb)
+ except OperationError:
+ # Like CPython: This is wrong, but too many callers rely on
+ # this behavior.
+ pass
+
@cpython_api([PyObject, PyObject], rffi.INT_real, error=-1)
def PyTraceBack_Print(space, w_tb, w_file):
space.call_method(w_file, "write", space.wrap(
diff --git a/pypy/module/cpyext/test/test_pyerrors.py
b/pypy/module/cpyext/test/test_pyerrors.py
--- a/pypy/module/cpyext/test/test_pyerrors.py
+++ b/pypy/module/cpyext/test/test_pyerrors.py
@@ -219,6 +219,31 @@
assert e.errno == errno.EBADF
assert e.strerror == os.strerror(errno.EBADF)
+ def test_PyErr_Display(self):
+ module = self.import_extension('foo', [
+ ("display_error", "METH_VARARGS",
+ r'''
+ PyObject *type, *val, *tb;
+ PyErr_GetExcInfo(&type, &val, &tb);
+ PyErr_Display(type, val, tb);
+ Py_XDECREF(type);
+ Py_XDECREF(val);
+ Py_XDECREF(tb);
+ Py_RETURN_NONE;
+ '''),
+ ])
+ import sys, StringIO
+ sys.stderr = StringIO.StringIO()
+ try:
+ 1 / 0
+ except ZeroDivisionError:
+ module.display_error()
+ finally:
+ output = sys.stderr.getvalue()
+ sys.stderr = sys.__stderr__
+ assert "in test_PyErr_Display\n" in output
+ assert "ZeroDivisionError" in output
+
def test_GetSetExcInfo(self):
import sys
module = self.import_extension('foo', [
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit