[pypy-commit] cffi default: Add 'relements' to enum ctypes.
arigo
noreply at buildbot.pypy.org
Fri Dec 14 18:19:33 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r1097:012670e62732
Date: 2012-12-14 18:19 +0100
http://bitbucket.org/cffi/cffi/changeset/012670e62732/
Log: Add 'relements' to enum ctypes.
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -443,6 +443,16 @@
return nosuchattr("elements");
}
+static PyObject *ctypeget_relements(CTypeDescrObject *ct, void *context)
+{
+ if (ct->ct_flags & CT_IS_ENUM) {
+ PyObject *res = PyTuple_GetItem(ct->ct_stuff, 0);
+ if (res) res = PyDict_Copy(res);
+ return res;
+ }
+ return nosuchattr("relements");
+}
+
static PyGetSetDef ctypedescr_getsets[] = {
{"kind", (getter)ctypeget_kind, NULL, "kind"},
{"cname", (getter)ctypeget_cname, NULL, "C name"},
@@ -454,6 +464,7 @@
{"ellipsis", (getter)ctypeget_ellipsis, NULL, "function has '...'"},
{"abi", (getter)ctypeget_abi, NULL, "function ABI"},
{"elements", (getter)ctypeget_elements, NULL, "enum elements"},
+ {"relements", (getter)ctypeget_relements, NULL, "enum elements, reverse"},
{NULL} /* sentinel */
};
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -1276,6 +1276,10 @@
# 'elements' is not the real dict, but merely a copy
BEnum.elements[2] = '??'
assert BEnum.elements == {-20: 'ab', 0: 'def', 1: 'c'}
+ #
+ BEnum = new_enum_type("bar", ('ab', 'cd'), (5, 5))
+ assert BEnum.elements == {5: 'ab'}
+ assert BEnum.relements == {'ab': 5, 'cd': 5}
def test_cast_to_enum():
BEnum = new_enum_type("foo", ('def', 'c', 'ab'), (0, 1, -20))
More information about the pypy-commit
mailing list