[pypy-svn] r7374 - in pypy/trunk/src/pypy/objspace/flow: . test

arigo at codespeak.net arigo at codespeak.net
Thu Nov 18 14:59:57 CET 2004


Author: arigo
Date: Thu Nov 18 14:59:56 2004
New Revision: 7374

Modified:
   pypy/trunk/src/pypy/objspace/flow/objspace.py
   pypy/trunk/src/pypy/objspace/flow/specialcase.py
   pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py
Log:
Special-casing operators in the flow object space.


Modified: pypy/trunk/src/pypy/objspace/flow/objspace.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/objspace.py	(original)
+++ pypy/trunk/src/pypy/objspace/flow/objspace.py	Thu Nov 18 14:59:56 2004
@@ -193,11 +193,12 @@
 
     def call_args(self, w_callable, args):
         try:
-            sc = self.specialcases[self.unwrap(w_callable)]
+            fn = self.unwrap(w_callable)
+            sc = self.specialcases[fn]
         except (UnwrapException, KeyError):
             pass
         else:
-            return sc(self, args)
+            return sc(self, fn, args)
 
         if args.kwds_w:
             w_args, w_kwds = args.pack()

Modified: pypy/trunk/src/pypy/objspace/flow/specialcase.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/specialcase.py	(original)
+++ pypy/trunk/src/pypy/objspace/flow/specialcase.py	Thu Nov 18 14:59:56 2004
@@ -1,4 +1,4 @@
-import types
+import types, operator
 from pypy.interpreter import pyframe, baseobjspace
 from pypy.interpreter.error import OperationError
 from pypy.objspace.flow.objspace import UnwrapException
@@ -16,7 +16,7 @@
     return None
 
 
-def normalize_exception(space, args):
+def sc_normalize_exception(space, fn, args):
     """Special-case for 'raise' statements.
 
     Only accept the following syntaxes:
@@ -43,7 +43,7 @@
     # this function returns a real tuple that can be handled
     # by FlowObjSpace.unpacktuple()
 
-def import_(space, args):
+def sc_import(space, fn, args):
     assert len(args.args_w) == 4 and args.kwds_w == {}
     unwrapped_args = []
     for w_arg in args.args_w:
@@ -51,7 +51,15 @@
         unwrapped_args.append(space.unwrap(w_arg))
     return space.wrap(__import__(*unwrapped_args))
 
+def sc_operator(space, fn, args):
+    # XXX do this more cleanly
+    assert args.kwds_w == {}
+    opname = fn.__name__.replace('__', '')
+    return space.do_operation(opname, *args.args_w)
+
 def setup(space):
     fn = pyframe.normalize_exception.get_function(space)
-    space.specialcases[fn] = normalize_exception
-    space.specialcases[__import__] = import_
+    space.specialcases[fn] = sc_normalize_exception
+    space.specialcases[__import__] = sc_import
+    for opname in ['lt', 'le', 'eq', 'ne', 'gt', 'ge', 'is_']:
+        space.specialcases[getattr(operator, opname)] = sc_operator

Modified: pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py	(original)
+++ pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py	Thu Nov 18 14:59:56 2004
@@ -267,6 +267,33 @@
         x = self.codetest(self.globalconstdict)
         self.show(x)
 
+    #__________________________________________________________
+    def specialcases():
+        import operator
+        operator.lt(2,3)
+        operator.le(2,3)
+        operator.eq(2,3)
+        operator.ne(2,3)
+        operator.gt(2,3)
+        operator.ge(2,3)
+        operator.is_(2,3)
+        operator.__lt__(2,3)
+        operator.__le__(2,3)
+        operator.__eq__(2,3)
+        operator.__ne__(2,3)
+        operator.__gt__(2,3)
+        operator.__ge__(2,3)
+    
+    def test_specialcases(self):
+        x = self.codetest(self.specialcases)
+        self.assertEquals(len(x.startblock.operations), 13)
+        for op in x.startblock.operations:
+            self.assert_(op.opname in ['lt', 'le', 'eq', 'ne',
+                                       'gt', 'ge', 'is_'])
+            self.assertEquals(len(op.args), 2)
+            self.assertEquals(op.args[0].value, 2)
+            self.assertEquals(op.args[1].value, 3)
+
 DATA = {'x': 5,
         'y': 6}
 



More information about the Pypy-commit mailing list