Author: Ronan Lamy <[email protected]>
Branch: translation-cleanup
Changeset: r58127:33478c5d1f9f
Date: 2012-10-16 10:57 +0100
http://bitbucket.org/pypy/pypy/changeset/33478c5d1f9f/

Log:    Derive FSFrame directly from PyFrame

        + Refactor opcode patching tests

diff --git a/pypy/objspace/flow/flowcontext.py 
b/pypy/objspace/flow/flowcontext.py
--- a/pypy/objspace/flow/flowcontext.py
+++ b/pypy/objspace/flow/flowcontext.py
@@ -6,9 +6,10 @@
 import collections
 
 from pypy.tool.error import source_lines
+from pypy.tool.stdlib_opcode import host_bytecode_spec
 from pypy.interpreter import pyframe
 from pypy.interpreter.argument import ArgumentsForTranslation
-from pypy.interpreter.pyopcode import Return, BytecodeCorruption
+from pypy.interpreter.pyopcode import BytecodeCorruption
 from pypy.objspace.flow.model import (Constant, Variable, Block, Link,
     UnwrapException, c_last_exception)
 from pypy.objspace.flow.framestate import (FrameState, recursively_unflatten,
@@ -224,7 +225,8 @@
     "cmp_exc_match",
     ]
 
-class FlowSpaceFrame(pyframe.CPythonFrame):
+class FlowSpaceFrame(pyframe.PyFrame):
+    opcode_method_names = host_bytecode_spec.method_names
 
     def __init__(self, space, graph, code):
         self.graph = graph
diff --git a/pypy/objspace/flow/test/test_objspace.py 
b/pypy/objspace/flow/test/test_objspace.py
--- a/pypy/objspace/flow/test/test_objspace.py
+++ b/pypy/objspace/flow/test/test_objspace.py
@@ -1,19 +1,32 @@
 from __future__ import with_statement
 import new
 import py, sys
-from pypy.objspace.flow.model import Constant
-from pypy.objspace.flow.model import mkentrymap, c_last_exception
+from contextlib import contextmanager
+
+from pypy.objspace.flow.model import Constant, mkentrymap, c_last_exception
 from pypy.translator.simplify import simplify_graph
 from pypy.objspace.flow.objspace import FlowObjSpace
 from pypy.objspace.flow.flowcontext import FlowingError, FlowSpaceFrame
 from pypy import conftest
-from pypy.tool.stdlib_opcode import bytecode_spec
-from pypy.interpreter.pyframe import PyFrame
+from pypy.tool.stdlib_opcode import bytecode_spec, host_bytecode_spec
 
 import os
 import operator
 is_operator = getattr(operator, 'is_', operator.eq) # it's not there 2.2
 
+@contextmanager
+def patching_opcodes(*opcodes):
+    meth_names = host_bytecode_spec.method_names
+    opnums = [bytecode_spec.opmap[name] for name in opcodes]
+    old_name = {}
+    for name, num in zip(opcodes, opnums):
+        old_name[num] = meth_names[num]
+        meth_names[num] = name
+    yield
+    for name in opcodes:
+        meth_names[num] = old_name[num]
+
+
 class Base:
     def codetest(self, func, **kwds):
         import inspect
@@ -875,26 +888,11 @@
                         c.co_filename, c.co_name, c.co_firstlineno,
                         c.co_lnotab)
 
-    def patch_opcodes(self, *opcodes):
-        flow_meth_names = FlowSpaceFrame.opcode_method_names
-        pyframe_meth_names = PyFrame.opcode_method_names
-        for name in opcodes:
-            num = bytecode_spec.opmap[name]
-            setattr(self, 'old_' + name, flow_meth_names[num])
-            flow_meth_names[num] = pyframe_meth_names[num]
-
-    def unpatch_opcodes(self, *opcodes):
-        flow_meth_names = FlowSpaceFrame.opcode_method_names
-        for name in opcodes:
-            num = bytecode_spec.opmap[name]
-            flow_meth_names[num] = getattr(self, 'old_' + name)
-
     def test_callmethod_opcode(self):
         """ Tests code generated by pypy-c compiled with CALL_METHOD
         bytecode
         """
-        self.patch_opcodes('CALL_METHOD', 'LOOKUP_METHOD')
-        try:
+        with patching_opcodes('CALL_METHOD', 'LOOKUP_METHOD'):
             class X:
                 def m(self):
                     return 3
@@ -912,17 +910,13 @@
             all_ops = self.all_operations(graph)
             assert all_ops['simple_call'] == 2
             assert all_ops['getattr'] == 1
-        finally:
-            self.unpatch_opcodes('CALL_METHOD', 'LOOKUP_METHOD')
 
+    @py.test.mark.skipif('sys.version_info < (2, 7)')
     def test_build_list_from_arg_opcode(self):
         """ Tests code generated by pypy-c compiled with BUILD_LIST_FROM_ARG
         bytecode
         """
-        if sys.version_info < (2, 7):
-            py.test.skip("2.7 only test")
-        self.patch_opcodes('BUILD_LIST_FROM_ARG')
-        try:
+        with patching_opcodes('BUILD_LIST_FROM_ARG'):
             def f():
                 return [i for i in "abc"]
 
@@ -936,8 +930,6 @@
             all_ops = self.all_operations(graph)
             assert all_ops == {'newlist': 1, 'getattr': 1, 'simple_call': 1,
                                'iter': 1, 'next': 1}
-        finally:
-            self.unpatch_opcodes('BUILD_LIST_FROM_ARG')
 
     def test_dont_capture_RuntimeError(self):
         class Foo:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to