Author: Armin Rigo <ar...@tunes.org> Branch: cffi-1.0 Changeset: r1730:d6e79e8e8194 Date: 2015-04-16 14:26 +0200 http://bitbucket.org/cffi/cffi/changeset/d6e79e8e8194/
Log: in-progress diff --git a/new/manual.c b/new/manual.c --- a/new/manual.c +++ b/new/manual.c @@ -15,6 +15,10 @@ return ~a; } +struct foo_s { + int a; +}; + /************************************************************/ static void *_cffi_types[] = { @@ -97,22 +101,35 @@ static const struct _cffi_global_s _cffi_globals[] = { { "AA", &_cffi_const_AA, _CFFI_OP(_CFFI_OP_CONSTANT_INT, 0) }, { "BB", &_cffi_const_BB, _CFFI_OP(_CFFI_OP_CONSTANT, 2) }, - { "bb", &bb, _CFFI_OP(_CFFI_OP_VARIABLE, 2) }, + { "bb", &bb, _CFFI_OP(_CFFI_OP_GLOBAL_VAR, 1) }, { "foo42", &_cffi_f_foo42, _CFFI_OP(_CFFI_OP_CPYTHON_BLTN_V, 0) }, { "foo64", &_cffi_f_foo64, _CFFI_OP(_CFFI_OP_CPYTHON_BLTN_O, 4) }, }; +struct _cffi_align_foo_s { char x; struct foo_s y; }; + +static const struct _cffi_struct_union_s _cffi_struct_unions[] = { + { "foo_s", + sizeof(struct foo_s), + offsetof(struct _cffi_align_foo_s, y), + 0, + 1, 0 }, +}; + +static const struct _cffi_field_s _cffi_fields[] = { + { "a", offsetof(struct foo_s, a), sizeof(((struct foo_s *)0)->a), + _CFFI_OP(_CFFI_OP_NOOP, 1) }, +}; + static const struct _cffi_type_context_s _cffi_type_context = { _cffi_types, _cffi_globals, - NULL, /* no constants */ - NULL, - NULL, + _cffi_struct_unions, + _cffi_fields, NULL, NULL, 5, /* num_globals */ - 0, - 0, + 1, /* num_struct_unions */ 0, 0, }; diff --git a/new/recompiler.py b/new/recompiler.py --- a/new/recompiler.py +++ b/new/recompiler.py @@ -369,6 +369,13 @@ for tp1 in tp.fldtypes: self._do_collect_type(tp1) + def _generate_cpy_struct_decl(self, tp, name): + pass + + def _generate_cpy_struct_ctx(self, tp, name): + self._lsts["struct_union"].append( + ' { "%s", ') + _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype # ---------- diff --git a/new/test_recompiler.py b/new/test_recompiler.py --- a/new/test_recompiler.py +++ b/new/test_recompiler.py @@ -152,3 +152,14 @@ """) lib.aa = 5 assert dir(lib) == ['aa', 'ff', 'my_constant'] + +def test_verify_struct(): + ffi = FFI() + ffi.cdef("struct foo_s { int b; short a; };") + lib = verify(ffi, 'test_verify_struct', + "struct foo_s { short a; int b; };") + p = ffi.new("struct foo_s *", {'a': -32768, 'b': -2147483648}) + assert p.a == -32768 + assert p.b == -2147483648 + py.test.raises(OverflowError, "p.a -= 1") + py.test.raises(OverflowError, "p.b -= 1") _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit