diff -r 1bfe46affd2e Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py Wed Jul 09 00:02:39 2014 +0300 +++ b/Lib/idlelib/rpc.py Wed Jul 16 17:17:17 2014 +0300 @@ -29,6 +29,7 @@ import sys import os +import io import socket import select import socketserver @@ -41,6 +42,7 @@ import types import marshal import builtins +from collections import ChainMap def unpickle_code(ms): @@ -61,7 +63,17 @@ # assert isinstance(fn, type.FunctionType) # return repr(fn) -copyreg.pickle(types.CodeType, pickle_code, unpickle_code) +def dumps(obj, protocol=None): + f = io.BytesIO() + p = CodePickler(f, protocol) + p.dump(obj) + return f.getvalue() + +class CodePickler(pickle.Pickler): + dispatch_table = ChainMap({}, copyreg.dispatch_table) + +CodePickler.dispatch_table[types.CodeType] = pickle_code + # copyreg.pickle(types.FunctionType, pickle_function, unpickle_function) BUFSIZE = 8*1024 @@ -329,7 +341,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