[pypy-commit] pypy default: Add PyTraceBack_Check()
amauryfa
noreply at buildbot.pypy.org
Sat Jun 4 01:11:14 CEST 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r44675:65eb873ee5e3
Date: 2011-05-27 20:01 +0200
http://bitbucket.org/pypy/pypy/changeset/65eb873ee5e3/
Log: Add PyTraceBack_Check()
diff --git a/pypy/module/cpyext/frameobject.py b/pypy/module/cpyext/frameobject.py
--- a/pypy/module/cpyext/frameobject.py
+++ b/pypy/module/cpyext/frameobject.py
@@ -1,6 +1,7 @@
from pypy.rpython.lltypesystem import rffi, lltype
from pypy.module.cpyext.api import (
- cpython_api, bootstrap_function, PyObjectFields, cpython_struct)
+ cpython_api, bootstrap_function, PyObjectFields, cpython_struct,
+ CANNOT_FAIL)
from pypy.module.cpyext.pyobject import (
PyObject, Py_DecRef, make_ref, from_ref, track_reference,
make_typedescr, get_typedescr)
@@ -9,6 +10,7 @@
from pypy.module.cpyext.funcobject import PyCodeObject
from pypy.interpreter.pyframe import PyFrame
from pypy.interpreter.pycode import PyCode
+from pypy.interpreter.pytraceback import PyTraceback
PyFrameObjectStruct = lltype.ForwardReference()
PyFrameObject = lltype.Ptr(PyFrameObjectStruct)
@@ -80,3 +82,8 @@
frame = space.interp_w(PyFrame, w_frame)
record_application_traceback(space, state.operror, frame, 0)
return 0
+
+ at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+def PyTraceBack_Check(space, w_obj):
+ obj = space.interpclass_w(w_obj)
+ return obj is not None and isinstance(obj, PyTraceback)
diff --git a/pypy/module/cpyext/test/test_frameobject.py b/pypy/module/cpyext/test/test_frameobject.py
--- a/pypy/module/cpyext/test/test_frameobject.py
+++ b/pypy/module/cpyext/test/test_frameobject.py
@@ -64,3 +64,31 @@
# Cython does not work on CPython as well...
assert exc.traceback.tb_lineno == 42 # should be 48
assert frame.f_lineno == 42
+
+ def test_traceback_check(self):
+ module = self.import_extension('foo', [
+ ("traceback_check", "METH_NOARGS",
+ """
+ int check;
+ PyObject *type, *value, *tb;
+ PyObject *ret = PyRun_String("XXX", Py_eval_input,
+ Py_None, Py_None);
+ if (ret) {
+ Py_DECREF(ret);
+ PyErr_SetString(PyExc_AssertionError, "should raise");
+ return NULL;
+ }
+ PyErr_Fetch(&type, &value, &tb);
+ check = PyTraceBack_Check(tb);
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(tb);
+ if (check) {
+ Py_RETURN_TRUE;
+ }
+ else {
+ Py_RETURN_FALSE;
+ }
+ """),
+ ])
+ assert module.traceback_check()
More information about the pypy-commit
mailing list