changeset: 92943:90c62e1f3658 branch: 3.4 parent: 92940:0c8f45caf697 user: Terry Jan Reedy date: Fri Oct 10 19:33:45 2014 -0400 files: Lib/idlelib/rpc.py description: Issue #21986: Idle now matches interpreter in not pickling user code objects. Patch by Claudiu Popa diff -r 0c8f45caf697 -r 90c62e1f3658 Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py Fri Oct 10 23:49:32 2014 +0200 +++ b/Lib/idlelib/rpc.py Fri Oct 10 19:33:45 2014 -0400 @@ -29,6 +29,7 @@ import sys import os +import io import socket import select import socketserver @@ -53,16 +54,15 @@ 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 @@ 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