Author: Ronny Pfannschmidt <[email protected]>
Branch:
Changeset: r45115:fb08e97d38a0
Date: 2011-06-25 17:47 +0200
http://bitbucket.org/pypy/pypy/changeset/fb08e97d38a0/
Log: cpyext: basic beginning of PySet with New Add Discard Size/GET_SIZE
diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -39,6 +39,7 @@
import pypy.module.cpyext.object
import pypy.module.cpyext.stringobject
import pypy.module.cpyext.tupleobject
+import pypy.module.cpyext.setobject
import pypy.module.cpyext.dictobject
import pypy.module.cpyext.intobject
import pypy.module.cpyext.longobject
diff --git a/pypy/module/cpyext/setobject.py b/pypy/module/cpyext/setobject.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/setobject.py
@@ -0,0 +1,46 @@
+from pypy.interpreter.error import OperationError
+from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.module.cpyext.api import (cpython_api, Py_ssize_t, CANNOT_FAIL,
+ build_type_checkers)
+from pypy.module.cpyext.pyobject import (PyObject, PyObjectP, Py_DecRef,
+ borrow_from, make_ref, from_ref)
+from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
+from pypy.objspace.std.setobject import W_SetObject, newset
+from pypy.objspace.std.smalltupleobject import W_SmallTupleObject
+
+
+PySet_Check, PySet_CheckExact = build_type_checkers("Set")
+
+
+@cpython_api([PyObject], PyObject)
+def PySet_New(space, w_iterable):
+ if w_iterable is None:
+ return space.call_function(space.w_set)
+ else:
+ return space.call_function(space.w_set, w_iterable)
+
+@cpython_api([PyObject, PyObject], rffi.INT_real, error=-1)
+def PySet_Add(space, w_s, w_obj):
+ if not PySet_Check(space, w_s):
+ PyErr_BadInternalCall(space)
+ space.call_method(w_s, 'add', w_obj)
+ return 0
+
+@cpython_api([PyObject, PyObject], rffi.INT_real, error=-1)
+def PySet_Discard(space, w_s, w_obj):
+ if not PySet_Check(space, w_s):
+ PyErr_BadInternalCall(space)
+ space.call_method(w_s, 'discard', w_obj)
+ return 0
+
+
+@cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL)
+def PySet_GET_SIZE(space, w_s):
+ return space.int_w(space.len(w_s))
+
+@cpython_api([PyObject], Py_ssize_t, error=-1)
+def PySet_Size(space, ref):
+ if not PySet_Check(space, ref):
+ raise OperationError(space.w_TypeError,
+ space.wrap("expected set object"))
+ return PySet_GET_SIZE(space, ref)
diff --git a/pypy/module/cpyext/test/test_setobject.py
b/pypy/module/cpyext/test/test_setobject.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/test/test_setobject.py
@@ -0,0 +1,29 @@
+import py
+
+from pypy.module.cpyext.pyobject import PyObject, PyObjectP, make_ref, from_ref
+from pypy.module.cpyext.test.test_api import BaseApiTest
+from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.conftest import gettestobjspace
+
+
+class TestTupleObject(BaseApiTest):
+ def test_setobj(self, space, api):
+ assert not api.PySet_Check(space.w_None)
+ assert api.PySet_Add(space.w_None, space.w_None) == -1
+ api.PyErr_Clear()
+ w_set = space.call_function(space.w_set)
+ space.call_method(w_set, 'update', space.wrap([1,2,3,4]))
+ assert api.PySet_Size(w_set) == 4
+ assert api.PySet_GET_SIZE(w_set) == 4
+ raises(TypeError, api.PySet_Size(space.newlist([])))
+ api.PyErr_Clear()
+
+ def test_set_add_discard(self, space, api):
+ w_set = api.PySet_New(None)
+ assert api.PySet_Size(w_set) == 0
+ w_set = api.PySet_New(space.wrap([1,2,3,4]))
+ assert api.PySet_Size(w_set) == 4
+ api.PySet_Add(w_set, space.wrap(6))
+ assert api.PySet_Size(w_set) == 5
+ api.PySet_Discard(w_set, space.wrap(6))
+ assert api.PySet_Size(w_set) == 4
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit