[pypy-svn] pypy default: Reduce duplicated code

amauryfa commits-noreply at bitbucket.org
Fri Dec 17 19:00:06 CET 2010


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: 
Changeset: r40094:4edaa71f829b
Date: 2010-11-06 22:37 +0000
http://bitbucket.org/pypy/pypy/changeset/4edaa71f829b/

Log:	Reduce duplicated code
	(transplanted from 5fed388540ecde4977b133a0f5e8e7f2513f776b)

diff --git a/pypy/module/cpyext/structmember.py b/pypy/module/cpyext/structmember.py
--- a/pypy/module/cpyext/structmember.py
+++ b/pypy/module/cpyext/structmember.py
@@ -9,35 +9,33 @@
 from pypy.module.cpyext.stringobject import (PyString_FromString,
                                              PyString_FromStringAndSize)
 from pypy.module.cpyext.typeobjectdefs import PyMemberDef
+from pypy.rlib.unroll import unrolling_iterable
+
+integer_converters = unrolling_iterable([
+    (structmemberdefs.T_SHORT,  rffi.SHORT,  PyInt_AsLong),
+    (structmemberdefs.T_INT,    rffi.INT,    PyInt_AsLong),
+    (structmemberdefs.T_LONG,   rffi.LONG,   PyInt_AsLong),
+    (structmemberdefs.T_USHORT, rffi.USHORT, PyInt_AsUnsignedLong),
+    (structmemberdefs.T_UINT,   rffi.UINT,   PyInt_AsUnsignedLong),
+    (structmemberdefs.T_ULONG,  rffi.ULONG,  PyInt_AsUnsignedLong),
+    (structmemberdefs.T_BYTE,   rffi.UCHAR,  PyInt_AsLong),
+    ])
 
 
 @cpython_api([PyObject, lltype.Ptr(PyMemberDef)], PyObject)
 def PyMember_GetOne(space, obj, w_member):
     addr = rffi.cast(ADDR, obj)
     addr += w_member.c_offset
+
     member_type = rffi.cast(lltype.Signed, w_member.c_type)
-    if member_type == structmemberdefs.T_SHORT:
-        result = rffi.cast(rffi.SHORTP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_INT:
-        result = rffi.cast(rffi.INTP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_LONG:
-        result = rffi.cast(rffi.LONGP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_USHORT:
-        result = rffi.cast(rffi.USHORTP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_UINT:
-        result = rffi.cast(rffi.UINTP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_ULONG:
-        result = rffi.cast(rffi.ULONGP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_BYTE:
-        result = rffi.cast(rffi.CCHARP, addr)
-        w_result = space.wrap(result[0])
-    elif member_type == structmemberdefs.T_STRING:
+    for converter in integer_converters:
+        typ, lltype, _ = converter
+        if typ == member_type
+            result = rffi.cast(rffi.CArrayPtr(lltype), addr)
+            w_result = space.wrap(result[0])
+            return w_result
+
+    if member_type == structmemberdefs.T_STRING:
         result = rffi.cast(rffi.CCHARPP, addr)
         if result[0]:
             w_result = PyString_FromString(space, result[0])
@@ -49,16 +47,19 @@
     elif member_type == structmemberdefs.T_CHAR:
         result = rffi.cast(rffi.CCHARP, addr)
         w_result = space.wrap(result[0])
-    elif member_type in [structmemberdefs.T_OBJECT,
-                         structmemberdefs.T_OBJECT_EX]:
+    elif member_type == structmemberdefs.T_OBJECT:
         obj_ptr = rffi.cast(PyObjectP, addr)
         if obj_ptr[0]:
             w_result = from_ref(space, obj_ptr[0])
         else:
-            if member_type == structmemberdefs.T_OBJECT_EX:
-                w_name = space.wrap(rffi.charp2str(w_member.c_name))
-                raise OperationError(space.w_AttributeError, w_name)
             w_result = space.w_None
+    elif member_type == T_OBJECT_EX:
+        obj_ptr = rffi.cast(PyObjectP, addr)
+        if obj_ptr[0]:
+            w_result = from_ref(space, obj_ptr[0])
+        else:
+            w_name = space.wrap(rffi.charp2str(w_member.c_name))
+            raise OperationError(space.w_AttributeError, w_name)
     else:
         raise OperationError(space.w_SystemError,
                              space.wrap("bad memberdescr type"))
@@ -86,35 +87,15 @@
             raise OperationError(space.w_TypeError,
                              space.wrap("can't delete numeric/char attribute"))
 
-    if member_type == structmemberdefs.T_SHORT:
-        w_long_value = PyInt_AsLong(space, w_value)
-        array = rffi.cast(rffi.SHORTP, addr)
-        array[0] = rffi.cast(rffi.SHORT, w_long_value)
-    elif member_type == structmemberdefs.T_INT:
-        w_long_value = PyInt_AsLong(space, w_value)
-        array = rffi.cast(rffi.INTP, addr)
-        array[0] = rffi.cast(rffi.INT, w_long_value)
-    elif member_type == structmemberdefs.T_LONG:
-        w_long_value = PyInt_AsLong(space, w_value)
-        array = rffi.cast(rffi.LONGP, addr)
-        array[0] = rffi.cast(rffi.LONG, w_long_value)
-    elif member_type == structmemberdefs.T_USHORT:
-        w_long_value = PyInt_AsUnsignedLong(space, w_value)
-        array = rffi.cast(rffi.USHORTP, addr)
-        array[0] = rffi.cast(rffi.USHORT, w_long_value)
-    elif member_type == structmemberdefs.T_UINT:
-        w_long_value = PyInt_AsUnsignedLong(space, w_value)
-        array = rffi.cast(rffi.UINTP, addr)
-        array[0] = rffi.cast(rffi.UINT, w_long_value)
-    elif member_type == structmemberdefs.T_ULONG:
-        w_long_value = PyInt_AsUnsignedLong(space, w_value)
-        array = rffi.cast(rffi.ULONGP, addr)
-        array[0] = rffi.cast(rffi.ULONG, w_long_value)
-    elif member_type == structmemberdefs.T_BYTE:
-        w_long_value = PyInt_AsLong(space, w_value)
-        array = rffi.cast(rffi.CCHARP, addr)
-        array[0] = rffi.cast(rffi.CHAR, w_long_value)
-    elif member_type == structmemberdefs.T_CHAR:
+    for converter in integer_converters:
+        typ, lltype, getter = converter
+        if typ == member_type:
+            value = getter(space, w_value)
+            array = rffi.cast(rffi.CarrayPtr(lltype), addr)
+            array[0] = rffi.cast(lltype, value)
+            return 0
+
+    if member_type == structmemberdefs.T_CHAR:
         str_value = space.str_w(w_value)
         if len(str_value) != 1:
             raise OperationError(space.w_TypeError,



More information about the Pypy-commit mailing list