Author: Philip Jenvey <pjen...@underboss.org>
Branch: remove-intlong-smm
Changeset: r68570:d96812b03457
Date: 2013-12-30 13:37 -0800
http://bitbucket.org/pypy/pypy/changeset/d96812b03457/

Log:    add rsides

diff --git a/pypy/objspace/std/boolobject.py b/pypy/objspace/std/boolobject.py
--- a/pypy/objspace/std/boolobject.py
+++ b/pypy/objspace/std/boolobject.py
@@ -1,5 +1,8 @@
+import operator
+
 from rpython.rlib.rarithmetic import r_uint
 from rpython.rlib.rbigint import rbigint
+from rpython.tool.sourcetools import func_renamer, func_with_new_name
 
 from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
 from pypy.objspace.std.intobject import W_AbstractIntObject
@@ -17,7 +20,7 @@
         raise Exception("you cannot do that, you must use space.is_true()")
 
     def __repr__(self):
-        """ representation for debugging purposes """
+        """representation for debugging purposes"""
         return "%s(%s)" % (self.__class__.__name__, self.boolval)
 
     def unwrap(self, space):
@@ -46,23 +49,24 @@
     def descr_nonzero(self, space):
         return self
 
-    def descr_and(self, space, w_other):
-        if not isinstance(w_other, W_BoolObject):
-            return W_AbstractIntObject.descr_and(self, space, w_other)
-        return space.newbool(self.boolval & w_other.boolval)
+    def make_bitwise_binop(opname):
+        descr_name = 'descr_' + opname
+        super_op = getattr(W_AbstractIntObject, descr_name)
+        op = getattr(operator,
+                     opname + '_' if opname in ('and', 'or') else opname)
+        @func_renamer(descr_name)
+        def descr_binop(self, space, w_other):
+            if not isinstance(w_other, W_BoolObject):
+                return super_op(self, space, w_other)
+            return space.newbool(op(self.boolval, w_other.boolval))
+        return descr_binop, func_with_new_name(descr_binop, 'descr_r' + opname)
 
-    def descr_or(self, space, w_other):
-        if not isinstance(w_other, W_BoolObject):
-            return W_AbstractIntObject.descr_or(self, space, w_other)
-        return space.newbool(self.boolval | w_other.boolval)
-
-    def descr_xor(self, space, w_other):
-        if not isinstance(w_other, W_BoolObject):
-            return W_AbstractIntObject.descr_xor(self, space, w_other)
-        return space.newbool(self.boolval ^ w_other.boolval)
+    descr_and, descr_rand = make_bitwise_binop('and')
+    descr_or, descr_ror = make_bitwise_binop('or')
+    descr_xor, descr_rxor = make_bitwise_binop('xor')
 
 W_BoolObject.w_False = W_BoolObject(False)
-W_BoolObject.w_True  = W_BoolObject(True)
+W_BoolObject.w_True = W_BoolObject(True)
 
 @unwrap_spec(w_obj=WrappedDefault(False))
 def descr__new__(space, w_booltype, w_obj):
@@ -81,12 +85,12 @@
     __repr__ = interp2app(W_BoolObject.descr_repr),
     __str__ = interp2app(W_BoolObject.descr_str),
     __nonzero__ = interp2app(W_BoolObject.descr_nonzero),
-    # XXX: rsides
+
     __and__ = interp2app(W_BoolObject.descr_and),
-    #__rand__ = interp2app(W_BoolObject.descr_rand),
+    __rand__ = interp2app(W_BoolObject.descr_rand),
     __or__ = interp2app(W_BoolObject.descr_or),
-    #__ror__ = interp2app(W_BoolObject.descr_ror),
+    __ror__ = interp2app(W_BoolObject.descr_ror),
     __xor__ = interp2app(W_BoolObject.descr_xor),
-    #__rxor__ = interp2app(W_BoolObject.descr_rxor),
+    __rxor__ = interp2app(W_BoolObject.descr_rxor),
     )
 W_BoolObject.typedef.acceptable_as_base_class = False
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to