Commits

Armin Rigo committed 5cfde74

Struct initializer.

Comments (0)

Files changed (2)

ffi/backend_ctypes.py

                         len1 = init
                         init = None
                     else:
+                        init = tuple(init)
                         len1 = len(init)
                     self._blob = (BItem._ctype * len1)()
                 if init is not None:
             def __init__(self, init):
                 self._blob = struct()
                 if init is not None:
-                    xxx
+                    init = tuple(init)
+                    if len(init) > len(fnames):
+                        raise ValueError("too many values for "
+                                         "struct %s initializer" % name)
+                    for value, fname, BField in zip(init, fnames, BFieldTypes):
+                        setattr(self._blob, fname, BField._to_ctypes(value))
         #
         for fname, BField in zip(fnames, BFieldTypes):
             def getter(self, fname=fname, BField=BField):

testing/backend_tests.py

         s.b = -23
         assert s.b == -23
         py.test.raises(OverflowError, "s.b = 32768")
+        #
+        s = ffi.new("struct foo", [-2, -3])
+        assert s.a == -2
+        assert s.b == -3
+        assert s.c == 0
+        #
+        py.test.raises(ValueError, ffi.new, "struct foo", [1, 2, 3, 4])
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.