[pypy-svn] r68768 - in pypy/branch/logging/pypy/rlib: . test

arigo at codespeak.net arigo at codespeak.net
Mon Oct 26 20:10:58 CET 2009


Author: arigo
Date: Mon Oct 26 20:10:57 2009
New Revision: 68768

Added:
   pypy/branch/logging/pypy/rlib/rlog_parsing.py   (contents, props changed)
   pypy/branch/logging/pypy/rlib/test/test_rlog_parsing.py   (contents, props changed)
Modified:
   pypy/branch/logging/pypy/rlib/rlog.py
Log:
Parsing of the generated log files.


Modified: pypy/branch/logging/pypy/rlib/rlog.py
==============================================================================
--- pypy/branch/logging/pypy/rlib/rlog.py	(original)
+++ pypy/branch/logging/pypy/rlib/rlog.py	Mon Oct 26 20:10:57 2009
@@ -77,13 +77,13 @@
                 "duplicate name %r in the log message %r" % (name, message))
             seen[name] = True
             self.entries.append((name, typechar))
+        self.types = [typechar for name, typechar in self.entries]
         self.call = None
 
     def gen_call(self, logwriter):
         if self.call is None:
             self.logwriter = logwriter
-            types = [typechar for name, typechar in self.entries]
-            types = unrolling_iterable(types)
+            types = unrolling_iterable(self.types)
             #
             def call(*args):
                 if logwriter.enabled:

Added: pypy/branch/logging/pypy/rlib/rlog_parsing.py
==============================================================================
--- (empty file)
+++ pypy/branch/logging/pypy/rlib/rlog_parsing.py	Mon Oct 26 20:10:57 2009
@@ -0,0 +1,73 @@
+import struct
+from pypy.rlib.rarithmetic import intmask
+from pypy.rlib import rlog
+
+SIZEOF_FLOAT = rlog.LLLogWriter.SIZEOF_FLOAT
+
+
+class LogParser(object):
+
+    def __init__(self, file, has_signature=True):
+        self.f = file
+        if has_signature:
+            signature = self.f.read(5)
+            assert signature == 'RLog\n'
+            extra1 = self.read_int()
+            assert extra1 == -1
+            extra2 = self.read_float()
+            assert extra2 == 1.0
+        self.startpos = self.f.tell()
+
+    def read_int(self):
+        nextc = self.f.read(1)
+        if not nextc:
+            raise EOFError
+        shift = 0
+        result = 0
+        lastbyte = ord(nextc)
+        while lastbyte & 0x80:
+            result |= ((lastbyte & 0x7F) << shift)
+            shift += 7
+            lastbyte = ord(self.f.read(1))
+        result |= (lastbyte << shift)
+        return intmask(result)
+
+    def read_str(self):
+        length = self.read_int()
+        assert length >= 0
+        return self.f.read(length)
+
+    def read_float(self):
+        return struct.unpack("f", self.f.read(SIZEOF_FLOAT))[0]
+
+    def enum_entries(self):
+        self.f.seek(self.startpos)
+        categories = {}
+        readers = {
+            'd': self.read_int,
+            's': self.read_str,
+            'f': self.read_float,
+            }
+        curtime = 0.0
+        while 1:
+            try:
+                c = self.read_int()
+            except EOFError:
+                return
+            if c == 0:
+                # define_new_category
+                index = self.read_int()
+                category = self.read_str()
+                message = self.read_str()
+                assert index not in categories
+                categories[index] = rlog.LogCategory(category, message, index)
+            else:
+                curtime += self.read_float()
+                cat = categories[c]
+                entries = [readers[t]() for t in cat.types]
+                yield curtime, cat, entries
+
+
+def parse_log(filename):
+    logparser = LogParser(open(filename, 'rb'))
+    return logparser.enum_entries()

Added: pypy/branch/logging/pypy/rlib/test/test_rlog_parsing.py
==============================================================================
--- (empty file)
+++ pypy/branch/logging/pypy/rlib/test/test_rlog_parsing.py	Mon Oct 26 20:10:57 2009
@@ -0,0 +1,48 @@
+import py, struct
+from cStringIO import StringIO
+from pypy.rlib.rlog_parsing import LogParser
+
+def test_read_int_str():
+    s = (chr(42) +
+         chr(0x9A) + chr(15) +
+         chr(3) + 'Abc' +
+         chr(0x82) + chr(1) + 'x'*130 +
+         chr(0))
+    logparser = LogParser(StringIO(s), has_signature=False)
+    x = logparser.read_int()
+    assert x == 42
+    x = logparser.read_int()
+    assert x == (15 << 7) | 0x1A
+    x = logparser.read_str()
+    assert x == 'Abc'
+    x = logparser.read_str()
+    assert x == 'x'*130
+    x = logparser.read_int()
+    assert x == 0
+    py.test.raises(EOFError, logparser.read_int)
+
+def test_simple_parsing_int():
+    s = ('\x00\x01\x02Aa\x0EHello %(foo)d.' +
+         '\x01' + struct.pack("f", 12.5) + chr(42) +
+         '\x01' + struct.pack("f", 2.5) + chr(61))
+    logparser = LogParser(StringIO(s), has_signature=False)
+    entries = list(logparser.enum_entries())
+    assert len(entries) == 2
+    cat = entries[0][1]
+    assert entries == [
+        (12.5, cat, [42]),
+        (15.0, cat, [61]),
+        ]
+
+def test_simple_parsing_float():
+    s = ('\x00\x82\x05\x02Aa\x0EHello %(foo)f.' +
+         '\x82\x05' + struct.pack("ff", 12.5, -62.5) +
+         '\x82\x05' + struct.pack("ff", 2.5, -0.25))
+    logparser = LogParser(StringIO(s), has_signature=False)
+    entries = list(logparser.enum_entries())
+    assert len(entries) == 2
+    cat = entries[0][1]
+    assert entries == [
+        (12.5, cat, [-62.5]),
+        (15.0, cat, [-0.25]),
+        ]



More information about the Pypy-commit mailing list