changeset: 92944:cb94764bf8be parent: 92941:af0104aed5b1 parent: 92943:90c62e1f3658 user: Terry Jan Reedy date: Fri Oct 10 19:34:38 2014 -0400 description: Merge with 3.4: #21986, don't pickle user code objects. diff -r af0104aed5b1 -r cb94764bf8be Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py Fri Oct 10 23:51:04 2014 +0200 +++ b/Lib/idlelib/rpc.py Fri Oct 10 19:34:38 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