[pypy-svn] r68778 - in pypy/branch/logging/pypy: config doc/config rlib rlib/test

arigo at codespeak.net arigo at codespeak.net
Tue Oct 27 10:45:43 CET 2009


Author: arigo
Date: Tue Oct 27 10:45:43 2009
New Revision: 68778

Added:
   pypy/branch/logging/pypy/doc/config/translation.rlog.txt   (contents, props changed)
Modified:
   pypy/branch/logging/pypy/config/translationoption.py
   pypy/branch/logging/pypy/rlib/rlog.py
   pypy/branch/logging/pypy/rlib/test/test_rlog.py
Log:
Add a general translation option, --rlog or --no-rlog, to enable
or disable rlog in translated programs.


Modified: pypy/branch/logging/pypy/config/translationoption.py
==============================================================================
--- pypy/branch/logging/pypy/config/translationoption.py	(original)
+++ pypy/branch/logging/pypy/config/translationoption.py	Tue Oct 27 10:45:43 2009
@@ -41,6 +41,11 @@
                      },
                  cmdline="-b --backend"),
 
+    BoolOption("rlog",
+               "Includes logging code (at runtime, set PYPYLOG=file)",
+               default=True,
+               cmdline="--rlog"),
+
     # gc
     ChoiceOption("gc", "Garbage Collection Strategy",
                  ["boehm", "ref", "marksweep", "semispace", "statistics",

Added: pypy/branch/logging/pypy/doc/config/translation.rlog.txt
==============================================================================
--- (empty file)
+++ pypy/branch/logging/pypy/doc/config/translation.rlog.txt	Tue Oct 27 10:45:43 2009
@@ -0,0 +1,3 @@
+Enable general logging.  When true, the translated program will look
+for the PYPYLOG env var, and if set to a file name, it will dump
+various information into that file.

Modified: pypy/branch/logging/pypy/rlib/rlog.py
==============================================================================
--- pypy/branch/logging/pypy/rlib/rlog.py	(original)
+++ pypy/branch/logging/pypy/rlib/rlog.py	Tue Oct 27 10:45:43 2009
@@ -26,18 +26,26 @@
     _about_ = has_log
 
     def compute_result_annotation(self):
-        from pypy.annotation import model as annmodel
-        return annmodel.s_Bool
+        translator = self.bookkeeper.annotator.translator
+        if translator.config.translation.rlog:
+            from pypy.annotation import model as annmodel
+            return annmodel.s_Bool
+        else:
+            return self.bookkeeper.immutablevalue(False)
 
     def specialize_call(self, hop):
-        from pypy.annotation import model as annmodel
         from pypy.rpython.lltypesystem import lltype
-        logwriter = get_logwriter(hop.rtyper)
-        annhelper = hop.rtyper.getannmixlevel()
-        c_func = annhelper.constfunc(logwriter.has_log, [],
-                                     annmodel.s_Bool)
-        hop.exception_cannot_occur()
-        return hop.genop('direct_call', [c_func], resulttype=lltype.Bool)
+        translator = hop.rtyper.annotator.translator
+        if translator.config.translation.rlog:
+            from pypy.annotation import model as annmodel
+            logwriter = get_logwriter(hop.rtyper)
+            annhelper = hop.rtyper.getannmixlevel()
+            c_func = annhelper.constfunc(logwriter.has_log, [],
+                                         annmodel.s_Bool)
+            hop.exception_cannot_occur()
+            return hop.genop('direct_call', [c_func], resulttype=lltype.Bool)
+        else:
+            return hop.inputconst(lltype.Bool, False)
 
 
 class DebugLogEntry(ExtRegistryEntry):
@@ -45,56 +53,60 @@
 
     def compute_result_annotation(self, s_category, s_message, **kwds_s):
         from pypy.annotation import model as annmodel
-        assert s_category.is_constant()
-        assert s_message.is_constant()
         translator = self.bookkeeper.annotator.translator
-        try:
-            logcategories = translator._logcategories
-        except AttributeError:
-            logcategories = translator._logcategories = {}
-        try:
-            cat = logcategories[s_category.const]
-        except KeyError:
-            num = len(logcategories) + 1
-            logcategories[s_category.const] = LogCategory(s_category.const,
-                                                          s_message.const,
-                                                          num)
-        else:
-            assert cat.message == s_message.const, (
-                "log category %r is used with different messages:\n\t%s\n\t%s"
-                % (s_category.const, cat.message, s_message.const))
+        if translator.config.translation.rlog:
+            assert s_category.is_constant()
+            assert s_message.is_constant()
+            translator = self.bookkeeper.annotator.translator
+            try:
+                logcategories = translator._logcategories
+            except AttributeError:
+                logcategories = translator._logcategories = {}
+            try:
+                cat = logcategories[s_category.const]
+            except KeyError:
+                num = len(logcategories) + 1
+                logcategories[s_category.const] = LogCategory(s_category.const,
+                                                              s_message.const,
+                                                              num)
+            else:
+                assert cat.message == s_message.const, (
+                    "log category %r is used with different messages:\n\t%s\n"
+                    "\t%s" % (s_category.const, cat.message, s_message.const))
         return annmodel.s_None
 
     def specialize_call(self, hop, **kwds_i):
-        from pypy.annotation import model as annmodel
         from pypy.rpython.lltypesystem import lltype
-        logwriter = get_logwriter(hop.rtyper)
         translator = hop.rtyper.annotator.translator
-        cat = translator._logcategories[hop.args_s[0].const]
-        ann = {
-            'd': annmodel.SomeInteger(),
-            'f': annmodel.SomeFloat(),
-            's': annmodel.SomeString(can_be_None=True),
-            }
-        annhelper = hop.rtyper.getannmixlevel()
-        args_s = [ann[t] for t in cat.types]
-        c_func = annhelper.constfunc(cat.gen_call(logwriter), args_s,
-                                     annmodel.s_None)
-        args_v = [c_func]
-        for name, typechar in cat.entries:
-            arg = kwds_i['i_'+name]
-            if typechar == 'd':
-                v = hop.inputarg(lltype.Signed, arg=arg)
-            elif typechar == 'f':
-                v = hop.inputarg(lltype.Float, arg=arg)
-            elif typechar == 's':
-                v = hop.inputarg(hop.rtyper.type_system.rstr.string_repr,
-                                 arg=arg)
-            else:
-                assert 0, typechar
-            args_v.append(v)
-        hop.exception_cannot_occur()
-        hop.genop('direct_call', args_v)
+        if translator.config.translation.rlog:
+            from pypy.annotation import model as annmodel
+            logwriter = get_logwriter(hop.rtyper)
+            translator = hop.rtyper.annotator.translator
+            cat = translator._logcategories[hop.args_s[0].const]
+            ann = {
+                'd': annmodel.SomeInteger(),
+                'f': annmodel.SomeFloat(),
+                's': annmodel.SomeString(can_be_None=True),
+                }
+            annhelper = hop.rtyper.getannmixlevel()
+            args_s = [ann[t] for t in cat.types]
+            c_func = annhelper.constfunc(cat.gen_call(logwriter), args_s,
+                                         annmodel.s_None)
+            args_v = [c_func]
+            for name, typechar in cat.entries:
+                arg = kwds_i['i_'+name]
+                if typechar == 'd':
+                    v = hop.inputarg(lltype.Signed, arg=arg)
+                elif typechar == 'f':
+                    v = hop.inputarg(lltype.Float, arg=arg)
+                elif typechar == 's':
+                    v = hop.inputarg(hop.rtyper.type_system.rstr.string_repr,
+                                     arg=arg)
+                else:
+                    assert 0, typechar
+                args_v.append(v)
+            hop.exception_cannot_occur()
+            hop.genop('direct_call', args_v)
         return hop.inputconst(lltype.Void, None)
 
 def get_logwriter(rtyper):

Modified: pypy/branch/logging/pypy/rlib/test/test_rlog.py
==============================================================================
--- pypy/branch/logging/pypy/rlib/test/test_rlog.py	(original)
+++ pypy/branch/logging/pypy/rlib/test/test_rlog.py	Tue Oct 27 10:45:43 2009
@@ -250,6 +250,19 @@
         assert entries[1][2] == [133, 132.5]
         assert entries[2][2] == ['hi there']
 
-    def test_interpret(self):
+    def test_interpret_f(self):
         interpret(self.f.im_func, [132], malloc_check=False)
         self.check_result()
+
+    def test_interpret_g(self):
+        def never_called():
+            xyz
+        def g():
+            rlog.debug_log("Aa", "hello %(foo)d", foo=5)
+            if rlog.has_log():
+                never_called()
+        from pypy.config import translationoption
+        config = translationoption.get_combined_translation_config(
+            overrides={"translation.rlog": False})
+        interpret(g, [], config=config)
+        assert not os.path.exists(self.pypylog)



More information about the Pypy-commit mailing list