Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r91924:85b1a22bbd65
Date: 2017-07-19 18:29 +0200
http://bitbucket.org/pypy/pypy/changeset/85b1a22bbd65/
Log: Add missing function PyObject_LengthHint
diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py
--- a/pypy/module/cpyext/object.py
+++ b/pypy/module/cpyext/object.py
@@ -462,6 +462,12 @@
fwrite(buf, 1, count, fp)
return 0
[email protected]("""
+ Py_ssize_t PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)""",
+ error=-1)
+def PyObject_LengthHint(space, w_o, defaultvalue):
+ return space.length_hint(w_o, defaultvalue)
+
@cpython_api([lltype.Signed], lltype.Void)
def _PyPyGC_AddMemoryPressure(space, report):
from rpython.rlib import rgc
diff --git a/pypy/module/cpyext/test/test_object.py
b/pypy/module/cpyext/test/test_object.py
--- a/pypy/module/cpyext/test/test_object.py
+++ b/pypy/module/cpyext/test/test_object.py
@@ -349,6 +349,27 @@
assert type(module.asbytes(sub1(b''))) is bytes
assert type(module.asbytes(sub2(b''))) is sub2
+ def test_LengthHint(self):
+ import operator
+ class WithLen:
+ def __len__(self):
+ return 1
+ def __length_hint__(self):
+ return 42
+ class NoLen:
+ def __length_hint__(self):
+ return 2
+ module = self.import_extension('test_LengthHint', [
+ ('length_hint', 'METH_VARARGS',
+ """
+ PyObject *obj = PyTuple_GET_ITEM(args, 0);
+ Py_ssize_t i = PyLong_AsSsize_t(PyTuple_GET_ITEM(args, 1));
+ return PyLong_FromSsize_t(PyObject_LengthHint(obj, i));
+ """)])
+ assert module.length_hint(WithLen(), 5) ==
operator.length_hint(WithLen(), 5) == 1
+ assert module.length_hint(NoLen(), 5) == operator.length_hint(NoLen(),
5) == 2
+ assert module.length_hint(object(), 5) ==
operator.length_hint(object(), 5) == 5
+
def test_add_memory_pressure(self):
self.reset_memory_pressure() # for the potential skip
module = self.import_extension('foo', [
@@ -528,4 +549,3 @@
Py_RETURN_NONE;
""")])
assert module.release() is None
-
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit