[pypy-commit] pypy default: hg merge remove-py-log

arigo pypy.commits at gmail.com
Fri Mar 11 12:31:46 EST 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r82989:9cea4c424341
Date: 2016-03-11 18:31 +0100
http://bitbucket.org/pypy/pypy/changeset/9cea4c424341/

Log:	hg merge remove-py-log

	Remove py.log usage which seems particularly JIT-unfriendly. Replace
	it with much simpler code.

diff --git a/lib_pypy/ctypes_config_cache/rebuild.py b/lib_pypy/ctypes_config_cache/rebuild.py
--- a/lib_pypy/ctypes_config_cache/rebuild.py
+++ b/lib_pypy/ctypes_config_cache/rebuild.py
@@ -9,9 +9,8 @@
 
 _dirpath = os.path.dirname(__file__) or os.curdir
 
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("ctypes_config_cache")
-py.log.setconsumer("ctypes_config_cache", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+log = AnsiLogger("ctypes_config_cache")
 
 
 def rebuild_one(name):
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -3,7 +3,7 @@
 import types
 from collections import defaultdict
 
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 from rpython.tool.pairtype import pair
 from rpython.tool.error import (format_blocked_annotation_error,
                              gather_error, source_lines)
@@ -15,9 +15,7 @@
 from rpython.annotator.bookkeeper import Bookkeeper
 from rpython.rtyper.normalizecalls import perform_normalizations
 
-import py
-log = py.log.Producer("annrpython")
-py.log.setconsumer("annrpython", ansi_log)
+log = AnsiLogger("annrpython")
 
 
 class RPythonAnnotator(object):
diff --git a/rpython/jit/backend/ppc/runner.py b/rpython/jit/backend/ppc/runner.py
--- a/rpython/jit/backend/ppc/runner.py
+++ b/rpython/jit/backend/ppc/runner.py
@@ -1,4 +1,3 @@
-import py
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rtyper.llinterp import LLInterpreter
 from rpython.rlib import rgc
@@ -9,9 +8,6 @@
 from rpython.jit.backend.ppc.codebuilder import PPCBuilder
 from rpython.jit.backend.ppc import register as r
 
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer('jitbackend')
-py.log.setconsumer('jitbackend', ansi_log)
 
 class PPC_CPU(AbstractLLCPU):
 
diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -10,10 +10,6 @@
 
 import sys
 
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer('jitbackend')
-py.log.setconsumer('jitbackend', ansi_log)
-
 
 class AbstractX86CPU(AbstractLLCPU):
     debug = True
diff --git a/rpython/jit/codewriter/policy.py b/rpython/jit/codewriter/policy.py
--- a/rpython/jit/codewriter/policy.py
+++ b/rpython/jit/codewriter/policy.py
@@ -1,10 +1,8 @@
 from rpython.jit.metainterp import history
 from rpython.tool.udir import udir
+from rpython.tool.ansi_print import AnsiLogger
 
-import py
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer('jitcodewriter')
-py.log.setconsumer('jitcodewriter', ansi_log)
+log = AnsiLogger('jitcodewriter')
 
 
 class JitPolicy(object):
diff --git a/rpython/memory/gctransform/log.py b/rpython/memory/gctransform/log.py
--- a/rpython/memory/gctransform/log.py
+++ b/rpython/memory/gctransform/log.py
@@ -1,4 +1,3 @@
-import py
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("gctransform")
-py.log.setconsumer("gctransform", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+
+log = AnsiLogger("gctransform")
diff --git a/rpython/memory/test/gc_test_base.py b/rpython/memory/test/gc_test_base.py
--- a/rpython/memory/test/gc_test_base.py
+++ b/rpython/memory/test/gc_test_base.py
@@ -3,6 +3,7 @@
 
 from rpython.memory import gcwrapper
 from rpython.memory.test import snippet
+from rpython.rtyper import llinterp
 from rpython.rtyper.test.test_llinterp import get_interpreter
 from rpython.rtyper.lltypesystem import lltype
 from rpython.rtyper.lltypesystem.lloperation import llop
@@ -15,11 +16,11 @@
 WORD = LONG_BIT // 8
 
 
-def stdout_ignore_ll_functions(msg):
-    strmsg = str(msg)
-    if "evaluating" in strmsg and "ll_" in strmsg:
-        return
-    print >>sys.stdout, strmsg
+## def stdout_ignore_ll_functions(msg):
+##     strmsg = str(msg)
+##     if "evaluating" in strmsg and "ll_" in strmsg:
+##         return
+##     print >>sys.stdout, strmsg
 
 
 class GCTest(object):
@@ -31,13 +32,11 @@
     WREF_IS_INVALID_BEFORE_DEL_IS_CALLED = False
 
     def setup_class(cls):
-        cls._saved_logstate = py.log._getstate()
-        py.log.setconsumer("llinterp", py.log.STDOUT)
-        py.log.setconsumer("llinterp frame", stdout_ignore_ll_functions)
-        py.log.setconsumer("llinterp operation", None)
+        # switch on logging of interp to show more info on failing tests
+        llinterp.log.output_disabled = False
 
     def teardown_class(cls):
-        py.log._setstate(cls._saved_logstate)
+        llinterp.log.output_disabled = True
 
     def interpret(self, func, values, **kwds):
         interp, graph = get_interpreter(func, values, **kwds)
diff --git a/rpython/rlib/clibffi.py b/rpython/rlib/clibffi.py
--- a/rpython/rlib/clibffi.py
+++ b/rpython/rlib/clibffi.py
@@ -22,9 +22,6 @@
 import sys
 import ctypes.util
 
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("libffi")
-py.log.setconsumer("libffi", ansi_log)
 
 # maaaybe isinstance here would be better. Think
 _MSVC = platform.name == "msvc"
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -14,9 +14,15 @@
     r_uint, r_longlong, r_ulonglong, r_longlonglong)
 from rpython.rtyper.lltypesystem import lltype, llmemory, lloperation, llheap
 from rpython.rtyper import rclass
+from rpython.tool.ansi_print import AnsiLogger
 
 
-log = py.log.Producer('llinterp')
+# by default this logger's output is disabled.
+# e.g. tests can then switch on logging to get more help
+# for failing tests
+log = AnsiLogger('llinterp')
+log.output_disabled = True
+
 
 class LLException(Exception):
     def __init__(self, *args):
@@ -1367,10 +1373,3 @@
 class _address_of_thread_local(object):
     _TYPE = llmemory.Address
     is_fake_thread_local_addr = True
-
-
-# by default we route all logging messages to nothingness
-# e.g. tests can then switch on logging to get more help
-# for failing tests
-from rpython.tool.ansi_print import ansi_log
-py.log.setconsumer('llinterp', ansi_log)
diff --git a/rpython/rtyper/rmodel.py b/rpython/rtyper/rmodel.py
--- a/rpython/rtyper/rmodel.py
+++ b/rpython/rtyper/rmodel.py
@@ -454,13 +454,9 @@
 
 # logging/warning
 
-import py
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 
-log = py.log.Producer("rtyper")
-py.log.setconsumer("rtyper", ansi_log)
-py.log.setconsumer("rtyper translating", None)
-py.log.setconsumer("rtyper debug", None)
+log = AnsiLogger("rtyper")
 
 def warning(msg):
     log.WARNING(msg)
diff --git a/rpython/rtyper/test/test_llinterp.py b/rpython/rtyper/test/test_llinterp.py
--- a/rpython/rtyper/test/test_llinterp.py
+++ b/rpython/rtyper/test/test_llinterp.py
@@ -2,7 +2,7 @@
 import py
 import sys
 from rpython.rtyper.lltypesystem.lltype import typeOf, Void, malloc, free
-from rpython.rtyper.llinterp import LLInterpreter, LLException
+from rpython.rtyper.llinterp import LLInterpreter, LLException, log
 from rpython.rtyper.rmodel import inputconst
 from rpython.rtyper.annlowlevel import hlstr, llhelper
 from rpython.rtyper.exceptiondata import UnknownException
@@ -16,13 +16,10 @@
 from rpython.rtyper.rtyper import llinterp_backend
 
 # switch on logging of interp to show more info on failing tests
-
 def setup_module(mod):
-    mod.logstate = py.log._getstate()
-    py.log.setconsumer("llinterp", py.log.STDOUT)
-
+    log.output_disabled = False
 def teardown_module(mod):
-    py.log._setstate(mod.logstate)
+    log.output_disabled = True
 
 
 def gengraph(func, argtypes=[], viewbefore='auto', policy=None,
diff --git a/rpython/rtyper/test/test_rtyper.py b/rpython/rtyper/test/test_rtyper.py
--- a/rpython/rtyper/test/test_rtyper.py
+++ b/rpython/rtyper/test/test_rtyper.py
@@ -1,5 +1,3 @@
-import py
-
 from rpython.annotator import model as annmodel, annrpython
 from rpython.flowspace.model import Constant
 from rpython.rtyper import rmodel
@@ -9,14 +7,6 @@
 from rpython.translator.translator import TranslationContext, graphof
 
 
-def setup_module(mod):
-    mod.logstate = py.log._getstate()
-    py.log.setconsumer("rtyper", py.log.STDOUT)
-    py.log.setconsumer("annrpython", None)
-
-def teardown_module(mod):
-    py.log._setstate(mod.logstate)
-
 def test_reprkeys_dont_clash():
     stup1 = annmodel.SomeTuple((annmodel.SomeFloat(),
                                 annmodel.SomeInteger()))
diff --git a/rpython/tool/ansi_print.py b/rpython/tool/ansi_print.py
--- a/rpython/tool/ansi_print.py
+++ b/rpython/tool/ansi_print.py
@@ -1,74 +1,77 @@
 """
-A color print.
+A simple color logger.
 """
 
 import sys
 from py.io import ansi_print
 from rpython.tool.ansi_mandelbrot import Driver
 
-class AnsiLog:
-    wrote_dot = False # XXX sharing state with all instances
 
-    KW_TO_COLOR = {
-        # color supress
-        'red': ((31,), True),
-        'bold': ((1,), True),
-        'WARNING': ((31,), False),
-        'event': ((1,), True),
-        'ERROR': ((1, 31), False),
-        'Error': ((1, 31), False),
-        'info': ((35,), False),
-        'stub': ((34,), False),
-    }
+isatty = getattr(sys.stderr, 'isatty', lambda: False)
+mandelbrot_driver = Driver()
+wrote_dot = False     # global shared state
 
-    def __init__(self, kw_to_color={}, file=None):
-        self.kw_to_color = self.KW_TO_COLOR.copy()
-        self.kw_to_color.update(kw_to_color)
-        self.file = file
-        self.fancy = True
-        self.isatty = getattr(sys.stderr, 'isatty', lambda: False)
-        if self.fancy and self.isatty(): 
-            self.mandelbrot_driver = Driver()
+
+def _make_method(subname, colors):
+    #
+    def logger_method(self, text):
+        global wrote_dot
+        if self.output_disabled:
+            return
+        text = "[%s%s] %s" % (self.name, subname, text)
+        if isatty():
+            col = colors
         else:
-            self.mandelbrot_driver = None
+            col = ()
+        if wrote_dot:
+            text = '\n' + text
+        ansi_print(text, col)
+        wrote_dot = False
+    #
+    return logger_method
 
-    def __call__(self, msg):
-        tty = self.isatty()
-        flush = False
-        newline = True
-        keywords = []
-        esc = []
-        for kw in msg.keywords:
-            color, supress = self.kw_to_color.get(kw, (None, False))
-            if color:
-                esc.extend(color)
-            if not supress:
-                keywords.append(kw)
-        if 'start' in keywords:
-            if tty:
-                newline = False
-                flush = True
-                keywords.remove('start')
-        elif 'done' in keywords:
-            if tty:
-                print >> sys.stderr
-                return
-        elif 'dot' in keywords:
-            if tty:
-                if self.fancy:
-                    if not AnsiLog.wrote_dot:
-                        self.mandelbrot_driver.reset()
-                    self.mandelbrot_driver.dot()
-                else:
-                    ansi_print(".", tuple(esc), file=self.file, newline=False, flush=flush)
-                AnsiLog.wrote_dot = True
-                return
-        if AnsiLog.wrote_dot:
-            AnsiLog.wrote_dot = False
-            sys.stderr.write("\n")
-        esc = tuple(esc)
-        for line in msg.content().splitlines():
-            ansi_print("[%s] %s" %(":".join(keywords), line), esc, 
-                       file=self.file, newline=newline, flush=flush)
 
-ansi_log = AnsiLog()
+class AnsiLogger(object):
+    output_disabled = False
+
+    def __init__(self, name):
+        self.name = name
+
+    # these methods write "[name:method] text" to the terminal, with color codes
+    red      = _make_method('', (31,))
+    bold     = _make_method('', (1,))
+    WARNING  = _make_method(':WARNING', (31,))
+    event    = _make_method('', (1,))
+    ERROR    = _make_method(':ERROR', (1, 31))
+    Error    = _make_method(':Error', (1, 31))
+    info     = _make_method(':info', (35,))
+    stub     = _make_method(':stub', (34,))
+
+    # some more methods used by sandlib
+    call      = _make_method(':call', (34,))
+    result    = _make_method(':result', (34,))
+    exception = _make_method(':exception', (34,)),
+    vpath     = _make_method(':vpath', (35,)),
+    timeout   = _make_method('', (1, 31)),
+
+    # directly calling the logger writes "[name] text" with no particular color
+    __call__ = _make_method('', ())
+
+    # calling unknown method names writes "[name:method] text" without color
+    def __getattr__(self, name):
+        if name[0].isalpha():
+            method = _make_method(':' + name, ())
+            setattr(self.__class__, name, method)
+            return getattr(self, name)
+        raise AttributeError(name)
+
+    def dot(self):
+        """Output a mandelbrot dot to the terminal."""
+        global wrote_dot
+        if not wrote_dot:
+            mandelbrot_driver.reset()
+            wrote_dot = True
+        mandelbrot_driver.dot()
+
+    def debug(self, info):
+        """For messages that are dropped.  Can be monkeypatched in tests."""
diff --git a/rpython/tool/error.py b/rpython/tool/error.py
--- a/rpython/tool/error.py
+++ b/rpython/tool/error.py
@@ -8,12 +8,8 @@
 
 from rpython.flowspace.model import Variable
 from rpython.rlib import jit
-from rpython.tool.ansi_print import ansi_log
 
 
-log = py.log.Producer("error")
-py.log.setconsumer("error", ansi_log)
-
 SHOW_TRACEBACK = False
 SHOW_ANNOTATIONS = True
 SHOW_DEFAULT_LINES_OF_CODE = 0
diff --git a/rpython/tool/test/test_ansi_print.py b/rpython/tool/test/test_ansi_print.py
new file mode 100644
--- /dev/null
+++ b/rpython/tool/test/test_ansi_print.py
@@ -0,0 +1,84 @@
+from _pytest.monkeypatch import monkeypatch
+from rpython.tool import ansi_print, ansi_mandelbrot
+
+
+class FakeOutput(object):
+    def __init__(self, tty=True):
+        self.monkey = monkeypatch()
+        self.tty = tty
+        self.output = []
+    def __enter__(self, *args):
+        ansi_print.wrote_dot = False
+        self.monkey.setattr(ansi_print, 'ansi_print', self._print)
+        self.monkey.setattr(ansi_print, 'isatty', self._isatty)
+        self.monkey.setattr(ansi_mandelbrot, 'ansi_print', self._print)
+        return self.output
+    def __exit__(self, *args):
+        self.monkey.undo()
+
+    def _print(self, text, colors, newline=True, flush=True):
+        if newline:
+            text += '\n'
+        self.output.append((text, colors))
+    def _isatty(self):
+        return self.tty
+
+
+def test_simple():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log('Hello')
+    assert output == [('[test] Hello\n', ())]
+
+def test_bold():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log.bold('Hello')
+    assert output == [('[test] Hello\n', (1,))]
+
+def test_not_a_tty():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput(tty=False) as output:
+        log.bold('Hello')
+    assert output == [('[test] Hello\n', ())]
+
+def test_dot_1():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log.dot()
+    assert len(output) == 1
+    assert len(output[0][0]) == 1    # single character
+    # output[0][1] is some ansi color code from mandelbort_driver
+
+def test_dot_mixing_with_regular_lines():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log.dot()
+        log.dot()
+        log.WARNING('oops')
+        log.WARNING('maybe?')
+        log.dot()
+    assert len(output) == 5
+    assert len(output[0][0]) == 1    # single character
+    assert len(output[1][0]) == 1    # single character
+    assert output[2] == ('\n[test:WARNING] oops\n', (31,))
+    assert output[3] == ('[test:WARNING] maybe?\n', (31,))
+    assert len(output[4][0]) == 1    # single character
+
+def test_unknown_method_names():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log.foo('Hello')
+        log.foo('World')
+        log.BAR('!')
+    assert output == [('[test:foo] Hello\n', ()),
+                      ('[test:foo] World\n', ()),
+                      ('[test:BAR] !\n', ())]
+
+def test_output_disabled():
+    log = ansi_print.AnsiLogger('test')
+    with FakeOutput() as output:
+        log('Hello')
+        log.output_disabled = True
+        log('World')
+    assert output == [('[test] Hello\n', ())]
diff --git a/rpython/tool/version.py b/rpython/tool/version.py
--- a/rpython/tool/version.py
+++ b/rpython/tool/version.py
@@ -10,9 +10,8 @@
     if not err:
         return
 
-    from rpython.tool.ansi_print import ansi_log
-    log = py.log.Producer("version")
-    py.log.setconsumer("version", ansi_log)
+    from rpython.tool.ansi_print import AnsiLogger
+    log = AnsiLogger("version")
     log.WARNING('Errors getting %s information: %s' % (repo_type, err))
 
 def get_repo_version_info(hgexe=None, root=rpythonroot):
diff --git a/rpython/translator/backendopt/canraise.py b/rpython/translator/backendopt/canraise.py
--- a/rpython/translator/backendopt/canraise.py
+++ b/rpython/translator/backendopt/canraise.py
@@ -1,11 +1,8 @@
-import py
-
 from rpython.rtyper.lltypesystem.lloperation import LL_OPERATIONS
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 from rpython.translator.backendopt import graphanalyze
 
-log = py.log.Producer("canraise")
-py.log.setconsumer("canraise", ansi_log)
+log = AnsiLogger("canraise")
 
 
 class RaiseAnalyzer(graphanalyze.BoolGraphAnalyzer):
diff --git a/rpython/translator/backendopt/merge_if_blocks.py b/rpython/translator/backendopt/merge_if_blocks.py
--- a/rpython/translator/backendopt/merge_if_blocks.py
+++ b/rpython/translator/backendopt/merge_if_blocks.py
@@ -1,7 +1,8 @@
 from rpython.flowspace.model import Constant, Variable, mkentrymap
-from rpython.translator.backendopt.support import log
+from rpython.tool.ansi_print import AnsiLogger
 
-log = log.mergeifblocks
+log = AnsiLogger("backendopt")
+
 
 def is_chain_block(block, first=False):
     if len(block.operations) == 0:
diff --git a/rpython/translator/backendopt/support.py b/rpython/translator/backendopt/support.py
--- a/rpython/translator/backendopt/support.py
+++ b/rpython/translator/backendopt/support.py
@@ -1,13 +1,9 @@
-import py
-
 from rpython.rtyper.lltypesystem import lltype
 from rpython.rtyper.rmodel import inputconst
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 from rpython.translator.simplify import get_graph
 
-
-log = py.log.Producer("backendopt")
-py.log.setconsumer("backendopt", ansi_log)
+log = AnsiLogger("backendopt")
 
 
 def graph_operations(graph):
diff --git a/rpython/translator/backendopt/test/test_removenoops.py b/rpython/translator/backendopt/test/test_removenoops.py
--- a/rpython/translator/backendopt/test/test_removenoops.py
+++ b/rpython/translator/backendopt/test/test_removenoops.py
@@ -12,8 +12,6 @@
 from rpython.rtyper.llinterp import LLInterpreter
 from rpython.conftest import option
 
-import py
-log = py.log.Producer('test_backendoptimization')
 
 def get_graph(fn, signature, all_opts=True):
     t = TranslationContext()
diff --git a/rpython/translator/c/support.py b/rpython/translator/c/support.py
--- a/rpython/translator/c/support.py
+++ b/rpython/translator/c/support.py
@@ -166,7 +166,5 @@
 
 # logging
 
-import py
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("c")
-py.log.setconsumer("c", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+log = AnsiLogger("c")
diff --git a/rpython/translator/driver.py b/rpython/translator/driver.py
--- a/rpython/translator/driver.py
+++ b/rpython/translator/driver.py
@@ -14,9 +14,9 @@
      annotated_jit_entrypoints
 
 import py
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("translation")
-py.log.setconsumer("translation", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+
+log = AnsiLogger("translation")
 
 
 def taskdef(deps, title, new_state=None, expected_states=[],
@@ -524,7 +524,6 @@
     @taskdef([STACKCHECKINSERTION, '?'+BACKENDOPT, RTYPE], "LLInterpreting")
     def task_llinterpret_lltype(self):
         from rpython.rtyper.llinterp import LLInterpreter
-        py.log.setconsumer("llinterp operation", None)
 
         translator = self.translator
         interp = LLInterpreter(translator.rtyper)
@@ -534,7 +533,7 @@
                               self.extra.get('get_llinterp_args',
                                              lambda: [])())
 
-        log.llinterpret.event("result -> %s" % v)
+        log.llinterpret("result -> %s" % v)
 
     def proceed(self, goals):
         if not goals:
diff --git a/rpython/translator/goal/timing.py b/rpython/translator/goal/timing.py
--- a/rpython/translator/goal/timing.py
+++ b/rpython/translator/goal/timing.py
@@ -5,9 +5,8 @@
 
 import time
 import py
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("Timer")
-py.log.setconsumer("Timer", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+log = AnsiLogger("Timer")
 
 class Timer(object):
     def __init__(self, timer=time.time):
diff --git a/rpython/translator/goal/translate.py b/rpython/translator/goal/translate.py
--- a/rpython/translator/goal/translate.py
+++ b/rpython/translator/goal/translate.py
@@ -83,9 +83,8 @@
 ])
 
 import optparse
-from rpython.tool.ansi_print import ansi_log
-log = py.log.Producer("translation")
-py.log.setconsumer("translation", ansi_log)
+from rpython.tool.ansi_print import AnsiLogger
+log = AnsiLogger("translation")
 
 def load_target(targetspec):
     log.info("Translating target as defined by %s" % targetspec)
diff --git a/rpython/translator/platform/__init__.py b/rpython/translator/platform/__init__.py
--- a/rpython/translator/platform/__init__.py
+++ b/rpython/translator/platform/__init__.py
@@ -5,8 +5,9 @@
 from rpython.tool.runsubprocess import run_subprocess as _run_subprocess
 from rpython.tool.udir import udir
 from rpython.tool.version import rpythonroot
+from rpython.tool.ansi_print import AnsiLogger
 
-log = py.log.Producer("platform")
+log = AnsiLogger("platform")
 
 
 class CompilationError(Exception):
diff --git a/rpython/translator/sandbox/rsandbox.py b/rpython/translator/sandbox/rsandbox.py
--- a/rpython/translator/sandbox/rsandbox.py
+++ b/rpython/translator/sandbox/rsandbox.py
@@ -17,10 +17,9 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rtyper.llannotation import lltype_to_annotation
 from rpython.rtyper.annlowlevel import MixLevelHelperAnnotator
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 
-log = py.log.Producer("sandbox")
-py.log.setconsumer("sandbox", ansi_log)
+log = AnsiLogger("sandbox")
 
 
 # a version of os.read() and os.write() that are not mangled
diff --git a/rpython/translator/sandbox/sandlib.py b/rpython/translator/sandbox/sandlib.py
--- a/rpython/translator/sandbox/sandlib.py
+++ b/rpython/translator/sandbox/sandlib.py
@@ -15,21 +15,8 @@
 
 def create_log():
     """Make and return a log for the sandbox to use, if needed."""
-    # These imports are local to avoid importing pypy if we don't need to.
-    from rpython.tool.ansi_print import AnsiLog
-
-    class MyAnsiLog(AnsiLog):
-        KW_TO_COLOR = {
-            'call': ((34,), False),
-            'result': ((34,), False),
-            'exception': ((34,), False),
-            'vpath': ((35,), False),
-            'timeout': ((1, 31), True),
-            }
-
-    log = py.log.Producer("sandlib")
-    py.log.setconsumer("sandlib", MyAnsiLog())
-    return log
+    from rpython.tool.ansi_print import AnsiLogger
+    return AnsiLogger("sandlib")
 
 # Note: we use lib_pypy/marshal.py instead of the built-in marshal
 # for two reasons.  The built-in module could be made to segfault
diff --git a/rpython/translator/translator.py b/rpython/translator/translator.py
--- a/rpython/translator/translator.py
+++ b/rpython/translator/translator.py
@@ -10,13 +10,11 @@
 from rpython.translator import simplify
 from rpython.flowspace.model import FunctionGraph, checkgraph, Block
 from rpython.flowspace.objspace import build_flow
-from rpython.tool.ansi_print import ansi_log
+from rpython.tool.ansi_print import AnsiLogger
 from rpython.tool.sourcetools import nice_repr_for_func
 from rpython.config.translationoption import get_platform
 
-import py
-log = py.log.Producer("flowgraph")
-py.log.setconsumer("flowgraph", ansi_log)
+log = AnsiLogger("flowgraph")
 
 class TranslationContext(object):
     FLOWING_FLAGS = {
@@ -50,14 +48,12 @@
             graph = self._prebuilt_graphs.pop(func)
         else:
             if self.config.translation.verbose:
-                log.start(nice_repr_for_func(func))
+                log(nice_repr_for_func(func))
             graph = build_flow(func)
             simplify.simplify_graph(graph)
             if self.config.translation.list_comprehension_operations:
                 simplify.detect_list_comprehension(graph)
-            if self.config.translation.verbose:
-                log.done(func.__name__)
-            elif not mute_dot:
+            if not self.config.translation.verbose and not mute_dot:
                 log.dot()
             self.graphs.append(graph)   # store the graph in our list
         return graph


More information about the pypy-commit mailing list