[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