Author: Ronny Pfannschmidt <ronny.pfannschm...@gmx.de> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit