[pypy-commit] pypy annotator: use operations instead of FlowObjSpace methods everywhere

rlamy noreply at buildbot.pypy.org
Fri Jan 17 18:36:43 CET 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: annotator
Changeset: r68737:65cb99edd161
Date: 2014-01-05 03:30 +0100
http://bitbucket.org/pypy/pypy/changeset/65cb99edd161/

Log:	use operations instead of FlowObjSpace methods everywhere

diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -730,7 +730,7 @@
     def YIELD_VALUE(self, _):
         assert self.pycode.is_generator
         w_result = self.popvalue()
-        self.space.yield_(w_result)
+        op.yield_(w_result).eval(self)
         # XXX yield expressions not supported. This will blow up if the value
         # isn't popped straightaway.
         self.pushvalue(None)
@@ -790,13 +790,13 @@
 
     def GET_ITER(self, oparg):
         w_iterable = self.popvalue()
-        w_iterator = self.space.iter(w_iterable)
+        w_iterator = op.iter(w_iterable).eval(self)
         self.pushvalue(w_iterator)
 
     def FOR_ITER(self, target):
         w_iterator = self.peekvalue()
         try:
-            w_nextitem = self.space.next(w_iterator)
+            w_nextitem = op.next(w_iterator).eval(self)
         except Raise as e:
             w_exc = e.w_exc
             if not self.space.exception_match(w_exc.w_type,
@@ -825,7 +825,7 @@
         # directly call manager.__enter__(), don't use special lookup functions
         # which don't make sense on the RPython type system.
         w_manager = self.peekvalue()
-        w_exit = self.space.getattr(w_manager, const("__exit__"))
+        w_exit = op.getattr(w_manager, const("__exit__")).eval(self)
         self.settopvalue(w_exit)
         w_result = self.space.call_method(w_manager, "__enter__")
         block = WithBlock(self, target)
@@ -949,7 +949,7 @@
         # This opcode was added with pypy-1.8.  Here is a simpler
         # version, enough for annotation.
         last_val = self.popvalue()
-        self.pushvalue(self.space.newlist())
+        self.pushvalue(op.newlist().eval(self))
         self.pushvalue(last_val)
 
     def call_function(self, oparg, w_star=None, w_starstar=None):
@@ -1005,7 +1005,7 @@
         if not self.guessbool(op.bool(w_correct).eval(self)):
             w_exc = self.exc_from_raise(const(ValueError), const(None))
             raise Raise(w_exc)
-        return [self.space.getitem(w_iterable, const(i))
+        return [op.getitem(w_iterable, const(i)).eval(self)
                     for i in range(expected_length)]
 
     def UNPACK_SEQUENCE(self, itemcount):
@@ -1016,7 +1016,7 @@
 
     def slice(self, w_start, w_end):
         w_obj = self.popvalue()
-        w_result = self.space.getslice(w_obj, w_start, w_end)
+        w_result = op.getslice(w_obj, w_start, w_end).eval(self)
         self.pushvalue(w_result)
 
     def SLICE_0(self, oparg):
@@ -1038,7 +1038,7 @@
     def storeslice(self, w_start, w_end):
         w_obj = self.popvalue()
         w_newvalue = self.popvalue()
-        self.space.setslice(w_obj, w_start, w_end, w_newvalue)
+        op.setslice(w_obj, w_start, w_end, w_newvalue).eval(self)
 
     def STORE_SLICE_0(self, oparg):
         self.storeslice(self.space.w_None, self.space.w_None)
@@ -1058,7 +1058,7 @@
 
     def deleteslice(self, w_start, w_end):
         w_obj = self.popvalue()
-        self.space.delslice(w_obj, w_start, w_end)
+        op.delslice(w_obj, w_start, w_end).eval(self)
 
     def DELETE_SLICE_0(self, oparg):
         self.deleteslice(self.space.w_None, self.space.w_None)
@@ -1095,14 +1095,14 @@
         w_key = self.popvalue()
         w_value = self.popvalue()
         w_dict = self.peekvalue()
-        self.space.setitem(w_dict, w_key, w_value)
+        op.setitem(w_dict, w_key, w_value).eval(self)
 
     def STORE_SUBSCR(self, oparg):
         "obj[subscr] = newvalue"
         w_subscr = self.popvalue()
         w_obj = self.popvalue()
         w_newvalue = self.popvalue()
-        self.space.setitem(w_obj, w_subscr, w_newvalue)
+        op.setitem(w_obj, w_subscr, w_newvalue).eval(self)
 
     def BUILD_SLICE(self, numargs):
         if numargs == 3:
@@ -1113,27 +1113,27 @@
             raise BytecodeCorruption
         w_end = self.popvalue()
         w_start = self.popvalue()
-        w_slice = self.space.newslice(w_start, w_end, w_step)
+        w_slice = op.newslice(w_start, w_end, w_step).eval(self)
         self.pushvalue(w_slice)
 
     def DELETE_SUBSCR(self, oparg):
         "del obj[subscr]"
         w_subscr = self.popvalue()
         w_obj = self.popvalue()
-        self.space.delitem(w_obj, w_subscr)
+        op.delitem(w_obj, w_subscr).eval(self)
 
     def BUILD_TUPLE(self, itemcount):
         items = self.popvalues(itemcount)
-        w_tuple = self.space.newtuple(*items)
+        w_tuple = op.newtuple(*items).eval(self)
         self.pushvalue(w_tuple)
 
     def BUILD_LIST(self, itemcount):
         items = self.popvalues(itemcount)
-        w_list = self.space.newlist(*items)
+        w_list = op.newlist(*items).eval(self)
         self.pushvalue(w_list)
 
     def BUILD_MAP(self, itemcount):
-        w_dict = self.space.newdict()
+        w_dict = op.newdict().eval(self)
         self.pushvalue(w_dict)
 
     def NOP(self, *args):
diff --git a/rpython/flowspace/objspace.py b/rpython/flowspace/objspace.py
--- a/rpython/flowspace/objspace.py
+++ b/rpython/flowspace/objspace.py
@@ -8,8 +8,7 @@
 from inspect import CO_NEWLOCALS
 
 from rpython.flowspace.argument import CallSpec
-from rpython.flowspace.model import (Constant, Variable, checkgraph, const,
-    FSException)
+from rpython.flowspace.model import Constant, Variable, checkgraph, const
 from rpython.flowspace.bytecode import HostCode
 from rpython.flowspace.operation import op
 from rpython.flowspace.flowcontext import (FlowSpaceFrame, fixeggblocks,
@@ -110,13 +109,13 @@
         assert isinstance(w_module, Constant)
         assert isinstance(w_name, Constant)
         try:
-            return self.getattr(w_module, w_name)
+            return op.getattr(w_module, w_name).eval(self.frame)
         except FlowingError:
             exc = ImportError("cannot import name '%s'" % w_name.value)
             raise Raise(const(exc))
 
     def call_method(self, w_obj, methname, *arg_w):
-        w_meth = self.getattr(w_obj, const(methname))
+        w_meth = op.getattr(w_obj, const(methname)).eval(self.frame)
         return self.call_function(w_meth, *arg_w)
 
     def call_function(self, w_func, *args_w):
@@ -163,13 +162,6 @@
         return const(value)
 
 
-for cls in [op.getitem, op.getattr,
-            op.getslice, op.setslice, op.delslice, op.yield_, op.iter, op.next,
-            op.newlist, op.newtuple, op.newdict, op.setitem, op.delitem]:
-    if getattr(FlowObjSpace, cls.opname, None) is None:
-        setattr(FlowObjSpace, cls.opname, cls.make_sc())
-
-
 def build_flow(func, space=FlowObjSpace()):
     """
     Create the flow graph for the function.
diff --git a/rpython/flowspace/specialcase.py b/rpython/flowspace/specialcase.py
--- a/rpython/flowspace/specialcase.py
+++ b/rpython/flowspace/specialcase.py
@@ -42,7 +42,8 @@
     if w_default is not None:
         return space.appcall(getattr, w_obj, w_index, w_default)
     else:
-        return space.getattr(w_obj, w_index)
+        from rpython.flowspace.operation import op
+        return op.getattr(w_obj, w_index).eval(space.frame)
 
 @register_flow_sc(open)
 def sc_open(space, *args_w):


More information about the pypy-commit mailing list