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