- Issue #13532: Check that arguments to sys.stdout.write are strings.

This commit is contained in:
Martin v. Löwis 2012-07-09 21:01:49 +02:00
parent 45ed012433
commit e8e4e1456c
3 changed files with 25 additions and 3 deletions

View file

@ -1,6 +1,8 @@
What's New in IDLE 2.7.4? What's New in IDLE 2.7.4?
========================= =========================
- Issue #13532: Check that arguments to sys.stdout.write are strings.
- Issue # 12510: Attempt to get certain tool tips no longer crashes IDLE. - Issue # 12510: Attempt to get certain tool tips no longer crashes IDLE.
- Issue10365: File open dialog now works instead of crashing even when - Issue10365: File open dialog now works instead of crashing even when

View file

@ -1265,6 +1265,8 @@ class PseudoFile(object):
self.encoding = encoding self.encoding = encoding
def write(self, s): def write(self, s):
if not isinstance(s, str):
raise TypeError('must be str, not ' + type(s).__name__)
self.shell.write(s, self.tags) self.shell.write(s, self.tags)
def writelines(self, lines): def writelines(self, lines):

View file

@ -1,4 +1,5 @@
import sys import sys
import io
import linecache import linecache
import time import time
import socket import socket
@ -248,6 +249,23 @@ class MyRPCServer(rpc.RPCServer):
quitting = True quitting = True
thread.interrupt_main() thread.interrupt_main()
class _RPCFile(io.TextIOBase):
"""Wrapper class for the RPC proxy to typecheck arguments
that may not support pickling."""
def __init__(self, rpc):
super.__setattr__(self, 'rpc', rpc)
def __getattr__(self, name):
return getattr(self.rpc, name)
def __setattr__(self, name, value):
return setattr(self.rpc, name, value)
def write(self, s):
if not isinstance(s, str):
raise TypeError('must be str, not ' + type(s).__name__)
return self.rpc.write(s)
class MyHandler(rpc.RPCHandler): class MyHandler(rpc.RPCHandler):
@ -255,9 +273,9 @@ class MyHandler(rpc.RPCHandler):
"""Override base method""" """Override base method"""
executive = Executive(self) executive = Executive(self)
self.register("exec", executive) self.register("exec", executive)
sys.stdin = self.console = self.get_remote_proxy("stdin") sys.stdin = self.console = _RPCFile(self.get_remote_proxy("stdin"))
sys.stdout = self.get_remote_proxy("stdout") sys.stdout = _RPCFile(self.get_remote_proxy("stdout"))
sys.stderr = self.get_remote_proxy("stderr") sys.stderr = _RPCFile(self.get_remote_proxy("stderr"))
from idlelib import IOBinding from idlelib import IOBinding
sys.stdin.encoding = sys.stdout.encoding = \ sys.stdin.encoding = sys.stdout.encoding = \
sys.stderr.encoding = IOBinding.encoding sys.stderr.encoding = IOBinding.encoding