[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