Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: annotator
Changeset: r68746:e18a718a0185
Date: 2014-01-17 18:41 +0000
http://bitbucket.org/pypy/pypy/changeset/e18a718a0185/

Log:    move handling of call special cases to SimpleCall.eval()

diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -579,7 +579,7 @@
     def appcall(self, func, *args_w):
         """Call an app-level RPython function directly"""
         w_func = const(func)
-        return op.simple_call(w_func, *args_w).eval(self)
+        return self.do_op(op.simple_call(w_func, *args_w))
 
     def BAD_OPCODE(self, _):
         raise FlowingError("This operation is not RPython")
diff --git a/rpython/flowspace/objspace.py b/rpython/flowspace/objspace.py
--- a/rpython/flowspace/objspace.py
+++ b/rpython/flowspace/objspace.py
@@ -46,24 +46,12 @@
         return self.call(w_func, args)
 
     def call(self, w_callable, args):
-        if isinstance(w_callable, Constant):
-            fn = w_callable.value
-            try:
-                sc = SPECIAL_CASES[fn]   # TypeError if 'fn' not hashable
-            except (KeyError, TypeError):
-                pass
-            else:
-                if args.keywords:
-                    raise FlowingError(
-                        "should not call %r with keyword arguments" % (fn,))
-                return sc(self, *args.as_list())
-
         if args.keywords or isinstance(args.w_stararg, Variable):
             shape, args_w = args.flatten()
             hlop = op.call_args(w_callable, Constant(shape), *args_w)
         else:
             hlop = op.simple_call(w_callable, *args.as_list())
-        return self.frame.do_op(hlop)
+        return hlop.eval(self.frame)
 
 
 def build_flow(func, space=FlowObjSpace()):
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -15,6 +15,7 @@
                                      SpaceOperation)
 from rpython.flowspace.specialcase import register_flow_sc
 from rpython.annotator.model import SomeTuple
+from rpython.flowspace.specialcase import SPECIAL_CASES
 
 
 NOT_REALLY_CONST = {
@@ -495,9 +496,36 @@
 class SimpleCall(SingleDispatchMixin, CallOp):
     opname = 'simple_call'
 
+    def eval(self, frame):
+        w_callable, args_w = self.args[0], self.args[1:]
+        if isinstance(w_callable, Constant):
+            fn = w_callable.value
+            try:
+                sc = SPECIAL_CASES[fn]   # TypeError if 'fn' not hashable
+            except (KeyError, TypeError):
+                pass
+            else:
+                return sc(frame.space, *args_w)
+        return frame.do_op(self)
+
+
 class CallArgs(SingleDispatchMixin, CallOp):
     opname = 'call_args'
 
+    def eval(self, frame):
+        w_callable = self.args[0]
+        if isinstance(w_callable, Constant):
+            fn = w_callable.value
+            try:
+                sc = SPECIAL_CASES[fn]   # TypeError if 'fn' not hashable
+            except (KeyError, TypeError):
+                pass
+            else:
+                raise FlowingError(
+                    "should not call %r with keyword arguments" % (fn,))
+        return frame.do_op(self)
+
+
 # Other functions that get directly translated to SpaceOperators
 func2op[type] = op.type
 func2op[operator.truth] = op.bool
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to