[pypy-commit] creflect default: tweaks

arigo noreply at buildbot.pypy.org
Thu Dec 4 23:09:13 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r155:7c6a10d45a9d
Date: 2014-12-04 22:59 +0100
http://bitbucket.org/cffi/creflect/changeset/7c6a10d45a9d/

Log:	tweaks

diff --git a/zeffir/builder.c b/zeffir/builder.c
--- a/zeffir/builder.c
+++ b/zeffir/builder.c
@@ -563,11 +563,11 @@
             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);
+                PyErr_Format(exc, "at pos %zd: %s",
+                             (size_t)(err - str), PyString_AS_STRING(ps));
             }
             else {
                 PyErr_Restore(exc, val, tb);
@@ -576,8 +576,7 @@
         }
         return NULL;
     }
-    if (err != NULL)
-        abort();
+    assert(err == NULL);   /* else, zef_error() must have been called */
 
     Py_INCREF(result.type);
     return result.type;
diff --git a/zeffir/lib_obj.c b/zeffir/lib_obj.c
--- a/zeffir/lib_obj.c
+++ b/zeffir/lib_obj.c
@@ -43,6 +43,12 @@
     return x;
 }
 
+static int lib_setattr(ZefLibObject *lib, PyObject *name, PyObject *val)
+{
+    PyErr_SetString(PyExc_AttributeError, "Lib object is read-only");
+    return -1;
+}
+
 static PyObject *lib_dir(PyObject *lib, PyObject *noarg)
 {
     return PyDict_Keys(((ZefLibObject *)lib)->l_dict);
@@ -71,7 +77,7 @@
     0,                                          /* tp_call */
     0,                                          /* tp_str */
     (getattrofunc)lib_getattr,                  /* tp_getattro */
-    0,                                          /* tp_setattro */
+    (setattrofunc)lib_setattr,                  /* tp_setattro */
     0,                                          /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT,                         /* tp_flags */
     0,                                          /* tp_doc */
@@ -88,7 +94,7 @@
     0,                                          /* tp_dict */
     0,                                          /* tp_descr_get */
     0,                                          /* tp_descr_set */
-    offsetof(ZefLibObject, l_dict),              /* tp_dictoffset */
+    offsetof(ZefLibObject, l_dict),             /* tp_dictoffset */
 };
 
 static void lib_dlerror(ZefLibObject *lib)
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
@@ -14,6 +14,8 @@
     ffi, lib = support.compile_and_open('basic')
     assert lib.forty_two == 42
     assert type(lib.forty_two) is int
+    py.test.raises(AttributeError, setattr, lib, 'forty_two', 43)
+    py.test.raises(AttributeError, delattr, lib, 'forty_two')
 
 def test_dir():
     ffi, lib = support.compile_and_open('basic')
@@ -21,7 +23,10 @@
 
 def test_no_special_attribute():
     ffi, lib = support.compile_and_open('basic')
-    py.test.raises(AttributeError, getattr, lib, '__class__')
+    for name in dir(object()):   # '__class__', '__str__', etc.
+        py.test.raises(AttributeError, getattr, lib, name)
+        py.test.raises(AttributeError, setattr, lib, name, '?')
+        py.test.raises(AttributeError, delattr, lib, name)
 
 def test_types():
     ffi = support.new_ffi()


More information about the pypy-commit mailing list