[pypy-svn] r72758 - in pypy/branch/cpython-extension/pypy/module/cpyext: . test

xoraxax at codespeak.net xoraxax at codespeak.net
Wed Mar 24 22:05:01 CET 2010


Author: xoraxax
Date: Wed Mar 24 22:05:00 2010
New Revision: 72758

Added:
   pypy/branch/cpython-extension/pypy/module/cpyext/test/test_tupleobject.py   (contents, props changed)
Modified:
   pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py
Log:
Gah, the new exception handling is annoying. Can you please fix this test, amaury? The exception of PyErr_BadInternallCall is eaten.

Added: pypy/branch/cpython-extension/pypy/module/cpyext/test/test_tupleobject.py
==============================================================================
--- (empty file)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/test/test_tupleobject.py	Wed Mar 24 22:05:00 2010
@@ -0,0 +1,11 @@
+import py.test
+
+from pypy.module.cpyext.test.test_cpyext import BaseApiTest
+
+class TestTupleObject(BaseApiTest):
+    def test_tupleobject(self, space, api):
+        assert not api.PyTuple_Check(space.w_None)
+        py.test.raises(TypeError, api.PyTuple_SetItem, space.w_None,
+                0, space.w_None)
+        api.PyTuple_SetItem(space.w_None, 0, space.w_None)
+        #api.PyErr_Clear()

Modified: pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py	(original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py	Wed Mar 24 22:05:00 2010
@@ -1,8 +1,14 @@
 from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, PyObject, Py_ssize_t
+from pypy.module.cpyext.api import cpython_api, PyObject, Py_ssize_t, \
+        general_check, CANNOT_FAIL
 from pypy.module.cpyext.macros import Py_DECREF
+from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
 from pypy.objspace.std.tupleobject import W_TupleObject
 
+ at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+def PyTuple_Check(space, w_obj):
+    w_type = space.w_tuple
+    return general_check(space, w_obj, w_type)
 
 @cpython_api([Py_ssize_t], PyObject)
 def PyTuple_New(space, size):
@@ -10,13 +16,15 @@
 
 @cpython_api([PyObject, Py_ssize_t, PyObject], rffi.INT_real, error=-1)
 def PyTuple_SetItem(space, w_t, pos, w_obj):
-    assert isinstance(w_t, W_TupleObject)
+    if not PyTuple_Check(space, w_t):
+        PyErr_BadInternalCall(space)
+    assert isinstance(w_t, W_TupleObject) # XXX add check here 
     w_t.wrappeditems[pos] = w_obj
-    Py_DECREF(space, w_obj) # SetItem steals a reference!
+    Py_DECREF(space, w_obj) # SetItem steals a reference! XXX this needs to go into the wrapper
     return 0
 
 @cpython_api([PyObject, Py_ssize_t], PyObject)
 def PyTuple_GetItem(space, w_t, pos):
-    assert isinstance(w_t, W_TupleObject)
+    assert isinstance(w_t, W_TupleObject) # XXX add check here
     w_obj = w_t.wrappeditems[pos]
     return w_obj



More information about the Pypy-commit mailing list