Author: Armin Rigo <[email protected]>
Branch:
Changeset: r2122:7aea388413bd
Date: 2015-05-28 13:56 +0200
http://bitbucket.org/cffi/cffi/changeset/7aea388413bd/
Log: more about issue 198: Test and fix
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -1232,8 +1232,11 @@
{
const char *expected;
- if (force_lazy_struct(ct) < 0)
+ if (force_lazy_struct(ct) <= 0) {
+ if (!PyErr_Occurred())
+ PyErr_Format(PyExc_TypeError, "'%s' is opaque", ct->ct_name);
return -1;
+ }
if (ct->ct_flags & CT_UNION) {
Py_ssize_t n = PyObject_Size(init);
diff --git a/testing/cffi1/test_recompiler.py b/testing/cffi1/test_recompiler.py
--- a/testing/cffi1/test_recompiler.py
+++ b/testing/cffi1/test_recompiler.py
@@ -861,3 +861,23 @@
'test_constant_of_unknown_size', "stuff")
assert str(e.value) == ("constant CONSTANT: constant 'CONSTANT' is of "
"type 'opaque_t', whose size is not known")
+
+def test_variable_of_unknown_size():
+ ffi = FFI()
+ ffi.cdef("""
+ typedef ... opaque_t;
+ opaque_t globvar;
+ """)
+ lib = verify(ffi, 'test_constant_of_unknown_size', """
+ typedef char opaque_t[6];
+ opaque_t globvar = "hello";
+ """)
+ # can't read or write it at all
+ e = py.test.raises(TypeError, getattr, lib, 'globvar')
+ assert str(e.value) == "cdata 'opaque_t' is opaque"
+ e = py.test.raises(TypeError, setattr, lib, 'globvar', [])
+ assert str(e.value) == "'opaque_t' is opaque"
+ # but we can get its address
+ p = ffi.addressof(lib, 'globvar')
+ assert ffi.typeof(p) == ffi.typeof('opaque_t *')
+ assert ffi.string(ffi.cast("char *", p), 8) == "hello"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit