[Python-checkins] python/dist/src/Lib pickletools.py,1.14,1.15

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Tue, 28 Jan 2003 07:28:01 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv20514/lib

Modified Files:
	pickletools.py 
Log Message:
dis():  Not all opcodes are printable anymore, so print the repr
of the opcode character instead (but stripping the quotes).

Added a proto 2 test section for the canonical recursive-tuple case.
Note that since pickle's save_tuple() takes different paths depending on
tuple length now, beefier tests are really needed (but not in pickletools);
the "short tuple" case tried here was actually broken yesterday, and it's
subtle stuff so needs to be tested.


Index: pickletools.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pickletools.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** pickletools.py	28 Jan 2003 15:09:10 -0000	1.14
--- pickletools.py	28 Jan 2003 15:27:57 -0000	1.15
***************
*** 1875,1881 ****
              print >> out, "%5d:" % pos,
  
!         line = "%s %s%s" % (opcode.code,
!                             indentchunk * len(markstack),
!                             opcode.name)
  
          markmsg = None
--- 1875,1881 ----
              print >> out, "%5d:" % pos,
  
!         line = "%-4s %s%s" % (repr(opcode.code)[1:-1],
!                               indentchunk * len(markstack),
!                               opcode.name)
  
          markmsg = None
***************
*** 1905,1931 ****
  >>> pkl = pickle.dumps(x, 0)
  >>> dis(pkl)
!     0: ( MARK
!     1: l     LIST       (MARK at 0)
!     2: p PUT        0
!     5: I INT        1
!     8: a APPEND
!     9: I INT        2
!    12: a APPEND
!    13: ( MARK
!    14: I     INT        3
!    17: I     INT        4
!    20: t     TUPLE      (MARK at 13)
!    21: p PUT        1
!    24: a APPEND
!    25: ( MARK
!    26: d     DICT       (MARK at 25)
!    27: p PUT        2
!    30: S STRING     'abc'
!    37: p PUT        3
!    40: V UNICODE    u'def'
!    45: p PUT        4
!    48: s SETITEM
!    49: a APPEND
!    50: . STOP
  
  Try again with a "binary" pickle.
--- 1905,1931 ----
  >>> pkl = pickle.dumps(x, 0)
  >>> dis(pkl)
!     0: (    MARK
!     1: l        LIST       (MARK at 0)
!     2: p    PUT        0
!     5: I    INT        1
!     8: a    APPEND
!     9: I    INT        2
!    12: a    APPEND
!    13: (    MARK
!    14: I        INT        3
!    17: I        INT        4
!    20: t        TUPLE      (MARK at 13)
!    21: p    PUT        1
!    24: a    APPEND
!    25: (    MARK
!    26: d        DICT       (MARK at 25)
!    27: p    PUT        2
!    30: S    STRING     'abc'
!    37: p    PUT        3
!    40: V    UNICODE    u'def'
!    45: p    PUT        4
!    48: s    SETITEM
!    49: a    APPEND
!    50: .    STOP
  
  Try again with a "binary" pickle.
***************
*** 1933,1955 ****
  >>> pkl = pickle.dumps(x, 1)
  >>> dis(pkl)
!     0: ] EMPTY_LIST
!     1: q BINPUT     0
!     3: ( MARK
!     4: K     BININT1    1
!     6: K     BININT1    2
!     8: (     MARK
!     9: K         BININT1    3
!    11: K         BININT1    4
!    13: t         TUPLE      (MARK at 8)
!    14: q     BINPUT     1
!    16: }     EMPTY_DICT
!    17: q     BINPUT     2
!    19: U     SHORT_BINSTRING 'abc'
!    24: q     BINPUT     3
!    26: X     BINUNICODE u'def'
!    34: q     BINPUT     4
!    36: s     SETITEM
!    37: e     APPENDS    (MARK at 3)
!    38: . STOP
  
  Exercise the INST/OBJ/BUILD family.
--- 1933,1955 ----
  >>> pkl = pickle.dumps(x, 1)
  >>> dis(pkl)
!     0: ]    EMPTY_LIST
!     1: q    BINPUT     0
!     3: (    MARK
!     4: K        BININT1    1
!     6: K        BININT1    2
!     8: (        MARK
!     9: K            BININT1    3
!    11: K            BININT1    4
!    13: t            TUPLE      (MARK at 8)
!    14: q        BINPUT     1
!    16: }        EMPTY_DICT
!    17: q        BINPUT     2
!    19: U        SHORT_BINSTRING 'abc'
!    24: q        BINPUT     3
!    26: X        BINUNICODE u'def'
!    34: q        BINPUT     4
!    36: s        SETITEM
!    37: e        APPENDS    (MARK at 3)
!    38: .    STOP
  
  Exercise the INST/OBJ/BUILD family.
***************
*** 1957,2005 ****
  >>> import random
  >>> dis(pickle.dumps(random.random, 0))
!     0: c GLOBAL     'random random'
!    15: p PUT        0
!    18: . STOP
  
  >>> x = [pickle.PicklingError()] * 2
  >>> dis(pickle.dumps(x, 0))
!     0: ( MARK
!     1: l     LIST       (MARK at 0)
!     2: p PUT        0
!     5: ( MARK
!     6: i     INST       'pickle PicklingError' (MARK at 5)
!    28: p PUT        1
!    31: ( MARK
!    32: d     DICT       (MARK at 31)
!    33: p PUT        2
!    36: S STRING     'args'
!    44: p PUT        3
!    47: ( MARK
!    48: t     TUPLE      (MARK at 47)
!    49: s SETITEM
!    50: b BUILD
!    51: a APPEND
!    52: g GET        1
!    55: a APPEND
!    56: . STOP
  
  >>> dis(pickle.dumps(x, 1))
!     0: ] EMPTY_LIST
!     1: q BINPUT     0
!     3: ( MARK
!     4: (     MARK
!     5: c         GLOBAL     'pickle PicklingError'
!    27: q         BINPUT     1
!    29: o         OBJ        (MARK at 4)
!    30: q     BINPUT     2
!    32: }     EMPTY_DICT
!    33: q     BINPUT     3
!    35: U     SHORT_BINSTRING 'args'
!    41: q     BINPUT     4
!    43: )     EMPTY_TUPLE
!    44: s     SETITEM
!    45: b     BUILD
!    46: h     BINGET     2
!    48: e     APPENDS    (MARK at 3)
!    49: . STOP
  
  Try "the canonical" recursive-object test.
--- 1957,2005 ----
  >>> import random
  >>> dis(pickle.dumps(random.random, 0))
!     0: c    GLOBAL     'random random'
!    15: p    PUT        0
!    18: .    STOP
  
  >>> x = [pickle.PicklingError()] * 2
  >>> dis(pickle.dumps(x, 0))
!     0: (    MARK
!     1: l        LIST       (MARK at 0)
!     2: p    PUT        0
!     5: (    MARK
!     6: i        INST       'pickle PicklingError' (MARK at 5)
!    28: p    PUT        1
!    31: (    MARK
!    32: d        DICT       (MARK at 31)
!    33: p    PUT        2
!    36: S    STRING     'args'
!    44: p    PUT        3
!    47: (    MARK
!    48: t        TUPLE      (MARK at 47)
!    49: s    SETITEM
!    50: b    BUILD
!    51: a    APPEND
!    52: g    GET        1
!    55: a    APPEND
!    56: .    STOP
  
  >>> dis(pickle.dumps(x, 1))
!     0: ]    EMPTY_LIST
!     1: q    BINPUT     0
!     3: (    MARK
!     4: (        MARK
!     5: c            GLOBAL     'pickle PicklingError'
!    27: q            BINPUT     1
!    29: o            OBJ        (MARK at 4)
!    30: q        BINPUT     2
!    32: }        EMPTY_DICT
!    33: q        BINPUT     3
!    35: U        SHORT_BINSTRING 'args'
!    41: q        BINPUT     4
!    43: )        EMPTY_TUPLE
!    44: s        SETITEM
!    45: b        BUILD
!    46: h        BINGET     2
!    48: e        APPENDS    (MARK at 3)
!    49: .    STOP
  
  Try "the canonical" recursive-object test.
***************
*** 2017,2038 ****
  True
  >>> dis(pickle.dumps(L, 0))
!     0: ( MARK
!     1: l     LIST       (MARK at 0)
!     2: p PUT        0
!     5: ( MARK
!     6: g     GET        0
!     9: t     TUPLE      (MARK at 5)
!    10: p PUT        1
!    13: a APPEND
!    14: . STOP
  >>> dis(pickle.dumps(L, 1))
!     0: ] EMPTY_LIST
!     1: q BINPUT     0
!     3: ( MARK
!     4: h     BINGET     0
!     6: t     TUPLE      (MARK at 3)
!     7: q BINPUT     1
!     9: a APPEND
!    10: . STOP
  
  The protocol 0 pickle of the tuple causes the disassembly to get confused,
--- 2017,2038 ----
  True
  >>> dis(pickle.dumps(L, 0))
!     0: (    MARK
!     1: l        LIST       (MARK at 0)
!     2: p    PUT        0
!     5: (    MARK
!     6: g        GET        0
!     9: t        TUPLE      (MARK at 5)
!    10: p    PUT        1
!    13: a    APPEND
!    14: .    STOP
  >>> dis(pickle.dumps(L, 1))
!     0: ]    EMPTY_LIST
!     1: q    BINPUT     0
!     3: (    MARK
!     4: h        BINGET     0
!     6: t        TUPLE      (MARK at 3)
!     7: q    BINPUT     1
!     9: a    APPEND
!    10: .    STOP
  
  The protocol 0 pickle of the tuple causes the disassembly to get confused,
***************
*** 2044,2072 ****
  
  >>> dis(pickle.dumps(T, 0))
!     0: ( MARK
!     1: (     MARK
!     2: l         LIST       (MARK at 1)
!     3: p     PUT        0
!     6: (     MARK
!     7: g         GET        0
!    10: t         TUPLE      (MARK at 6)
!    11: p     PUT        1
!    14: a     APPEND
!    15: 0     POP
!    16: 0     POP
!    17: g     GET        1
!    20: .     STOP
  >>> dis(pickle.dumps(T, 1))
!     0: ( MARK
!     1: ]     EMPTY_LIST
!     2: q     BINPUT     0
!     4: (     MARK
!     5: h         BINGET     0
!     7: t         TUPLE      (MARK at 4)
!     8: q     BINPUT     1
!    10: a     APPEND
!    11: 1     POP_MARK   (MARK at 0)
!    12: h BINGET     1
!    14: . STOP
  """
  
--- 2044,2096 ----
  
  >>> dis(pickle.dumps(T, 0))
!     0: (    MARK
!     1: (        MARK
!     2: l            LIST       (MARK at 1)
!     3: p        PUT        0
!     6: (        MARK
!     7: g            GET        0
!    10: t            TUPLE      (MARK at 6)
!    11: p        PUT        1
!    14: a        APPEND
!    15: 0        POP
!    16: 0        POP
!    17: g        GET        1
!    20: .        STOP
  >>> dis(pickle.dumps(T, 1))
!     0: (    MARK
!     1: ]        EMPTY_LIST
!     2: q        BINPUT     0
!     4: (        MARK
!     5: h            BINGET     0
!     7: t            TUPLE      (MARK at 4)
!     8: q        BINPUT     1
!    10: a        APPEND
!    11: 1        POP_MARK   (MARK at 0)
!    12: h    BINGET     1
!    14: .    STOP
! 
! Try protocol 2.
! 
! >>> dis(pickle.dumps(L, 2))
!     0: \x80 PROTO      2
!     2: ]    EMPTY_LIST
!     3: q    BINPUT     0
!     5: h    BINGET     0
!     7: \x85 TUPLE1
!     8: q    BINPUT     1
!    10: a    APPEND
!    11: .    STOP
! 
! >>> dis(pickle.dumps(T, 2))
!     0: \x80 PROTO      2
!     2: ]    EMPTY_LIST
!     3: q    BINPUT     0
!     5: h    BINGET     0
!     7: \x85 TUPLE1
!     8: q    BINPUT     1
!    10: a    APPEND
!    11: 0    POP
!    12: h    BINGET     1
!    14: .    STOP
  """