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

jandem at codespeak.net jandem at codespeak.net
Tue Apr 20 16:27:12 CEST 2010


Author: jandem
Date: Tue Apr 20 16:27:11 2010
New Revision: 73911

Modified:
   pypy/branch/cpython-extension/pypy/module/cpyext/slotdefs.py
   pypy/branch/cpython-extension/pypy/module/cpyext/test/test_arraymodule.py
Log:
Add wrappers for __setitem__, __delitem__ and slices.


Modified: pypy/branch/cpython-extension/pypy/module/cpyext/slotdefs.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/slotdefs.py	(original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/slotdefs.py	Tue Apr 20 16:27:11 2010
@@ -5,7 +5,7 @@
         PyObject
 from pypy.module.cpyext.typeobjectdefs import unaryfunc, wrapperfunc,\
         ternaryfunc, PyTypeObjectPtr, binaryfunc, getattrfunc, lenfunc,\
-        ssizeargfunc
+        ssizeargfunc, ssizessizeargfunc, ssizeobjargproc
 from pypy.module.cpyext.pyobject import from_ref
 from pypy.module.cpyext.state import State
 from pypy.interpreter.error import OperationError, operationerrfmt
@@ -62,6 +62,29 @@
     index = space.int_w(space.index(args_w[0]))
     return generic_cpy_call(space, func_target, w_self, index)
 
+def wrap_sq_setitem(space, w_self, w_args, func):
+    func_target = rffi.cast(ssizeobjargproc, func)
+    check_num_args(space, w_args, 2)
+    args_w = space.fixedview(w_args)
+    index = space.int_w(space.index(args_w[0]))
+    return generic_cpy_call(space, func_target, w_self, index, args_w[1])
+
+def wrap_sq_delitem(space, w_self, w_args, func):
+    func_target = rffi.cast(ssizeobjargproc, func)
+    check_num_args(space, w_args, 1)
+    args_w = space.fixedview(w_args)
+    index = space.int_w(space.index(args_w[0]))
+    null = lltype.nullptr(PyObject.TO)
+    return generic_cpy_call(space, func_target, w_self, index, null)
+
+def wrap_ssizessizeargfunc(space, w_self, w_args, func):
+    func_target = rffi.cast(ssizessizeargfunc, func)
+    check_num_args(space, w_args, 2)
+    args_w = space.fixedview(w_args)
+    start = space.int_w(args_w[0])
+    end = space.int_w(args_w[1])
+    return generic_cpy_call(space, func_target, w_self, start, end)
+
 @cpython_api([PyTypeObjectPtr, PyObject, PyObject], PyObject, external=True)
 def slot_tp_new(space, type, w_args, w_kwds):
     from pypy.module.cpyext.tupleobject import PyTuple_Check

Modified: pypy/branch/cpython-extension/pypy/module/cpyext/test/test_arraymodule.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/test/test_arraymodule.py	(original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/test/test_arraymodule.py	Tue Apr 20 16:27:11 2010
@@ -14,3 +14,21 @@
         arr.append(4)
         assert arr.tolist() == [1, 2, 3, 4]
         assert len(arr) == 4
+
+    def test_index(self):
+        module = self.import_module(name='array')
+        arr = module.array('i', [1,2,3,4])
+        assert arr[3] == 4
+        raises(IndexError, arr.__getitem__, 10)
+        del arr[2]
+        assert arr.tolist() == [1,2,4]
+        arr[2] = 99
+        assert arr.tolist() == [1,2,99]
+
+    def test_slice_get(self):
+        module = self.import_module(name='array')
+        arr = module.array('i', [1,2,3,4])
+        assert arr[:].tolist() == [1,2,3,4]
+        assert arr[1:].tolist() == [2,3,4]
+        assert arr[:2].tolist() == [1,2]
+        assert arr[1:3].tolist() == [2,3]



More information about the Pypy-commit mailing list