summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2014-10-10 23:33:45 (GMT)
committerTerry Jan Reedy <tjreedy@udel.edu>2014-10-10 23:33:45 (GMT)
commitad0c57fed8ede5b7291d0e401f3595975f5eddad (patch)
treeda0b744aaa750ae6bc322c584e9325d2b2084e80
parent9086f9260f1f48a231cba4e7123eb7ac8159ba40 (diff)
downloadcpython-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.py20
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