Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r60920:1370dfe72906
Date: 2013-02-06 15:31 -0800
http://bitbucket.org/pypy/pypy/changeset/1370dfe72906/
Log: forbid pickling of _io objects
diff --git a/pypy/module/_io/interp_bufferedio.py
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -796,6 +796,7 @@
'BufferedReader', W_BufferedIOBase.typedef,
__new__ = generic_new_descr(W_BufferedReader),
__init__ = interp2app(W_BufferedReader.descr_init),
+ __getstate__ = interp2app(W_BufferedReader.getstate_w),
__module__ = "_io",
read = interp2app(W_BufferedReader.read_w),
@@ -843,6 +844,7 @@
'BufferedWriter', W_BufferedIOBase.typedef,
__new__ = generic_new_descr(W_BufferedWriter),
__init__ = interp2app(W_BufferedWriter.descr_init),
+ __getstate__ = interp2app(W_BufferedWriter.getstate_w),
__module__ = "_io",
write = interp2app(W_BufferedWriter.write_w),
@@ -939,6 +941,7 @@
'_io.BufferedRWPair', W_BufferedIOBase.typedef,
__new__ = generic_new_descr(W_BufferedRWPair),
__init__ = interp2app(W_BufferedRWPair.descr_init),
+ __getstate__ = interp2app(W_BufferedRWPair.getstate_w),
closed = GetSetProperty(W_BufferedRWPair.closed_get_w),
**methods
)
@@ -969,6 +972,7 @@
'BufferedRandom', W_BufferedIOBase.typedef,
__new__ = generic_new_descr(W_BufferedRandom),
__init__ = interp2app(W_BufferedRandom.descr_init),
+ __getstate__ = interp2app(W_BufferedRandom.getstate_w),
__module__ = "_io",
read = interp2app(W_BufferedRandom.read_w),
diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -438,6 +438,7 @@
__new__ = interp2app(W_FileIO.descr_new.im_func),
__init__ = interp2app(W_FileIO.descr_init),
__repr__ = interp2app(W_FileIO.repr_w),
+ __getstate__ = interp2app(W_FileIO.getstate_w),
seek = interp2app(W_FileIO.seek_w),
tell = interp2app(W_FileIO.tell_w),
diff --git a/pypy/module/_io/interp_iobase.py b/pypy/module/_io/interp_iobase.py
--- a/pypy/module/_io/interp_iobase.py
+++ b/pypy/module/_io/interp_iobase.py
@@ -164,6 +164,11 @@
def seekable_w(self, space):
return space.w_False
+ def getstate_w(self, space):
+ raise operationerrfmt(space.w_TypeError,
+ "cannot serialize '%s' object",
+ space.type(self).getname(space))
+
# ______________________________________________________________
def readline_w(self, space, w_limit=None):
diff --git a/pypy/module/_io/interp_textio.py b/pypy/module/_io/interp_textio.py
--- a/pypy/module/_io/interp_textio.py
+++ b/pypy/module/_io/interp_textio.py
@@ -989,9 +989,10 @@
__new__ = generic_new_descr(W_TextIOWrapper),
__init__ = interp2app(W_TextIOWrapper.descr_init),
__repr__ = interp2app(W_TextIOWrapper.descr_repr),
+ __next__ = interp2app(W_TextIOWrapper.next_w),
+ __getstate__ = interp2app(W_TextIOWrapper.getstate_w),
__module__ = "_io",
- __next__ = interp2app(W_TextIOWrapper.next_w),
read = interp2app(W_TextIOWrapper.read_w),
readline = interp2app(W_TextIOWrapper.readline_w),
write = interp2app(W_TextIOWrapper.write_w),
diff --git a/pypy/module/_io/test/test_io.py b/pypy/module/_io/test/test_io.py
--- a/pypy/module/_io/test/test_io.py
+++ b/pypy/module/_io/test/test_io.py
@@ -351,3 +351,22 @@
self._check_warn_on_dealloc(self.tmpfile, 'wb', buffering=0)
self._check_warn_on_dealloc(self.tmpfile, 'wb')
self._check_warn_on_dealloc(self.tmpfile, 'w')
+
+ def test_pickling(self):
+ import _io
+ import pickle
+ # Pickling file objects is forbidden
+ for kwargs in [
+ {"mode": "w"},
+ {"mode": "wb"},
+ {"mode": "wb", "buffering": 0},
+ {"mode": "r"},
+ {"mode": "rb"},
+ {"mode": "rb", "buffering": 0},
+ {"mode": "w+"},
+ {"mode": "w+b"},
+ {"mode": "w+b", "buffering": 0},
+ ]:
+ for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
+ with _io.open(self.tmpfile, **kwargs) as f:
+ raises(TypeError, pickle.dumps, f, protocol)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit