[pypy-commit] pypy ffi-backend: test_enum_type
arigo
noreply at buildbot.pypy.org
Mon Jun 25 18:19:51 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55821:e27df3a673dd
Date: 2012-06-25 17:58 +0200
http://bitbucket.org/pypy/pypy/changeset/e27df3a673dd/
Log: test_enum_type
diff --git a/pypy/module/_ffi_backend/__init__.py b/pypy/module/_ffi_backend/__init__.py
--- a/pypy/module/_ffi_backend/__init__.py
+++ b/pypy/module/_ffi_backend/__init__.py
@@ -16,6 +16,7 @@
'new_union_type': 'newtype.new_union_type',
'complete_struct_or_union': 'newtype.complete_struct_or_union',
'new_void_type': 'newtype.new_void_type',
+ 'new_enum_type': 'newtype.new_enum_type',
'newp': 'func.newp',
'cast': 'func.cast',
diff --git a/pypy/module/_ffi_backend/ctypeobj.py b/pypy/module/_ffi_backend/ctypeobj.py
--- a/pypy/module/_ffi_backend/ctypeobj.py
+++ b/pypy/module/_ffi_backend/ctypeobj.py
@@ -459,6 +459,33 @@
misc.write_raw_float_data(cdata, value, self.size)
+class W_CTypeEnum(W_CTypePrimitiveSigned):
+
+ def __init__(self, space, name, enumerators, enumvalues):
+ from pypy.module._ffi_backend.newtype import alignment
+ name = "enum " + name
+ size = rffi.sizeof(rffi.INT)
+ align = alignment(rffi.INT)
+ W_CTypePrimitiveSigned.__init__(self, space, size,
+ name, len(name), align)
+ self.enumerators2values = {} # str -> int
+ self.enumvalues2erators = {} # int -> str
+ for i in range(len(enumerators)):
+ self.enumerators2values[enumerators[i]] = enumvalues[i]
+ self.enumvalues2erators[enumvalues[i]] = enumerators[i]
+
+ def _getfields(self):
+ space = self.space
+ lst = []
+ for enumerator in self.enumerators2values:
+ enumvalue = self.enumerators2values[enumerator]
+ lst.append(space.newtuple([space.wrap(enumvalue),
+ space.wrap(enumerator)]))
+ w_lst = space.newlist(lst)
+ space.call_method(w_lst, 'sort')
+ return w_lst
+
+
class W_CTypeStructOrUnion(W_CType):
# fields added by complete_struct_or_union():
alignment = -1
diff --git a/pypy/module/_ffi_backend/newtype.py b/pypy/module/_ffi_backend/newtype.py
--- a/pypy/module/_ffi_backend/newtype.py
+++ b/pypy/module/_ffi_backend/newtype.py
@@ -185,3 +185,17 @@
def new_void_type(space):
ctype = ctypeobj.W_CTypeVoid(space)
return ctype
+
+# ____________________________________________________________
+
+ at unwrap_spec(name=str)
+def new_enum_type(space, name, w_enumerators, w_enumvalues):
+ enumerators_w = space.fixedview(w_enumerators)
+ enumvalues_w = space.fixedview(w_enumvalues)
+ if len(enumerators_w) != len(enumvalues_w):
+ raise OperationError(space.w_ValueError,
+ space.wrap("tuple args must have the same size"))
+ enumerators = [space.str_w(w) for w in enumerators_w]
+ enumvalues = [space.int_w(w) for w in enumvalues_w]
+ ctype = ctypeobj.W_CTypeEnum(space, name, enumerators, enumvalues)
+ return ctype
More information about the pypy-commit
mailing list