Author: Armin Rigo <ar...@tunes.org> Branch: cffi-1.0 Changeset: r77274:d3c204d81c2d Date: 2015-05-10 14:04 +0200 http://bitbucket.org/pypy/pypy/changeset/d3c204d81c2d/
Log: Update to cffi/d09c84106ff9 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 @@ -54,6 +54,9 @@ def _alignof(self): self.check_complete(w_errorcls=self.space.w_ValueError) + if self.alignment == -1: + self.force_lazy_struct() + assert self.alignment > 0 return self.alignment def _fget(self, attrchar): diff --git a/pypy/module/_cffi_backend/realize_c_type.py b/pypy/module/_cffi_backend/realize_c_type.py --- a/pypy/module/_cffi_backend/realize_c_type.py +++ b/pypy/module/_cffi_backend/realize_c_type.py @@ -216,8 +216,10 @@ def _realize_name(prefix, charp_src_name): # "xyz" => "struct xyz" - #"$xyz" => "xyz" - if charp_src_name[0] == '$' and charp_src_name[1] != '$': + # "$xyz" => "xyz" + # "$1" => "struct $1" + if (charp_src_name[0] == '$' and charp_src_name[1] != '$' + and not ('0' <= charp_src_name[1] <= '9')): return rffi.charp2str(rffi.ptradd(charp_src_name, 1)) else: return prefix + rffi.charp2str(charp_src_name) @@ -442,8 +444,10 @@ w_ctype.alignment = rffi.getintfield(s, 'c_alignment') # restore raise if rffi.getintfield(s, 'c_size') >= 0: - assert w_ctype.size == rffi.getintfield(s, 'c_size') - assert w_ctype.alignment == rffi.getintfield(s, 'c_alignment') + assert w_ctype.size == rffi.getintfield(s, 'c_size') + assert w_ctype.alignment > 0 + if rffi.getintfield(s, 'c_alignment') != -1: + assert w_ctype.alignment == rffi.getintfield(s, 'c_alignment') assert w_ctype._fields_list is not None # not lazy any more w_ctype._lazy_ffi = None diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py b/pypy/module/_cffi_backend/test/test_recompiler.py --- a/pypy/module/_cffi_backend/test/test_recompiler.py +++ b/pypy/module/_cffi_backend/test/test_recompiler.py @@ -484,6 +484,8 @@ "double ff1(double x) { return 42.5; }", includes=[ffi1]) assert lib.ff1(0) == 42.5 + assert ffi1.typeof("foo_t") is ffi.typeof("foo_t") \ + is ffi.typeof("double") def test_include_1b(self): ffi1, lib1 = self.prepare( @@ -497,6 +499,7 @@ includes=[ffi1]) assert lib.foo2(42) == 37 assert lib.foo1(42) == 52 + assert lib.foo1 is lib1.foo1 def test_include_2(self): ffi1, lib1 = self.prepare( @@ -514,6 +517,7 @@ q = lib.ff2(p) assert q == p assert p.y == 42 + assert ffi1.typeof("struct foo_s") is ffi.typeof("struct foo_s") def test_include_3(self): ffi1, lib1 = self.prepare( @@ -528,6 +532,7 @@ includes=[ffi1]) assert lib.ff3(10) == 52 assert ffi.typeof(ffi.cast("sshort_t", 42)) is ffi.typeof("short") + assert ffi1.typeof("sshort_t") is ffi.typeof("sshort_t") def test_include_4(self): ffi1, lib1 = self.prepare( @@ -544,23 +549,28 @@ q = lib.ff4(p) assert q == p assert p.x == 52 + assert ffi1.typeof("mystruct_t") is ffi.typeof("mystruct_t") def test_include_5(self): - skip("also fails in 0.9.3") ffi1, lib1 = self.prepare( - "typedef struct { int x; } *mystruct_p;", + "typedef struct { int x[2]; int y; } *mystruct_p;", "test_include_5_parent", - "typedef struct { int x; } *mystruct_p;") + "typedef struct { int x[2]; int y; } *mystruct_p;") ffi, lib = self.prepare( "mystruct_p ff5(mystruct_p);", "test_include_5", - "typedef struct {int x; } *mystruct_p; //usually from a #include\n" - "mystruct_p ff5(mystruct_p p) { p->x += 42; return p; }", + "typedef struct {int x[2]; int y; } *mystruct_p; //#include\n" + "mystruct_p ff5(mystruct_p p) { p->x[1] += 42; return p; }", includes=[ffi1]) - p = ffi.new("mystruct_p", [10]) + assert ffi.alignof(ffi.typeof("mystruct_p").item) == 4 + assert ffi1.typeof("mystruct_p") is ffi.typeof("mystruct_p") + p = ffi.new("mystruct_p", [[5, 10], -17]) q = lib.ff5(p) assert q == p - assert p.x == 52 + assert p.x[0] == 5 + assert p.x[1] == 52 + assert p.y == -17 + assert ffi.alignof(ffi.typeof(p[0])) == 4 def test_include_6(self): ffi1, lib1 = self.prepare( @@ -648,3 +658,16 @@ "struct foo_s(*)(int, struct bar_s)") s = lib.f(14, {'y': -3}) assert s.x == -42 + + def test_name_of_unnamed_struct(self): + ffi, lib = self.prepare( + "typedef struct { int x; } foo_t;\n" + "typedef struct { int y; } *bar_p;\n" + "typedef struct { int y; } **baz_pp;\n", + "test_name_of_unnamed_struct", + "typedef struct { int x; } foo_t;\n" + "typedef struct { int y; } *bar_p;\n" + "typedef struct { int y; } **baz_pp;\n") + assert repr(ffi.typeof("foo_t")) == "<ctype 'foo_t'>" + assert repr(ffi.typeof("bar_p")) == "<ctype 'struct $1 *'>" + assert repr(ffi.typeof("baz_pp")) == "<ctype 'struct $2 * *'>" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit