[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