Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r175:6fc30b084312 Date: 2014-12-05 19:09 +0100 http://bitbucket.org/cffi/creflect/changeset/6fc30b084312/
Log: more fixes to addressof() diff --git a/zeffir/cfunc.c b/zeffir/cfunc.c --- a/zeffir/cfunc.c +++ b/zeffir/cfunc.c @@ -11,6 +11,8 @@ } ZefFuncSupportObject; +#define ZefFuncSupport_Check(ob) (Py_TYPE(ob) == &ZefFuncSupport_Type) + static void zef_func_support_dealloc(ZefFuncSupportObject *zfs) { int i; diff --git a/zeffir/ffi_obj.c b/zeffir/ffi_obj.c --- a/zeffir/ffi_obj.c +++ b/zeffir/ffi_obj.c @@ -400,6 +400,7 @@ } else if (ZefLib_Check(obj)) { PyObject *attr, *name; + char *reason; if (fieldname == NULL) { PyErr_SetString(PyExc_TypeError, "addressof(Lib, fieldname) " @@ -409,17 +410,23 @@ name = PyString_FromString(fieldname); if (name == NULL) return NULL; - attr = lib_findattr((ZefLibObject *)obj, name); + attr = lib_findattr((ZefLibObject *)obj, name, ZefError); Py_DECREF(name); if (attr == NULL) return NULL; - if (ZefGlobSupport_Check(attr)) + if (ZefGlobSupport_Check(attr)) { return addressof_global_var((ZefGlobSupportObject *)attr); + } - PyErr_Format(PyExc_TypeError, - "cannot take the address of constant '%s'", - fieldname); + if (PyCFunction_Check(attr)) + reason = "declare that function as a function pointer instead"; + else + reason = "numeric constants don't have addresses"; + + PyErr_Format(PyExc_NotImplementedError, + "cannot take the address of '%s' (%s)", + fieldname, reason); return NULL; } else { diff --git a/zeffir/lib_obj.c b/zeffir/lib_obj.c --- a/zeffir/lib_obj.c +++ b/zeffir/lib_obj.c @@ -27,7 +27,7 @@ lib->l_dl_lib == NULL ? " (closed)" : ""); } -static PyObject *lib_findattr(ZefLibObject *lib, PyObject *name) +static PyObject *lib_findattr(ZefLibObject *lib, PyObject *name, PyObject *exc) { /* does not return a new reference! */ @@ -38,7 +38,7 @@ PyObject *x = PyDict_GetItem(lib->l_dict, name); if (x == NULL) { - PyErr_Format(PyExc_AttributeError, + PyErr_Format(exc, "lib '%.200s' has no function," " global variable or constant '%.200s'", lib->l_libname, @@ -50,7 +50,7 @@ static PyObject *lib_getattr(ZefLibObject *lib, PyObject *name) { - PyObject *x = lib_findattr(lib, name); + PyObject *x = lib_findattr(lib, name, PyExc_AttributeError); if (x == NULL) return NULL; @@ -63,7 +63,7 @@ static int lib_setattr(ZefLibObject *lib, PyObject *name, PyObject *val) { - PyObject *x = lib_findattr(lib, name); + PyObject *x = lib_findattr(lib, name, PyExc_AttributeError); if (x == NULL) return -1; diff --git a/zeffir/test/test_basic.py b/zeffir/test/test_basic.py --- a/zeffir/test/test_basic.py +++ b/zeffir/test/test_basic.py @@ -44,3 +44,7 @@ for i in range(50): p = ffi.new("char[]", "12345678" * i) assert ffi.string(p) == "12345678" * i + +def test_addressof_missing_glob(): + ffi, lib = support.compile_and_open('basic') + py.test.raises(ffi.error, ffi.addressof, lib, "some_missing_name") diff --git a/zeffir/test/test_function.py b/zeffir/test/test_function.py --- a/zeffir/test/test_function.py +++ b/zeffir/test/test_function.py @@ -26,3 +26,7 @@ p = ffi.new("char[]", 10) lib.returning_nothing(p) assert ffi.string(p) == "OK" + +def test_addressof_function(): + ffi, lib = support.compile_and_open('function') + py.test.raises(NotImplementedError, ffi.addressof, lib, 'simple_function') diff --git a/zeffir/zeffir.c b/zeffir/zeffir.c --- a/zeffir/zeffir.c +++ b/zeffir/zeffir.c @@ -15,8 +15,8 @@ #include "cdata.c" #include "cglob.c" #include "lib_obj.c" +#include "cfunc.c" #include "ffi_obj.c" -#include "cfunc.c" #include "builder.c" #include "../creflect/creflect_cdecl.c" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit