Author: Alex Gaynor <alex.gay...@gmail.com>
Branch: 
Changeset: r67901:988070ca4092
Date: 2013-11-09 08:36 -0800
http://bitbucket.org/pypy/pypy/changeset/988070ca4092/

Log:    Unroll ffi.new("struct s *", [a, list]) or ffi.new("struct s *", {a:
        dict})

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
@@ -95,6 +95,9 @@
         if not self._copy_from_same(cdata, w_ob):
             self.convert_struct_from_object(cdata, w_ob)
 
+    @jit.look_inside_iff(
+        lambda self, cdata, w_ob, optvarsize=-1: jit.isvirtual(w_ob)
+    )
     def convert_struct_from_object(self, cdata, w_ob, optvarsize=-1):
         self._check_only_one_argument_for_union(w_ob)
 
diff --git a/pypy/module/pypyjit/test_pypy_c/test_ffi.py 
b/pypy/module/pypyjit/test_pypy_c/test_ffi.py
--- a/pypy/module/pypyjit/test_pypy_c/test_ffi.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_ffi.py
@@ -228,7 +228,7 @@
             except ImportError:
                 sys.stderr.write('SKIP: cannot import cffi\n')
                 return 0
-                
+
             ffi = cffi.FFI()
 
             ffi.cdef("""
@@ -301,5 +301,30 @@
             f(1)
         #
         libm_name = get_libm_name(sys.platform)
-        log = self.run(main, [libm_name])
+        self.run(main, [libm_name])
         # assert did not crash
+
+    def test_cffi_init_struct_with_list(self):
+        def main(n):
+            import sys
+            try:
+                import cffi
+            except ImportError:
+                sys.stderr.write('SKIP: cannot import cffi\n')
+                return 0
+
+            ffi = cffi.FFI()
+            ffi.cdef("""
+            struct s {
+                int x;
+                int y;
+                int z;
+            };
+            """)
+
+            for i in xrange(n):
+                ffi.new("struct s *", [i, i, i])
+
+        log = self.run(main, [300])
+        loop, = log.loops_by_filename(self.filepath)
+        assert False, "XXX: fill this in"
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to