Hi!
The following patch initiated by a chat with Runar Petursson about
descriptors - increases pypy-c/pypy-llvm by 25% on richards.py.
well, it breaks this:
Python 2.4.1 (#2, Mar 31 2005, 00:05:10)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1666)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
vs. patched PyPy
PyPy 0.9.0 in StdObjSpace on top of Python 2.4.1 (startuptime: 4.97 secs)
functions are not data descriptors, this feature makes increasing the
performance of method lookup more involved that one would like but
Python semantics expect this kind of overriding to work.
I have added a test about this.
I couldnt be bothered creating a branch - but if someone wants to sanity
check it and fix the method repr and check it in, you are more than
welcome! :-)
Cheers,
Richard
------------------------------------------------------------------------
Index: objspace/descroperation.py
===================================================================
--- objspace/descroperation.py (revision 29539)
+++ objspace/descroperation.py (working copy)
@@ -1,7 +1,7 @@
import operator
from pypy.interpreter.error import OperationError
from pypy.interpreter.baseobjspace import ObjSpace
-from pypy.interpreter.function import Function, Method
+from pypy.interpreter.function import Function, Method, descr_function_get
from pypy.interpreter.argument import Arguments
from pypy.interpreter.typedef import default_identity_hash
from pypy.tool.sourcetools import compile2, func_with_new_name
@@ -19,6 +19,10 @@
name = space.str_w(w_name)
w_descr = space.lookup(w_obj, name)
if w_descr is not None:
+ # XXX test performance
+ descr = space.interpclass_w(w_descr)
+ if type(descr) is Function:
+ return descr_function_get(space, w_descr, w_obj)
if space.is_data_descr(w_descr):
return space.get(w_descr, w_obj)
w_value = w_obj.getdictvalue(space, w_name)
Index: objspace/cpy/objspace.py
===================================================================
--- objspace/cpy/objspace.py (revision 29539)
+++ objspace/cpy/objspace.py (working copy)
@@ -62,8 +62,8 @@
return PyString_FromStringAndSize(x, len(x))
if isinstance(x, float):
return PyFloat_FromDouble(x)
- if isinstance(x, r_uint):
- return PyLong_FromUnsignedLong(x)
+ #if isinstance(x, r_uint):
+ # return PyLong_FromUnsignedLong(x)
# if we arrive here during RTyping, then the problem is *not* the %r
# in the format string, but it's that someone is calling space.wrap()
# on a strange object.
Index: interpreter/function.py
===================================================================
--- interpreter/function.py (revision 29539)
+++ interpreter/function.py (working copy)
@@ -385,6 +385,16 @@
w_class = space.type(self.w_instance)
else:
w_class = self.w_class
+ if w_class is None:
+ if self.w_instance is None:
+ s = "<unbound method %s>" % (name)
+ return space.wrap(s)
+ else:
+ objrepr = space.str_w(space.repr(self.w_instance))
+ info = 'bound method %s of %s' % (name, objrepr)
+ # info = "method %s of %s object" % (name, typename)
+ return self.w_instance.getrepr(self.space, info)
+
typename = w_class.getname(self.space, '?')
if self.w_instance is None:
s = "<unbound method %s.%s>" % (typename, name)
------------------------------------------------------------------------
_______________________________________________
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev