[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