Author: Antonio Cuni <[email protected]>
Branch:
Changeset: r44777:3f35f2dcfae0
Date: 2011-06-07 11:31 +0200
http://bitbucket.org/pypy/pypy/changeset/3f35f2dcfae0/
Log: finally kill test_pypy_c: horray!
diff --git a/pypy/module/pypyjit/test/test_pypy_c.py
b/pypy/module/pypyjit/test/test_pypy_c.py
deleted file mode 100644
--- a/pypy/module/pypyjit/test/test_pypy_c.py
+++ /dev/null
@@ -1,252 +0,0 @@
-from pypy.conftest import gettestobjspace, option
-from pypy.tool.udir import udir
-import py
-from py.test import skip
-import sys, os, re
-import subprocess
-
-class BytecodeTrace(list):
- def get_opnames(self, prefix=""):
- return [op.getopname() for op in self
- if op.getopname().startswith(prefix)]
-
- def __repr__(self):
- return "%s%s" % (self.bytecode, list.__repr__(self))
-
-ZERO_OP_BYTECODES = [
- 'POP_TOP',
- 'ROT_TWO',
- 'ROT_THREE',
- 'DUP_TOP',
- 'ROT_FOUR',
- 'NOP',
- 'DUP_TOPX',
- 'LOAD_CONST',
- 'JUMP_FORWARD',
- #'JUMP_ABSOLUTE' in theory, but contains signals stuff
- #'LOAD_FAST' should be here, but currently needs a guard for nonzeroness
- 'STORE_FAST',
- ]
-
-
-r_bridge = re.compile(r"bridge out of Guard (\d+)")
-
-def from_entry_bridge(text, allparts):
- firstline = text.splitlines()[0]
- if 'entry bridge' in firstline:
- return True
- match = r_bridge.search(firstline)
- if match:
- search = '<Guard' + match.group(1) + '>'
- for part in allparts:
- if search in part:
- break
- else:
- raise AssertionError, "%s not found??" % (search,)
- return from_entry_bridge(part, allparts)
- return False
-
-def test_from_entry_bridge():
- assert from_entry_bridge(
- "# Loop 4 : entry bridge with 31 ops\n[p0, etc", [])
- assert not from_entry_bridge(
- "# Loop 1 : loop with 31 ops\n[p0, p1, etc", [])
- assert not from_entry_bridge(
- "# bridge out of Guard 5 with 24 ops\n[p0, p1, etc",
- ["# Loop 1 : loop with 31 ops\n"
- "[p0, p1]\n"
- "guard_stuff(descr=<Guard5>)\n"])
- assert from_entry_bridge(
- "# bridge out of Guard 5 with 24 ops\n[p0, p1, etc",
- ["# Loop 1 : entry bridge with 31 ops\n"
- "[p0, p1]\n"
- "guard_stuff(descr=<Guard5>)\n"])
- assert not from_entry_bridge(
- "# bridge out of Guard 51 with 24 ops\n[p0, p1, etc",
- ["# Loop 1 : loop with 31 ops\n"
- "[p0, p1]\n"
- "guard_stuff(descr=<Guard5>)\n",
- "# bridge out of Guard 5 with 13 ops\n"
- "[p0, p1]\n"
- "guard_other(p1, descr=<Guard51>)\n"])
- assert from_entry_bridge(
- "# bridge out of Guard 51 with 24 ops\n[p0, p1, etc",
- ["# Loop 1 : entry bridge with 31 ops\n"
- "[p0, p1]\n"
- "guard_stuff(descr=<Guard5>)\n",
- "# bridge out of Guard 5 with 13 ops\n"
- "[p0, p1]\n"
- "guard_other(p1, descr=<Guard51>)\n"])
-
-
-class PyPyCJITTests(object):
- def run_source(self, source, expected_max_ops, *testcases, **kwds):
- assert isinstance(expected_max_ops, int)
- threshold = kwds.pop('threshold', 3)
- self.count_debug_merge_point = \
- kwds.pop('count_debug_merge_point', True)
- if kwds:
- raise TypeError, 'Unsupported keyword arguments: %s' % kwds.keys()
- source = py.code.Source(source)
- filepath = self.tmpdir.join('case%d.py' % self.counter)
- logfilepath = filepath.new(ext='.log')
- self.__class__.counter += 1
- f = filepath.open('w')
- print >> f, source
- # some support code...
- print >> f, py.code.Source("""
- import sys
- # we don't want to see the small bridges created
- # by the checkinterval reaching the limit
- sys.setcheckinterval(10000000)
- try: # make the file runnable by CPython
- import pypyjit
- pypyjit.set_param(threshold=%d)
- except ImportError:
- pass
-
- def check(args, expected):
- #print >> sys.stderr, 'trying:', args
- result = main(*args)
- #print >> sys.stderr, 'got:', repr(result)
- assert result == expected
- assert type(result) is type(expected)
- """ % threshold)
- for testcase in testcases * 2:
- print >> f, "check(%r, %r)" % testcase
- print >> f, "print 'OK :-)'"
- f.close()
-
- print logfilepath
- env = os.environ.copy()
- env['PYPYLOG'] = ":%s" % (logfilepath,)
- p = subprocess.Popen([self.pypy_c, str(filepath)],
- env=env, stdout=subprocess.PIPE)
- result, _ = p.communicate()
- assert result
- if result.strip().startswith('SKIP:'):
- py.test.skip(result.strip())
- assert result.splitlines()[-1].strip() == 'OK :-)'
- self.parse_loops(logfilepath)
- self.print_loops()
- print logfilepath
- if self.total_ops > expected_max_ops:
- assert 0, "too many operations: got %d, expected maximum %d" % (
- self.total_ops, expected_max_ops)
- return result
-
- def parse_loops(self, opslogfile):
- from pypy.tool import logparser
- assert opslogfile.check()
- log = logparser.parse_log_file(str(opslogfile))
- parts = logparser.extract_category(log, 'jit-log-opt-')
- self.rawloops = [part for part in parts
- if not from_entry_bridge(part, parts)]
- self.loops, self.sliced_loops, self.total_ops = \
- self.parse_rawloops(self.rawloops)
- self.check_0_op_bytecodes()
- self.rawentrybridges = [part for part in parts
- if from_entry_bridge(part, parts)]
- _, self.sliced_entrybridge, _ = \
- self.parse_rawloops(self.rawentrybridges)
-
- from pypy.jit.tool.jitoutput import parse_prof
- summaries = logparser.extract_category(log, 'jit-summary')
- if len(summaries) > 0:
- self.jit_summary = parse_prof(summaries[-1])
- else:
- self.jit_summary = None
-
-
- def parse_rawloops(self, rawloops):
- from pypy.jit.tool.oparser import parse
- loops = [parse(part, no_namespace=True) for part in rawloops]
- sliced_loops = [] # contains all bytecodes of all loops
- total_ops = 0
- for loop in loops:
- for op in loop.operations:
- if op.getopname() == "debug_merge_point":
- sliced_loop = BytecodeTrace()
- sliced_loop.bytecode = op.getarg(0)._get_str().rsplit(" ",
1)[1]
- sliced_loops.append(sliced_loop)
- if self.count_debug_merge_point:
- total_ops += 1
- else:
- sliced_loop.append(op)
- total_ops += 1
- return loops, sliced_loops, total_ops
-
- def check_0_op_bytecodes(self):
- for bytecodetrace in self.sliced_loops:
- if bytecodetrace.bytecode not in ZERO_OP_BYTECODES:
- continue
- assert not bytecodetrace
-
- def get_by_bytecode(self, name, from_entry_bridge=False):
- if from_entry_bridge:
- sliced_loops = self.sliced_entrybridge
- else:
- sliced_loops = self.sliced_loops
- return [ops for ops in sliced_loops if ops.bytecode == name]
-
- def print_loops(self):
- for rawloop in self.rawloops:
- print
- print '@' * 79
- print
- print rawloop.rstrip()
- print
- print '@' * 79
-
-
- def test_richards(self):
- self.run_source('''
- import sys; sys.path[:] = %r
- from pypy.translator.goal import richards
-
- def main():
- return richards.main(iterations = 1)
- ''' % (sys.path,), 7200,
- ([], 42))
-
-
-class AppTestJIT(PyPyCJITTests):
- def setup_class(cls):
- if not option.runappdirect:
- py.test.skip("meant only for pypy-c")
- # the next line skips stuff if the pypy-c is not a jit build
- cls.space = gettestobjspace(usemodules=['pypyjit'])
- cls.tmpdir = udir.join('pypy-jit')
- cls.tmpdir.ensure(dir=1)
- cls.counter = 0
- cls.pypy_c = sys.executable
-
-class TestJIT(PyPyCJITTests):
- def setup_class(cls):
- if option.pypy_c is None:
- py.test.skip("pass --pypy!")
- if not has_info(option.pypy_c, 'translation.jit'):
- py.test.skip("must give a pypy-c with the jit enabled")
- cls.tmpdir = udir.join('pypy-jit')
- cls.tmpdir.ensure(dir=1)
- cls.counter = 0
- cls.pypy_c = option.pypy_c
-
-
-def has_info(pypy_c, option):
- g = os.popen('"%s" --info' % pypy_c, 'r')
- lines = g.readlines()
- g.close()
- if not lines:
- raise ValueError("cannot execute %r" % pypy_c)
- for line in lines:
- line = line.strip()
- if line.startswith(option + ':'):
- line = line[len(option)+1:].strip()
- if line == 'True':
- return True
- elif line == 'False':
- return False
- else:
- return line
- raise ValueError(option + ' not found in ' + pypy_c)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit