Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: kill-flowobjspace
Changeset: r60522:d45f1bd16894
Date: 2013-01-26 20:40 +0000
http://bitbucket.org/pypy/pypy/changeset/d45f1bd16894/

Log:    Move do_operation* from FlowObjSpace to FSFrame

diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -9,11 +9,12 @@
 from rpython.tool.stdlib_opcode import host_bytecode_spec
 from rpython.flowspace.argument import ArgumentsForTranslation
 from rpython.flowspace.model import (Constant, Variable, Block, Link,
-    UnwrapException, c_last_exception)
+    UnwrapException, c_last_exception, SpaceOperation)
 from rpython.flowspace.framestate import (FrameState, recursively_unflatten,
         recursively_flatten)
 from rpython.flowspace.specialcase import (rpython_print_item,
         rpython_print_newline)
+from rpython.flowspace.operation import implicit_exceptions
 
 class FlowingError(Exception):
     """ Signals invalid RPython in the function being analysed"""
@@ -471,6 +472,17 @@
     def guessbool(self, w_condition, **kwds):
         return self.recorder.guessbool(self, w_condition, **kwds)
 
+    def do_operation(self, name, *args_w):
+        spaceop = SpaceOperation(name, args_w, Variable())
+        spaceop.offset = self.last_instr
+        self.record(spaceop)
+        return spaceop.result
+
+    def do_operation_with_implicit_exceptions(self, name, *args_w):
+        w_result = self.do_operation(name, *args_w)
+        self.handle_implicit_exceptions(implicit_exceptions.get(name))
+        return w_result
+
     def handle_implicit_exceptions(self, exceptions):
         """
         Catch possible exceptions implicitly.
@@ -740,7 +752,7 @@
     def YIELD_VALUE(self, _, next_instr):
         assert self.pycode.is_generator
         w_result = self.popvalue()
-        self.space.do_operation('yield', w_result)
+        self.do_operation('yield', w_result)
         # XXX yield expressions not supported. This will blow up if the value
         # isn't popped straightaway.
         self.pushvalue(None)
@@ -751,7 +763,7 @@
 
     def PRINT_ITEM(self, oparg, next_instr):
         w_item = self.popvalue()
-        w_s = self.space.do_operation('str', w_item)
+        w_s = self.do_operation('str', w_item)
         self.space.appcall(rpython_print_item, w_s)
 
     def PRINT_NEWLINE(self, oparg, next_instr):
diff --git a/rpython/flowspace/objspace.py b/rpython/flowspace/objspace.py
--- a/rpython/flowspace/objspace.py
+++ b/rpython/flowspace/objspace.py
@@ -9,7 +9,7 @@
 
 from rpython.flowspace.argument import ArgumentsForTranslation
 from rpython.flowspace.model import (Constant, Variable, WrapException,
-    UnwrapException, checkgraph, SpaceOperation)
+    UnwrapException, checkgraph)
 from rpython.flowspace.bytecode import HostCode
 from rpython.flowspace import operation
 from rpython.flowspace.flowcontext import (FlowSpaceFrame, fixeggblocks,
@@ -91,21 +91,21 @@
     id  = None     # real version added by add_operations()
 
     def newdict(self, module="ignored"):
-        return self.do_operation('newdict')
+        return self.frame.do_operation('newdict')
 
     def newtuple(self, args_w):
         try:
             content = [self.unwrap(w_arg) for w_arg in args_w]
         except UnwrapException:
-            return self.do_operation('newtuple', *args_w)
+            return self.frame.do_operation('newtuple', *args_w)
         else:
             return Constant(tuple(content))
 
     def newlist(self, args_w, sizehint=None):
-        return self.do_operation('newlist', *args_w)
+        return self.frame.do_operation('newlist', *args_w)
 
     def newslice(self, w_start, w_stop, w_step):
-        return self.do_operation('newslice', w_start, w_stop, w_step)
+        return self.frame.do_operation('newslice', w_start, w_stop, w_step)
 
     def newbool(self, b):
         if b:
@@ -299,22 +299,10 @@
             if not self.is_true(w_correct):
                 e = self.exc_from_raise(self.w_ValueError, self.w_None)
                 raise e
-            return [self.do_operation('getitem', w_iterable, self.wrap(i))
+            return [self.frame.do_operation('getitem', w_iterable, 
self.wrap(i))
                         for i in range(expected_length)]
 
     # ____________________________________________________________
-    def do_operation(self, name, *args_w):
-        spaceop = SpaceOperation(name, args_w, Variable())
-        spaceop.offset = self.frame.last_instr
-        self.frame.record(spaceop)
-        return spaceop.result
-
-    def do_operation_with_implicit_exceptions(self, name, *args_w):
-        w_result = self.do_operation(name, *args_w)
-        self.frame.handle_implicit_exceptions(
-                operation.implicit_exceptions.get(name))
-        return w_result
-
     def not_(self, w_obj):
         return self.wrap(not self.is_true(w_obj))
 
@@ -325,7 +313,7 @@
             pass
         else:
             return bool(obj)
-        w_truthvalue = self.do_operation('is_true', w_obj)
+        w_truthvalue = self.frame.do_operation('is_true', w_obj)
         return self.frame.guessbool(w_truthvalue)
 
     def iter(self, w_iterable):
@@ -336,7 +324,7 @@
         else:
             if isinstance(iterable, unrolling_iterable):
                 return self.wrap(iterable.get_unroller())
-        w_iter = self.do_operation("iter", w_iterable)
+        w_iter = self.frame.do_operation("iter", w_iterable)
         return w_iter
 
     def next(self, w_iter):
@@ -354,7 +342,7 @@
                 else:
                     frame.replace_in_stack(it, next_unroller)
                     return self.wrap(v)
-        w_item = self.do_operation("next", w_iter)
+        w_item = frame.do_operation("next", w_iter)
         frame.handle_implicit_exceptions([StopIteration, RuntimeError])
         return w_item
 
@@ -363,8 +351,8 @@
         if w_obj is self.frame.w_globals:
             raise FlowingError(self.frame,
                     "Attempting to modify global variable  %r." % (w_key))
-        return self.do_operation_with_implicit_exceptions('setitem', w_obj,
-                                                          w_key, w_val)
+        return self.frame.do_operation_with_implicit_exceptions('setitem',
+                w_obj, w_key, w_val)
 
     def setitem_str(self, w_obj, key, w_value):
         return self.setitem(w_obj, self.wrap(key), w_value)
@@ -375,7 +363,7 @@
         if w_obj in self.not_really_const:
             const_w = self.not_really_const[w_obj]
             if w_name not in const_w:
-                return self.do_operation_with_implicit_exceptions('getattr',
+                return 
self.frame.do_operation_with_implicit_exceptions('getattr',
                                                                 w_obj, w_name)
         try:
             obj = self.unwrap_for_computation(w_obj)
@@ -394,7 +382,7 @@
                 return self.wrap(result)
             except WrapException:
                 pass
-        return self.do_operation_with_implicit_exceptions('getattr',
+        return self.frame.do_operation_with_implicit_exceptions('getattr',
                 w_obj, w_name)
 
     def isinstance_w(self, w_obj, w_type):
@@ -414,7 +402,7 @@
         if w_module in self.not_really_const:
             const_w = self.not_really_const[w_obj]
             if w_name not in const_w:
-                return self.do_operation_with_implicit_exceptions('getattr',
+                return 
self.frame.do_operation_with_implicit_exceptions('getattr',
                                                                 w_obj, w_name)
         try:
             return self.wrap(getattr(w_module.value, w_name.value))
@@ -433,7 +421,7 @@
     def appcall(self, func, *args_w):
         """Call an app-level RPython function directly"""
         w_func = self.wrap(func)
-        return self.do_operation('simple_call', w_func, *args_w)
+        return self.frame.do_operation('simple_call', w_func, *args_w)
 
     def call_args(self, w_callable, args):
         try:
@@ -454,11 +442,11 @@
         # NOTE: annrpython needs to know about the following two operations!
         if not kwds_w:
             # simple case
-            w_res = self.do_operation('simple_call', w_callable, *args_w)
+            w_res = self.frame.do_operation('simple_call', w_callable, *args_w)
         else:
             # general case
             shape, args_w = args.flatten()
-            w_res = self.do_operation('call_args', w_callable, Constant(shape),
+            w_res = self.frame.do_operation('call_args', w_callable, 
Constant(shape),
                                       *args_w)
 
         # maybe the call has generated an exception (any one)
@@ -562,7 +550,7 @@
                             # type cannot sanely appear in flow graph,
                             # store operation with variable result instead
                             pass
-        w_result = self.do_operation_with_implicit_exceptions(name, *args_w)
+        w_result = self.frame.do_operation_with_implicit_exceptions(name, 
*args_w)
         return w_result
 
     setattr(FlowObjSpace, name, generic_operator)
diff --git a/rpython/flowspace/specialcase.py b/rpython/flowspace/specialcase.py
--- a/rpython/flowspace/specialcase.py
+++ b/rpython/flowspace/specialcase.py
@@ -18,7 +18,7 @@
         if opname == 'pow' and len(args_w) == 2:
             args_w = args_w + [Constant(None)]
         elif opname == 'getattr' and len(args_w) == 3:
-            return space.do_operation('simple_call', Constant(getattr), 
*args_w)
+            return space.frame.do_operation('simple_call', Constant(getattr), 
*args_w)
         else:
             raise Exception, "should call %r with exactly %d arguments" % (
                 fn, Arity[opname])
@@ -60,7 +60,7 @@
     [w_value] = args_w
     if isinstance(w_value, Constant):
         return Constant(r_uint(w_value.value))
-    return space.do_operation('simple_call', space.wrap(r_uint), w_value)
+    return space.frame.do_operation('simple_call', space.wrap(r_uint), w_value)
 
 def sc_we_are_translated(space, we_are_translated, args):
     return Constant(True)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to