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