[Python-checkins] python/dist/src/Lib pickletools.py,1.25,1.26
tim_one@users.sourceforge.net
tim_one@users.sourceforge.net
Wed, 05 Feb 2003 11:55:56 -0800
Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv13931/Lib
Modified Files:
pickletools.py
Log Message:
dis(): Added an optional memo argument, so that multiple pickles in a
file can be dumped without (bogus) complaint if the the pickles were
created using a single pickle memo.
Index: pickletools.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pickletools.py,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** pickletools.py 31 Jan 2003 16:43:39 -0000 1.25
--- pickletools.py 5 Feb 2003 19:55:53 -0000 1.26
***************
*** 1862,1866 ****
# A symbolic pickle disassembler.
! def dis(pickle, out=None, indentlevel=4):
"""Produce a symbolic disassembly of a pickle.
--- 1862,1866 ----
# A symbolic pickle disassembler.
! def dis(pickle, out=None, memo=None, indentlevel=4):
"""Produce a symbolic disassembly of a pickle.
***************
*** 1872,1875 ****
--- 1872,1881 ----
printed. It defaults to sys.stdout.
+ Optional arg 'memo' is a Python dict, used as the pickle's memo. It
+ may be mutated by dis(), if the pickle contains PUT or BINPUT opcodes.
+ Passing the same memo object to another dis() call then allows disassembly
+ to proceed across multiple pickles that were all created by the same
+ pickler with the same memo. Ordinarily you don't need to worry about this.
+
Optional arg indentlevel is the number of blanks by which to indent
a new MARK level. It defaults to 4.
***************
*** 1896,1900 ****
stack = [] # crude emulation of unpickler stack
! memo = {} # crude emulation of unpicker memo
maxproto = -1 # max protocol number seen
markstack = [] # bytecode positions of MARK opcodes
--- 1902,1907 ----
stack = [] # crude emulation of unpickler stack
! if memo is None:
! memo = {} # crude emulation of unpicker memo
maxproto = -1 # max protocol number seen
markstack = [] # bytecode positions of MARK opcodes
***************
*** 2196,2200 ****
--- 2203,2236 ----
"""
+ _memo_test = r"""
+ >>> import pickle
+ >>> from StringIO import StringIO
+ >>> f = StringIO()
+ >>> p = pickle.Pickler(f, 2)
+ >>> x = [1, 2, 3]
+ >>> p.dump(x)
+ >>> p.dump(x)
+ >>> f.seek(0)
+ >>> memo = {}
+ >>> dis(f, memo=memo)
+ 0: \x80 PROTO 2
+ 2: ] EMPTY_LIST
+ 3: q BINPUT 0
+ 5: ( MARK
+ 6: K BININT1 1
+ 8: K BININT1 2
+ 10: K BININT1 3
+ 12: e APPENDS (MARK at 5)
+ 13: . STOP
+ highest protocol among opcodes = 2
+ >>> dis(f, memo=memo)
+ 14: \x80 PROTO 2
+ 16: h BINGET 0
+ 18: . STOP
+ highest protocol among opcodes = 2
+ """
+
__test__ = {'disassembler_test': _dis_test,
+ 'disassembler_memo_test': _memo_test,
}