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

Reply via email to