[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