Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r58827:3afbea59eb75
Date: 2012-11-11 13:59 +0100
http://bitbucket.org/pypy/pypy/changeset/3afbea59eb75/

Log:    Compactify a bit the code, reducing the proliferation of virtual
        methods.

diff --git a/pypy/module/_cffi_backend/ctypearray.py 
b/pypy/module/_cffi_backend/ctypearray.py
--- a/pypy/module/_cffi_backend/ctypearray.py
+++ b/pypy/module/_cffi_backend/ctypearray.py
@@ -98,14 +98,15 @@
     def get_vararg_type(self):
         return self.ctptr
 
-    def _fget_item(self):
-        return self.space.wrap(self.ctitem)
-
-    def _fget_length(self):
-        if self.length >= 0:
-            return self.space.wrap(self.length)
-        else:
-            return self.space.w_None
+    def _fget(self, attrchar):
+        if attrchar == 'i':     # item
+            return self.space.wrap(self.ctitem)
+        if attrchar == 'l':     # length
+            if self.length >= 0:
+                return self.space.wrap(self.length)
+            else:
+                return self.space.w_None
+        return W_CTypePtrOrArray._fget(self, attrchar)
 
 
 class W_CDataIter(Wrappable):
diff --git a/pypy/module/_cffi_backend/ctypeenum.py 
b/pypy/module/_cffi_backend/ctypeenum.py
--- a/pypy/module/_cffi_backend/ctypeenum.py
+++ b/pypy/module/_cffi_backend/ctypeenum.py
@@ -29,12 +29,15 @@
             self.enumerators2values[enumerators[i]] = enumvalues[i]
             self.enumvalues2erators[enumvalues[i]] = enumerators[i]
 
-    def _fget_elements(self):
-        space = self.space
-        w_dct = space.newdict()
-        for enumvalue, enumerator in self.enumvalues2erators.iteritems():
-            space.setitem(w_dct, space.wrap(enumvalue), space.wrap(enumerator))
-        return w_dct
+    def _fget(self, attrchar):
+        if attrchar == 'e':     # elements
+            space = self.space
+            w_dct = space.newdict()
+            for enumvalue, enumerator in self.enumvalues2erators.iteritems():
+                space.setitem(w_dct, space.wrap(enumvalue),
+                                     space.wrap(enumerator))
+            return w_dct
+        return W_CTypePrimitiveSigned._fget(self, attrchar)
 
     def string(self, cdataobj, maxlen):
         w_result = self.convert_to_object(cdataobj._cdata)
diff --git a/pypy/module/_cffi_backend/ctypefunc.py 
b/pypy/module/_cffi_backend/ctypefunc.py
--- a/pypy/module/_cffi_backend/ctypefunc.py
+++ b/pypy/module/_cffi_backend/ctypefunc.py
@@ -85,17 +85,17 @@
         argnames.append(')')
         return ''.join(argnames)
 
-    def _fget_args(self):
-        return self.space.newtuple([self.space.wrap(a) for a in self.fargs])
-
-    def _fget_result(self):
-        return self.space.wrap(self.ctitem)
-
-    def _fget_ellipsis(self):
-        return self.space.wrap(self.ellipsis)
-
-    def _fget_abi(self):
-        return self.space.wrap(clibffi.FFI_DEFAULT_ABI)     # XXX
+    def _fget(self, attrchar):
+        if attrchar == 'a':    # args
+            return self.space.newtuple([self.space.wrap(a)
+                                        for a in self.fargs])
+        if attrchar == 'r':    # result
+            return self.space.wrap(self.ctitem)
+        if attrchar == 'E':    # ellipsis
+            return self.space.wrap(self.ellipsis)
+        if attrchar == 'A':    # abi
+            return self.space.wrap(clibffi.FFI_DEFAULT_ABI)     # XXX
+        return W_CTypePtrBase._fget(self, attrchar)
 
 
     def call(self, funcaddr, args_w):
diff --git a/pypy/module/_cffi_backend/ctypeobj.py 
b/pypy/module/_cffi_backend/ctypeobj.py
--- a/pypy/module/_cffi_backend/ctypeobj.py
+++ b/pypy/module/_cffi_backend/ctypeobj.py
@@ -181,46 +181,26 @@
                   if space.findattr(w_self, space.wrap(name)) is not None]
         return space.newlist(lst)
 
-    def fget_kind(self, space):
-        return space.wrap(self.kind)      # class attribute
-
-    def _no_such_attribute(self):
+    def _fget(self, attrchar):
         space = self.space
+        if attrchar == 'k':     # kind
+            return space.wrap(self.kind)      # class attribute
+        if attrchar == 'c':     # cname
+            return space.wrap(self.name)
         raise operationerrfmt(space.w_AttributeError,
                               "cdata '%s' has no such attribute",
                               self.name)
 
-    _fget_item = _no_such_attribute
-    def fget_item(self, space):
-        return self._fget_item()
-
-    _fget_length = _no_such_attribute
-    def fget_length(self, space):
-        return self._fget_length()
-
-    _fget_fields = _no_such_attribute
-    def fget_fields(self, space):
-        return self._fget_fields()
-
-    _fget_args = _no_such_attribute
-    def fget_args(self, space):
-        return self._fget_args()
-
-    _fget_result = _no_such_attribute
-    def fget_result(self, space):
-        return self._fget_result()
-
-    _fget_ellipsis = _no_such_attribute
-    def fget_ellipsis(self, space):
-        return self._fget_ellipsis()
-
-    _fget_abi = _no_such_attribute
-    def fget_abi(self, space):
-        return self._fget_abi()
-
-    _fget_elements = _no_such_attribute
-    def fget_elements(self, space):
-        return self._fget_elements()
+    def fget_kind(self, space):     return self._fget('k')
+    def fget_cname(self, space):    return self._fget('c')
+    def fget_item(self, space):     return self._fget('i')
+    def fget_length(self, space):   return self._fget('l')
+    def fget_fields(self, space):   return self._fget('f')
+    def fget_args(self, space):     return self._fget('a')
+    def fget_result(self, space):   return self._fget('r')
+    def fget_ellipsis(self, space): return self._fget('E')
+    def fget_abi(self, space):      return self._fget('A')
+    def fget_elements(self, space): return self._fget('e')
 
 
 W_CType.typedef = TypeDef(
@@ -229,7 +209,7 @@
     __repr__ = interp2app(W_CType.repr),
     __weakref__ = make_weakref_descr(W_CType),
     kind = GetSetProperty(W_CType.fget_kind, doc="kind"),
-    cname = interp_attrproperty('name', W_CType, doc="C name"),
+    cname = GetSetProperty(W_CType.fget_cname, doc="C name"),
     item = GetSetProperty(W_CType.fget_item, doc="pointer to, or array of"),
     length = GetSetProperty(W_CType.fget_length, doc="array length or None"),
     fields = GetSetProperty(W_CType.fget_fields, doc="struct or union fields"),
diff --git a/pypy/module/_cffi_backend/ctypeptr.py 
b/pypy/module/_cffi_backend/ctypeptr.py
--- a/pypy/module/_cffi_backend/ctypeptr.py
+++ b/pypy/module/_cffi_backend/ctypeptr.py
@@ -320,8 +320,10 @@
             raise OperationError(space.w_TypeError,
                      space.wrap("expected a 'cdata struct-or-union' object"))
 
-    def _fget_item(self):
-        return self.space.wrap(self.ctitem)
+    def _fget(self, attrchar):
+        if attrchar == 'i':     # item
+            return self.space.wrap(self.ctitem)
+        return W_CTypePtrBase._fget(self, attrchar)
 
 # ____________________________________________________________
 
diff --git a/pypy/module/_cffi_backend/ctypestruct.py 
b/pypy/module/_cffi_backend/ctypestruct.py
--- a/pypy/module/_cffi_backend/ctypestruct.py
+++ b/pypy/module/_cffi_backend/ctypestruct.py
@@ -37,16 +37,18 @@
         self.check_complete(w_errorcls=self.space.w_ValueError)
         return self.alignment
 
-    def _fget_fields(self):
-        space = self.space
-        if self.size < 0:
-            return space.w_None
-        result = [None] * len(self.fields_list)
-        for fname, field in self.fields_dict.iteritems():
-            i = self.fields_list.index(field)
-            result[i] = space.newtuple([space.wrap(fname),
-                                        space.wrap(field)])
-        return space.newlist(result)
+    def _fget(self, attrchar):
+        if attrchar == 'f':     # fields
+            space = self.space
+            if self.size < 0:
+                return space.w_None
+            result = [None] * len(self.fields_list)
+            for fname, field in self.fields_dict.iteritems():
+                i = self.fields_list.index(field)
+                result[i] = space.newtuple([space.wrap(fname),
+                                            space.wrap(field)])
+            return space.newlist(result)
+        return W_CType._fget(self, attrchar)
 
     def convert_to_object(self, cdata):
         space = self.space
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to