[pypy-commit] creflect default: progress
arigo
noreply at buildbot.pypy.org
Thu Dec 4 19:12:50 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r151:558efbc52db3
Date: 2014-12-04 17:49 +0100
http://bitbucket.org/cffi/creflect/changeset/558efbc52db3/
Log: progress
diff --git a/zeffir/builder.c b/zeffir/builder.c
--- a/zeffir/builder.c
+++ b/zeffir/builder.c
@@ -286,7 +286,20 @@
static _crx_qual_type zef_get_user_type(_crx_builder_t *cb, const char *name)
{
- abort();
+ PyObject *name_obj;
+ _crx_qual_type result = { NULL, 0 };
+
+ if (PyErr_Occurred())
+ return result;
+
+ name_obj = combine_type_name(cb, NULL, name);
+ if (name_obj == NULL)
+ return result;
+
+ result.type = get_cached_type(cb, name_obj);
+ if (result.type == NULL)
+ PyErr_Format(ZefError, "undefined type: '%s'", name);
+ return result;
}
static _crx_type_t *zef_get_unknown_type(_crx_builder_t *cb, const char *name)
@@ -363,7 +376,8 @@
static void zef_error(_crx_builder_t *cb, const char *msg)
{
- abort();
+ if (!PyErr_Occurred())
+ PyErr_SetString(ZefError, msg);
}
static int load_creflect_main(ZefFFIObject *ffi, ZefLibObject *lib)
@@ -463,6 +477,25 @@
_crx_qual_type result;
const char *err = creflect_decl_parser(&builder.cb, str, &result);
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(ZefError)) {
+ PyObject *exc, *val, *tb, *ps;
+ PyErr_Fetch(&exc, &val, &tb);
+ ps = PyObject_Str(val);
+ if (ps != NULL && PyString_Check(ps)) {
+ PyErr_Format(exc, "at pos %zd: %s",
+ (size_t)(err - str), PyString_AS_STRING(ps));
+ Py_XDECREF(tb);
+ Py_XDECREF(val);
+ Py_XDECREF(exc);
+ }
+ else {
+ PyErr_Restore(exc, val, tb);
+ }
+ Py_XDECREF(ps);
+ }
+ return NULL;
+ }
if (err != NULL)
abort();
diff --git a/zeffir/ffi_obj.c b/zeffir/ffi_obj.c
--- a/zeffir/ffi_obj.c
+++ b/zeffir/ffi_obj.c
@@ -146,7 +146,7 @@
return NULL;
if (ct->ct_size < 0) {
- PyErr_Format(PyExc_ValueError, "don't know the size of ctype '%s': "
+ PyErr_Format(ZefError, "don't know the size of ctype '%s': "
"incomplete type", ct->ct_name);
return NULL;
}
diff --git a/zeffir/test/test_ctype.py b/zeffir/test/test_ctype.py
--- a/zeffir/test/test_ctype.py
+++ b/zeffir/test/test_ctype.py
@@ -90,4 +90,15 @@
def test_unknown_type():
ffi, lib = support.compile_and_open('ctype')
assert repr(ffi.typeof("unknown_t")) == "<ctype '$unknown_t'>"
- py.test.raises(ValueError, ffi.sizeof, "unknown_t")
+ py.test.raises(ffi.error, ffi.sizeof, "unknown_t")
+ py.test.raises(ffi.error, ffi.sizeof, " unknown_t ")
+ assert ffi.sizeof("unknown_t*") == ffi.sizeof("void *")
+
+def test_undefined_type():
+ ffi = support.new_ffi()
+ py.test.raises(ffi.error, ffi.typeof, "abcdef_missing_t")
+
+def test_parse_error():
+ ffi = support.new_ffi()
+ e = py.test.raises(ffi.error, ffi.typeof, "int int")
+ assert str(e.value) == "at pos 4: unexpected symbol"
diff --git a/zeffir/zeffir.c b/zeffir/zeffir.c
--- a/zeffir/zeffir.c
+++ b/zeffir/zeffir.c
@@ -53,4 +53,7 @@
Py_INCREF(ZefError);
if (PyModule_AddObject(m, "error", ZefError) < 0)
return;
+
+ if (PyDict_SetItemString(ZefFFI_Type.tp_dict, "error", ZefError) < 0)
+ return;
}
More information about the pypy-commit
mailing list