[Jython-checkins] jython: Fix inconsistent conversion of PyObject to String in StdoutWrapper

jim.baker jython-checkins at python.org
Sun Apr 19 22:46:26 CEST 2015


https://hg.python.org/jython/rev/fbcbd5f9462b
changeset:   7680:fbcbd5f9462b
user:        Jim Baker <jim.baker at rackspace.com>
date:        Sun Apr 19 14:46:22 2015 -0600
summary:
  Fix inconsistent conversion of PyObject to String in StdoutWrapper

Thanks Richard Fearn for the patch to StdoutWrapper!

Fixes http://bugs.jython.org/issue2105

files:
  ACKNOWLEDGMENTS                        |   1 +
  Lib/test/test_pythoninterpreter_jy.py  |  27 ++++++++++++-
  src/org/python/core/StdoutWrapper.java |   2 +-
  3 files changed, 27 insertions(+), 3 deletions(-)


diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS
--- a/ACKNOWLEDGMENTS
+++ b/ACKNOWLEDGMENTS
@@ -154,6 +154,7 @@
     Stefan Richthofer
     Jason Madden
     Daniel Martin
+    Richard Fearn
 
 Local Variables:
 mode: indented-text
diff --git a/Lib/test/test_pythoninterpreter_jy.py b/Lib/test/test_pythoninterpreter_jy.py
--- a/Lib/test/test_pythoninterpreter_jy.py
+++ b/Lib/test/test_pythoninterpreter_jy.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 import java.io
+import os
 import sys
 import traceback
 import types
@@ -10,6 +11,7 @@
 from _codecs import encode
 from sun.awt.image import BufImgVolatileSurfaceManager
 
+
 def exec_code_in_pi(source, inp=None, out=None, err=None, locals=None):
     """Runs code in a separate context: (thread, PySystemState, PythonInterpreter)"""
 
@@ -101,13 +103,14 @@
         self.assertEquals(42, len(output))
 
 
- at unittest.skip("FIXME: Disabled for now (failing in dictionary compare)")
 class UnicodeSourceTest(unittest.TestCase):
 
     # When the core PythonInterpreter is embedded in a Java program
     # it may be supplied as Unicode source as a string or via streams.
 
-    def do_test(self, source, ref_out=u'', ref_var={}, inp=None):
+    def do_test(self, source, ref_out=u'', ref_var=None, inp=None):
+        if ref_var is None:
+            ref_var = {}
         out = java.io.StringWriter()
         err = java.io.StringWriter()
         var = {}
@@ -118,6 +121,7 @@
                 inp = java.io.StringReader(inp)
 
         exec_code_in_pi(source, inp, out, err, var)
+        del var['__builtins__']
         self.assertEquals(ref_var, var)
         self.assertEquals(ref_out, out.toString())
 
@@ -307,11 +311,30 @@
     # There is no readinto() with pi.setIn(Reader)
 
 
+class StdoutWrapperTest(unittest.TestCase):
+
+    def test_choose_str(self):
+
+        def f():
+            class Example:
+                def __str__(self):
+                    return "str"
+                def __repr__(self):
+                    return "repr"
+            print Example()
+
+        out = java.io.StringWriter()
+        err = java.io.StringWriter()
+        exec_code_in_pi(f, None, out, err)
+        self.assertEqual(out.toString(), "str" + os.linesep)
+
+
 def test_main():
     test.test_support.run_unittest(
             InterpreterTest,
             UnicodeSourceTest,
             InterpreterSetInTest,
+            StdoutWrapperTest
     )
 
 if __name__ == "__main__":
diff --git a/src/org/python/core/StdoutWrapper.java b/src/org/python/core/StdoutWrapper.java
--- a/src/org/python/core/StdoutWrapper.java
+++ b/src/org/python/core/StdoutWrapper.java
@@ -120,7 +120,7 @@
         if (o instanceof PyString) {
             s = ((PyString) o).getString();
         } else {
-            s = o.toString();
+            s = o.__str__().toString();
         }
         file.write(s);
         return s;

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list