Author: Matti Picus <[email protected]>
Branch:
Changeset: r91613:776f717d31e0
Date: 2017-06-16 09:43 +0300
http://bitbucket.org/pypy/pypy/changeset/776f717d31e0/
Log: support PyFrozenSet_New
diff --git a/pypy/module/cpyext/setobject.py b/pypy/module/cpyext/setobject.py
--- a/pypy/module/cpyext/setobject.py
+++ b/pypy/module/cpyext/setobject.py
@@ -9,6 +9,7 @@
PySet_Check, PySet_CheckExact = build_type_checkers("Set")
+PyFrozenSet_Check, PyFrozenSet_CheckExact = build_type_checkers("FrozenSet")
@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
def PyAnySet_Check(space, w_obj):
@@ -91,7 +92,7 @@
"""Return the length of a set or frozenset object. Equivalent to
len(anyset). Raises a PyExc_SystemError if anyset is not a set, frozenset,
or an instance of a subtype."""
- if not PySet_Check(space, ref):
+ if not PyAnySet_Check(space, ref):
raise oefmt(space.w_TypeError, "expected set object")
return PySet_GET_SIZE(space, ref)
@@ -104,3 +105,20 @@
set, frozenset, or an instance of a subtype."""
w_res = space.contains(w_obj, w_key)
return space.int_w(w_res)
+
+@cpython_api([PyObject], PyObject)
+def PyFrozenSet_New(space, w_iterable):
+ """Return a new frozenset containing objects returned by the iterable.
+ The iterable may be NULL to create a new empty frozenset. Return the new
+ set on success or NULL on failure. Raise TypeError if iterable is
+ not actually iterable.
+
+ Now guaranteed to return a brand-new frozenset. Formerly,
+ frozensets of zero-length were a singleton. This got in the way of
+ building-up new frozensets with PySet_Add()."""
+ if w_iterable is None:
+ return space.call_function(space.w_frozenset)
+ else:
+ return space.call_function(space.w_frozenset, w_iterable)
+
+
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -1423,31 +1423,6 @@
in your code for properly supporting 64-bit systems."""
raise NotImplementedError
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyFrozenSet_Check(space, p):
- """Return true if p is a frozenset object or an instance of a
- subtype.
- """
- raise NotImplementedError
-
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyFrozenSet_CheckExact(space, p):
- """Return true if p is a frozenset object but not an instance of a
- subtype."""
- raise NotImplementedError
-
-@cpython_api([PyObject], PyObject)
-def PyFrozenSet_New(space, iterable):
- """Return a new frozenset containing objects returned by the iterable.
- The iterable may be NULL to create a new empty frozenset. Return the new
- set on success or NULL on failure. Raise TypeError if iterable is
- not actually iterable.
-
- Now guaranteed to return a brand-new frozenset. Formerly,
- frozensets of zero-length were a singleton. This got in the way of
- building-up new frozensets with PySet_Add()."""
- raise NotImplementedError
-
@cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP, rffi.CCHARP], PyObject)
def PyString_Decode(space, s, size, encoding, errors):
"""Create an object by decoding size bytes of the encoded buffer s using
the
diff --git a/pypy/module/cpyext/test/test_setobject.py
b/pypy/module/cpyext/test/test_setobject.py
--- a/pypy/module/cpyext/test/test_setobject.py
+++ b/pypy/module/cpyext/test/test_setobject.py
@@ -9,9 +9,11 @@
class TestTupleObject(BaseApiTest):
def test_setobj(self, space, api):
assert not api.PySet_Check(space.w_None)
+ assert not api.PyFrozenSet_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)
+ assert not api.PyFrozenSet_CheckExact(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
@@ -21,6 +23,8 @@
def test_set_add_discard(self, space, api):
w_set = api.PySet_New(None)
assert api.PySet_Size(w_set) == 0
+ w_set = api.PyFrozenSet_New(space.wrap([1,2,3,4]))
+ assert api.PySet_Size(w_set) == 4
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))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit