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])