Author: Richard Plangger <[email protected]>
Branch: new-jit-log
Changeset: r83851:44a816042aee
Date: 2016-04-25 10:17 +0200
http://bitbucket.org/pypy/pypy/changeset/44a816042aee/
Log: more tests stressing the prefix compression in the log
diff --git a/rpython/rlib/jitlog.py b/rpython/rlib/jitlog.py
--- a/rpython/rlib/jitlog.py
+++ b/rpython/rlib/jitlog.py
@@ -85,38 +85,30 @@
MP_OPCODE = (0x10, "s")
class WrappedValue(object):
- def encode(self, log, i, prefixes):
+ def encode(self, log, i, compressor):
raise NotImplementedError
class StringValue(WrappedValue):
def __init__(self, sem_type, gen_type, value):
self.value = value
- def encode(self, log, i, prefixes):
+ def encode(self, log, i, compressor):
str_value = self.value
- if len(str_value) < 5:
- enc_value = encode_str(chr(0xff) + str_value)
+ last_prefix = compressor.get_last_written(i)
+ cp = compressor.compress(i, str_value)
+ if cp is None:
+ return chr(0xff) + encode_str(str_value)
+
else:
- cp = commonprefix([prefixes[i], str_value])
- if cp != prefixes[i]:
- if len(cp) == 0:
- # they are fully different!
- prefixes[i] = str_value
- enc_value = encode_str(chr(0xff) + str_value)
- else:
- # the prefix changed
- prefixes[i] = cp
- # common prefix of field i
- assert i != 0xff
- log._write_marked(MARK_COMMON_PREFIX, chr(i) \
- + encode_str(cp))
- enc_value = encode_str(chr(i) + str_value)
+ cp_len = len(cp)
+ if cp == last_prefix:
+ # we have the same prefix
+ pass
else:
- enc_value = encode_str(chr(i) + str_value)
- #
- if prefixes[i] is None:
- prefixes[i] = str_value
- return enc_value
+ compressor.write(log, i, cp)
+ if len(str_value) == len(cp):
+ return "\xef"
+ return chr(i) + encode_str(str_value[len(cp):])
class IntValue(WrappedValue):
def __init__(self, sem_type, gen_type, value):
@@ -263,12 +255,42 @@
EMPTY_TRACE_LOG = BaseLogTrace()
-def encode_merge_point(log, prefixes, values):
+class PrefixCompressor(object):
+ def __init__(self, count):
+ self.prefixes = [None] * count
+ self.written_prefixes = [None] * count
+
+ def get_last(self, index):
+ return self.prefixes[index]
+
+ def get_last_written(self, index):
+ return self.written_prefixes[index]
+
+ def compress(self, index, string):
+ assert string is not None
+ last = self.get_last(index)
+ if last is None:
+ self.prefixes[index] = string
+ return None
+ cp = commonprefix(last, string)
+ if len(cp) <= 1: # prevent common prefix '/'
+ self.prefixes[index] = string
+ return None
+ return cp
+
+
+ def write(self, log, index, prefix):
+ # we have a new prefix
+ log._write_marked(MARK_COMMON_PREFIX, chr(index) \
+ + encode_str(prefix))
+ self.written_prefixes[index] = prefix
+
+def encode_merge_point(log, compressor, values):
line = []
unrolled = unrolling_iterable(values)
i = 0
for value in unrolled:
- line.append(value.encode(log,i,prefixes))
+ line.append(value.encode(log,i,compressor))
i += 1
return ''.join(line)
@@ -339,10 +361,11 @@
if self.common_prefix is None:
# first time visiting a merge point
# setup the common prefix
- self.common_prefix = [""] * len(types)
+ self.common_prefix = PrefixCompressor(len(types))
encoded_types = []
- for i, (semantic_type, _) in enumerate(types):
+ for i, (semantic_type, generic_type) in enumerate(types):
encoded_types.append(chr(semantic_type))
+ encoded_types.append(chr(generic_type))
log._write_marked(MARK_INIT_MERGE_POINT, ''.join(encoded_types))
# the types have already been written
diff --git a/rpython/rlib/test/test_jitlog.py b/rpython/rlib/test/test_jitlog.py
--- a/rpython/rlib/test/test_jitlog.py
+++ b/rpython/rlib/test/test_jitlog.py
@@ -7,6 +7,13 @@
from rpython.rlib.jitlog import (encode_str, encode_le_16bit, encode_le_64bit)
from rpython.rlib import jitlog as jl
+class FakeLog(object):
+ def __init__(self):
+ self.values = []
+
+ def _write_marked(self, id, text):
+ self.values.append(chr(id) + text)
+
class TestLogger(object):
def make_metainterp_sd(self):
@@ -27,7 +34,7 @@
return FakeMetaInterpSd()
def test_debug_merge_point(self, tmpdir):
- logger = jitlog.VMProfJitLogger()
+ logger = jl.VMProfJitLogger()
file = tmpdir.join('binary_file')
file.ensure()
fd = file.open('wb')
@@ -47,13 +54,37 @@
encode_le_64bit(99) + \
encode_str('DEL'))
- class FakeLog(object):
- def _write_marked(self, id, text):
- pass
-
def test_common_prefix(self):
fakelog = FakeLog()
- logger = jitlog.LogTrace(0x0, {}, None, None, fakelog)
+ compressor = jl.PrefixCompressor(1)
+ # nothing to compress yet!
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','hello')])
+ assert result == b"\xff\x05\x00\x00\x00hello"
+ assert fakelog.values == []
+ #
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','hello')])
+ assert result == b"\xef"
+ assert fakelog.values == ["\x25\x00\x05\x00\x00\x00hello"]
+ #
+ fakelog.values = []
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','heiter')])
+ assert result == b"\x00\x04\x00\x00\x00iter"
+ assert fakelog.values == ["\x25\x00\x02\x00\x00\x00he"]
+ #
+ fakelog.values = []
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','heute')])
+ assert result == b"\x00\x03\x00\x00\x00ute"
+ assert fakelog.values == []
+ #
+ fakelog.values = []
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','welt')])
+ assert result == b"\xff\x04\x00\x00\x00welt"
+ assert fakelog.values == []
+ #
+ fakelog.values = []
+ result = jl.encode_merge_point(fakelog, compressor,
[jl.StringValue(0x0,'s','welle')])
+ assert result == b"\x00\x02\x00\x00\x00le"
+ assert fakelog.values == ["\x25\x00\x03\x00\x00\x00wel"]
def test_common_prefix_func(self):
assert jl.commonprefix("","") == ""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit