Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r2272:a6d472e27fab Date: 2015-09-23 09:51 +0200 http://bitbucket.org/cffi/cffi/changeset/a6d472e27fab/
Log: Issue #221: forbid values from enums with "..." from being accessed in ABI mode. diff --git a/cffi/api.py b/cffi/api.py --- a/cffi/api.py +++ b/cffi/api.py @@ -634,6 +634,7 @@ for key, tp in ffi._parser._declarations.items(): if not isinstance(tp, model.EnumType): continue + tp.check_not_partial() for enumname, enumval in zip(tp.enumerators, tp.enumvalues): if enumname not in library.__dict__: library.__dict__[enumname] = enumval diff --git a/cffi/recompiler.py b/cffi/recompiler.py --- a/cffi/recompiler.py +++ b/cffi/recompiler.py @@ -1006,6 +1006,8 @@ def _enum_ctx(self, tp, cname): type_index = self._typesdict[tp] type_op = CffiOp(OP_ENUM, -1) + if self.target_is_python: + tp.check_not_partial() for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): self._lsts["global"].append( GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op, diff --git a/testing/cffi0/backend_tests.py b/testing/cffi0/backend_tests.py --- a/testing/cffi0/backend_tests.py +++ b/testing/cffi0/backend_tests.py @@ -1,7 +1,7 @@ import py import platform import sys, ctypes -from cffi import FFI, CDefError, FFIError +from cffi import FFI, CDefError, FFIError, VerificationMissing from testing.support import * SIZE_OF_INT = ctypes.sizeof(ctypes.c_int) @@ -926,6 +926,14 @@ assert ffi.string(ffi.cast("enum foo", -16)) == "E" assert ffi.string(ffi.cast("enum foo", -8)) == "F" + def test_enum_partial(self): + ffi = FFI(backend=self.Backend()) + ffi.cdef(r"enum foo {A, ...}; enum bar { B, C };") + lib = ffi.dlopen(None) + py.test.raises(VerificationMissing, getattr, lib, "A") + assert lib.B == 0 + assert lib.C == 1 + def test_array_of_struct(self): ffi = FFI(backend=self.Backend()) ffi.cdef("struct foo { int a, b; };") diff --git a/testing/cffi1/test_re_python.py b/testing/cffi1/test_re_python.py --- a/testing/cffi1/test_re_python.py +++ b/testing/cffi1/test_re_python.py @@ -1,7 +1,7 @@ import sys import py from cffi import FFI -from cffi import recompiler, ffiplatform +from cffi import recompiler, ffiplatform, VerificationMissing from testing.udir import udir @@ -203,3 +203,10 @@ "foobar", _version=0x2594) assert str(e.value).startswith( "cffi out-of-line Python module 'foobar' has unknown version") + +def test_partial_enum(): + ffi = FFI() + ffi.cdef("enum foo { A, B, ... };") + ffi.set_source('test_partial_enum', None) + py.test.raises(VerificationMissing, ffi.emit_python_code, + str(tmpdir.join('test_partial_enum.py'))) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit