diff -r 0eeb39fc8ff5 Lib/codecs.py --- a/Lib/codecs.py Tue Dec 01 19:59:53 2015 +1100 +++ b/Lib/codecs.py Wed Dec 02 22:24:02 2015 +0200 @@ -413,6 +413,9 @@ class StreamWriter(Codec): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReader(Codec): @@ -660,6 +663,9 @@ class StreamReader(Codec): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReaderWriter: @@ -747,6 +753,9 @@ class StreamReaderWriter: def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamRecoder: diff -r 0eeb39fc8ff5 Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py Tue Dec 01 19:59:53 2015 +1100 +++ b/Lib/test/test_codecs.py Wed Dec 02 22:24:02 2015 +0200 @@ -1,7 +1,9 @@ import codecs import contextlib +import copy import io import locale +import pickle import sys import unittest import warnings @@ -1832,6 +1834,67 @@ class StreamReaderTest(unittest.TestCase f = self.reader(self.stream) self.assertEqual(f.readlines(), ['\ud55c\n', '\uae00']) + def test_copy(self): + f = self.reader(Queue(b'\xed\x95\x9c\n\xea\xb8\x80')) + with self.assertRaises(TypeError): + copy.copy(f) + + def test_deepcopy(self): + f = self.reader(Queue(b'\xed\x95\x9c\n\xea\xb8\x80')) + with self.assertRaises(TypeError): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + f = self.reader(Queue(b'\xed\x95\x9c\n\xea\xb8\x80')) + with self.assertRaises(TypeError): + pickle.dumps(f, proto) + + +class StreamWriterTest(unittest.TestCase): + + def setUp(self): + self.writer = codecs.getwriter('utf-8') + + def test_copy(self): + f = self.writer(Queue(b'')) + with self.assertRaises(TypeError): + copy.copy(f) + + def test_deepcopy(self): + f = self.writer(Queue(b'')) + with self.assertRaises(TypeError): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + f = self.writer(Queue(b'')) + with self.assertRaises(TypeError): + pickle.dumps(f, proto) + + +class StreamReaderWriterTest(unittest.TestCase): + + def setUp(self): + self.reader = codecs.getreader('latin1') + self.writer = codecs.getwriter('utf-8') + + def test_copy(self): + f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) + with self.assertRaises(TypeError): + copy.copy(f) + + def test_deepcopy(self): + f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) + with self.assertRaises(TypeError): + copy.deepcopy(f) + + def test_pickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + f = codecs.StreamReaderWriter(Queue(b''), self.reader, self.writer) + with self.assertRaises(TypeError): + pickle.dumps(f, proto) + class EncodedFileTest(unittest.TestCase):