diff options
author | Terry Jan Reedy <tjreedy@udel.edu> | 2014-10-10 23:33:45 (GMT) |
---|---|---|
committer | Terry Jan Reedy <tjreedy@udel.edu> | 2014-10-10 23:33:45 (GMT) |
commit | ad0c57fed8ede5b7291d0e401f3595975f5eddad (patch) | |
tree | da0b744aaa750ae6bc322c584e9325d2b2084e80 | |
parent | 9086f9260f1f48a231cba4e7123eb7ac8159ba40 (diff) | |
download | cpython-ad0c57fed8ede5b7291d0e401f3595975f5eddad.zip cpython-ad0c57fed8ede5b7291d0e401f3595975f5eddad.tar.gz cpython-ad0c57fed8ede5b7291d0e401f3595975f5eddad.tar.bz2 |
Issue #21986: Idle now matches interpreter in not pickling user code objects.
Patch by Claudiu Popa
-rw-r--r-- | Lib/idlelib/rpc.py | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index 9c51b8f..f2aae51 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -29,6 +29,7 @@ accomplished in Idle. import sys import os +import io import socket import select import socketserver @@ -53,16 +54,15 @@ def pickle_code(co): ms = marshal.dumps(co) return unpickle_code, (ms,) -# XXX KBK 24Aug02 function pickling capability not used in Idle -# def unpickle_function(ms): -# return ms +def dumps(obj, protocol=None): + f = io.BytesIO() + p = CodePickler(f, protocol) + p.dump(obj) + return f.getvalue() -# def pickle_function(fn): -# assert isinstance(fn, type.FunctionType) -# return repr(fn) - -copyreg.pickle(types.CodeType, pickle_code, unpickle_code) -# copyreg.pickle(types.FunctionType, pickle_function, unpickle_function) +class CodePickler(pickle.Pickler): + dispatch_table = {types.CodeType: pickle_code} + dispatch_table.update(copyreg.dispatch_table) BUFSIZE = 8*1024 LOCALHOST = '127.0.0.1' @@ -329,7 +329,7 @@ class SocketIO(object): def putmessage(self, message): self.debug("putmessage:%d:" % message[0]) try: - s = pickle.dumps(message) + s = dumps(message) except pickle.PicklingError: print("Cannot pickle:", repr(message), file=sys.__stderr__) raise |