[pypy-commit] creflect default: type definitions

arigo noreply at buildbot.pypy.org
Thu Dec 4 13:18:16 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r146:910d0436c9ff
Date: 2014-12-04 13:18 +0100
http://bitbucket.org/cffi/creflect/changeset/910d0436c9ff/

Log:	type definitions

diff --git a/zeffir/builder.c b/zeffir/builder.c
--- a/zeffir/builder.c
+++ b/zeffir/builder.c
@@ -20,9 +20,6 @@
     PyObject *result;
     char *p;
 
-    if (PyErr_Occurred())
-        return NULL;
-
     base_name_len = (ct != NULL ? strlen(ct->ct_name) : 0);
     extra_name_len = strlen(extra_text);
     result = PyString_FromStringAndSize(NULL, base_name_len + extra_name_len);
@@ -72,6 +69,9 @@
 static _crx_type_t *_zef_primitive(_crx_builder_t *cb, Py_ssize_t size,
                                    const char *name, int flags)
 {
+    if (PyErr_Occurred())
+        return NULL;
+
     PyObject *name_obj;
     CTypeDescrObject *ct;
 
@@ -165,6 +165,9 @@
 static _crx_type_t *zef_get_pointer_type(_crx_builder_t *cb,
                                          _crx_type_t *totype, int toquals)
 {
+    if (PyErr_Occurred())
+        return NULL;
+
     const char *extra;
     PyObject *name_obj;
     CTypeDescrObject *ct;
@@ -205,6 +208,9 @@
 static _crx_type_t *zef_get_array_type(_crx_builder_t *cb, _crx_type_t *ctitem,
                                        size_t len)
 {
+    if (PyErr_Occurred())
+        return NULL;
+
     CTypeDescrObject *ct;
     PyObject *name_obj;
     char extra_text[32];
@@ -304,7 +310,11 @@
 static void zef_define_type(_crx_builder_t *cb, const char *name,
                             _crx_type_t *type, int quals)
 {
-    abort();
+    if (PyErr_Occurred())
+        return;
+
+    PyObject *types_dict = ((zeffir_builder_t *)cb)->types_dict;
+    PyDict_SetItemString(types_dict, name, (PyObject *)type);
 }
 
 static void zef_define_var(_crx_builder_t *cb, const char *name,
@@ -317,6 +327,9 @@
                             _crx_type_t *ret, _crx_qual_type args[], int nargs,
                             _crx_trampoline0_fn trampl, void *directcall)
 {
+    if (PyErr_Occurred())
+        return;
+
     PyObject *l_dict = ((zeffir_builder_t *)cb)->l_dict;
     PyObject *l_libname_obj = ((zeffir_builder_t *)cb)->lib->l_libname_obj;
 
@@ -333,6 +346,9 @@
 static void zef_define_num_const(_crx_builder_t *cb, const char *name,
                                  _crx_type_t *ct, _crx_num_const_t *value)
 {
+    if (PyErr_Occurred())
+        return;
+
     PyObject *l_dict = ((zeffir_builder_t *)cb)->l_dict;
 
     assert(ct->ct_flags & CT_PRIMITIVE_ANY);
diff --git a/zeffir/test/ctype.crx b/zeffir/test/ctype.crx
new file mode 100644
--- /dev/null
+++ b/zeffir/test/ctype.crx
@@ -0,0 +1,9 @@
+typedef long long foo_t;
+
+
+
+// CREFLECT: start
+
+typedef int foo_t;
+
+// CREFLECT: end
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
@@ -65,3 +65,11 @@
     assert repr(ffi.typeof("int [ ]")) == "<ctype 'int[]'>"
     assert repr(ffi.typeof("int * [ ]")) == "<ctype 'int *[]'>"
     assert repr(ffi.typeof("int ( * ) [ ]")) == "<ctype 'int(*)[]'>"
+
+def test_simple_typedef():
+    ffi, lib = support.compile_and_open('ctype')
+    assert ffi.sizeof("foo_t") == ffi.sizeof("long long")
+    if ffi.sizeof("long") == ffi.sizeof("long long"):
+        assert repr(ffi.typeof("foo_t")) == "<ctype 'long'>"
+    else:
+        assert repr(ffi.typeof("foo_t")) == "<ctype 'long long'>"


More information about the pypy-commit mailing list