[pypy-svn] r49674 - in pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Wed Dec 12 13:39:39 CET 2007
Author: cfbolz
Date: Wed Dec 12 13:39:39 2007
New Revision: 49674
Modified:
pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
Log:
add support for unary methods (neg pos abs invert int long float oct hex)
Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py (original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py Wed Dec 12 13:39:39 2007
@@ -1,3 +1,4 @@
+import new
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import ObjSpace, W_Root, NoneNotWrapped, applevel
from pypy.interpreter.gateway import interp2app, ObjSpace
@@ -189,6 +190,13 @@
)
W_ClassObject.typedef.acceptable_as_base_class = False
+
+def make_unary_instance_method(name):
+ def unaryop(self, space):
+ w_meth = self.getattr(space, space.wrap(name), True)
+ return space.call_function(w_meth)
+ return unaryop
+
class W_InstanceObject(Wrappable):
def __init__(self, space, w_class, w_dict=None):
if w_dict is None:
@@ -362,6 +370,18 @@
space.w_TypeError,
space.wrap("__nonzero__() should return an int"))
+rawdict = {}
+for op in "neg pos abs invert int long float oct hex".split():
+ specialname = "__%s__" % (op, )
+ # fool the gateway logic by giving it a real unbound method
+ meth = new.instancemethod(
+ make_unary_instance_method(specialname),
+ None,
+ W_InstanceObject)
+ rawdict[specialname] = interp2app(
+ meth,
+ unwrap_spec=["self", ObjSpace])
+
W_InstanceObject.typedef = TypeDef("instance",
__new__ = interp2app(W_InstanceObject.descr_new),
__getattribute__ = interp2app(W_InstanceObject.descr_getattribute,
@@ -388,5 +408,6 @@
unwrap_spec=['self', ObjSpace, Arguments]),
__nonzero__ = interp2app(W_InstanceObject.descr_nonzero,
unwrap_spec=['self', ObjSpace]),
+ **rawdict
)
Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py (original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py Wed Dec 12 13:39:39 2007
@@ -371,3 +371,10 @@
a.__str__ = __str__
assert str(a) == "bar"
+ def test_unary_method(self):
+ class A:
+ __metaclass__ = nclassobj
+ def __pos__(self):
+ return -1
+ a = A()
+ assert +a == -1
More information about the Pypy-commit
mailing list