Author: Armin Rigo <[email protected]>
Branch:
Changeset: r84968:d1760e27726c
Date: 2016-06-06 18:03 +0200
http://bitbucket.org/pypy/pypy/changeset/d1760e27726c/
Log: update to cffi/0a5f59abb0e0
diff --git a/pypy/module/_cffi_backend/cdataobj.py
b/pypy/module/_cffi_backend/cdataobj.py
--- a/pypy/module/_cffi_backend/cdataobj.py
+++ b/pypy/module/_cffi_backend/cdataobj.py
@@ -420,6 +420,14 @@
w_result = ctype.ctitem.unpack_ptr(ctype, ptr, length)
return w_result
+ def dir(self, space):
+ from pypy.module._cffi_backend.ctypeptr import W_CTypePointer
+ ct = self.ctype
+ if isinstance(ct, W_CTypePointer):
+ ct = ct.ctitem
+ lst = ct.cdata_dir()
+ return space.newlist([space.wrap(s) for s in lst])
+
class W_CDataMem(W_CData):
"""This is used only by the results of cffi.cast('int', x)
@@ -602,5 +610,6 @@
__call__ = interp2app(W_CData.call),
__iter__ = interp2app(W_CData.iter),
__weakref__ = make_weakref_descr(W_CData),
+ __dir__ = interp2app(W_CData.dir),
)
W_CData.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/_cffi_backend/ctypeobj.py
b/pypy/module/_cffi_backend/ctypeobj.py
--- a/pypy/module/_cffi_backend/ctypeobj.py
+++ b/pypy/module/_cffi_backend/ctypeobj.py
@@ -256,6 +256,9 @@
def fget_elements(self, space): return self._fget('e')
def fget_relements(self, space):return self._fget('R')
+ def cdata_dir(self):
+ return []
+
W_CType.typedef = TypeDef(
'_cffi_backend.CTypeDescr',
diff --git a/pypy/module/_cffi_backend/ctypestruct.py
b/pypy/module/_cffi_backend/ctypestruct.py
--- a/pypy/module/_cffi_backend/ctypestruct.py
+++ b/pypy/module/_cffi_backend/ctypestruct.py
@@ -171,6 +171,12 @@
pass
return W_CType.getcfield(self, attr)
+ def cdata_dir(self):
+ if self.size < 0:
+ return []
+ self.force_lazy_struct()
+ return self._fields_dict.keys()
+
class W_CTypeStruct(W_CTypeStructOrUnion):
kind = "struct"
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -77,8 +77,8 @@
assert repr(p) == "<ctype 'signed char'>"
def check_dir(p, expected):
- got = set(name for name in dir(p) if not name.startswith('_'))
- assert got == set(expected)
+ got = [name for name in dir(p) if not name.startswith('_')]
+ assert got == sorted(expected)
def test_inspect_primitive_type():
p = new_primitive_type("signed char")
@@ -3608,3 +3608,23 @@
#
py.test.raises(ValueError, unpack, p0, -1)
py.test.raises(ValueError, unpack, p, -1)
+
+def test_cdata_dir():
+ BInt = new_primitive_type("int")
+ p = cast(BInt, 42)
+ check_dir(p, [])
+ p = newp(new_array_type(new_pointer_type(BInt), None), 5)
+ check_dir(p, [])
+ BStruct = new_struct_type("foo")
+ p = cast(new_pointer_type(BStruct), 0)
+ check_dir(p, []) # opaque
+ complete_struct_or_union(BStruct, [('a2', BInt, -1),
+ ('a1', BInt, -1)])
+ check_dir(p, ['a1', 'a2']) # always sorted
+ p = newp(new_pointer_type(BStruct), None)
+ check_dir(p, ['a1', 'a2'])
+ check_dir(p[0], ['a1', 'a2'])
+ pp = newp(new_pointer_type(new_pointer_type(BStruct)), p)
+ check_dir(pp, [])
+ check_dir(pp[0], ['a1', 'a2'])
+ check_dir(pp[0][0], ['a1', 'a2'])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit