14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Create portable serialized representations of Python objects.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSee module cPickle for a (much) faster implementation.
44adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSee module copy_reg for a mechanism for registering custom picklers.
54adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSee module pickletools source for extensive comments.
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoClasses:
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pickler
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Unpickler
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFunctions:
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dump(object, file)
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dumps(object) -> string
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    load(file) -> object
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    loads(string) -> object
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoMisc variables:
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __version__
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    format_version
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    compatible_formats
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__version__ = "$Revision: 72223 $"       # Code version
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom types import *
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom copy_reg import dispatch_table
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom copy_reg import _extension_registry, _inverted_registry, _extension_cache
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport marshal
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport struct
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport re
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "Unpickler", "dump", "dumps", "load", "loads"]
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These are purely informational; no code uses these.
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoformat_version = "2.0"                  # File format version we write
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocompatible_formats = ["1.0",            # Original protocol 0
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "1.1",            # Protocol 0 with INST added
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "1.2",            # Original protocol 1
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "1.3",            # Protocol 1 with BINFLOAT added
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "2.0",            # Protocol 2
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      ]                 # Old format versions we can read
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Keep in synch with cPickle.  This is the highest protocol number we
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# know how to read.
514adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHIGHEST_PROTOCOL = 2
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Why use struct.pack() for pickling but marshal.loads() for
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# unpickling?  struct.pack() is 40% faster than marshal.dumps(), but
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# marshal.loads() is twice as fast as struct.unpack()!
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomloads = marshal.loads
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass PickleError(Exception):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """A common base class for the other pickling exceptions."""
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass PicklingError(PickleError):
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """This exception is raised when an unpicklable object is passed to the
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dump() method.
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UnpicklingError(PickleError):
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """This exception is raised when there is a problem unpickling an object,
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    such as a security violation.
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note that other exceptions may also be raised during unpickling, including
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (but not necessarily limited to) AttributeError, EOFError, ImportError,
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    and IndexError.
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# An instance of _Stop is raised by Unpickler.load_stop() in response to
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# the STOP opcode, passing the object that is the result of unpickling.
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _Stop(Exception):
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, value):
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.value = value
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Jython has PyStringMap; it's a dict subclass with string keys
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from org.python.core import PyStringMap
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    PyStringMap = None
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# UnicodeType may or may not be exported (normally imported from types)
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    UnicodeType
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError:
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    UnicodeType = None
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Pickle opcodes.  See pickletools.py for extensive docs.  The listing
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# here is in kind-of alphabetical order of 1-character pickle code.
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# pickletools groups them by purpose.
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoMARK            = '('   # push special markobject on stack
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSTOP            = '.'   # every pickle ends with STOP
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPOP             = '0'   # discard topmost stack item
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPOP_MARK        = '1'   # discard stack top through topmost markobject
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDUP             = '2'   # duplicate top stack item
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFLOAT           = 'F'   # push float object; decimal string argument
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoINT             = 'I'   # push integer or bool; decimal string argument
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBININT          = 'J'   # push four-byte signed int
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBININT1         = 'K'   # push 1-byte unsigned int
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLONG            = 'L'   # push long; decimal string argument
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBININT2         = 'M'   # push 2-byte unsigned int
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNONE            = 'N'   # push None
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPERSID          = 'P'   # push persistent object; id is taken from string arg
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINPERSID       = 'Q'   #  "       "         "  ;  "  "   "     "  stack
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoREDUCE          = 'R'   # apply callable to argtuple, both on stack
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSTRING          = 'S'   # push string; NL-terminated string argument
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINSTRING       = 'T'   # push string; counted binary string argument
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSHORT_BINSTRING = 'U'   #  "     "   ;    "      "       "      " < 256 bytes
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoUNICODE         = 'V'   # push Unicode string; raw-unicode-escaped'd argument
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINUNICODE      = 'X'   #   "     "       "  ; counted UTF-8 string argument
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoAPPEND          = 'a'   # append stack top to list below it
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBUILD           = 'b'   # call __setstate__ or __dict__.update()
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoGLOBAL          = 'c'   # push self.find_class(modname, name); 2 string args
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDICT            = 'd'   # build a dict from stack items
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEMPTY_DICT      = '}'   # push empty dict
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoAPPENDS         = 'e'   # extend list on stack by topmost stack slice
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoGET             = 'g'   # push item from memo on stack; index is string arg
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINGET          = 'h'   #   "    "    "    "   "   "  ;   "    " 1-byte arg
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoINST            = 'i'   # build & push class instance
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLONG_BINGET     = 'j'   # push item from memo on stack; index is 4-byte arg
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLIST            = 'l'   # build list from topmost stack items
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEMPTY_LIST      = ']'   # push empty list
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoOBJ             = 'o'   # build & push class instance
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPUT             = 'p'   # store stack top in memo; index is string arg
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINPUT          = 'q'   #   "     "    "   "   " ;   "    " 1-byte arg
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLONG_BINPUT     = 'r'   #   "     "    "   "   " ;   "    " 4-byte arg
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSETITEM         = 's'   # add key+value pair to dict
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTUPLE           = 't'   # build tuple from topmost stack items
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEMPTY_TUPLE     = ')'   # push empty tuple
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSETITEMS        = 'u'   # modify dict by adding topmost key+value pairs
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBINFLOAT        = 'G'   # push float; arg is 8-byte float encoding
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTRUE            = 'I01\n'  # not an opcode; see INT docs in pickletools.py
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFALSE           = 'I00\n'  # not an opcode; see INT docs in pickletools.py
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Protocol 2
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPROTO           = '\x80'  # identify pickle protocol
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNEWOBJ          = '\x81'  # build object by applying cls.__new__ to argtuple
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEXT1            = '\x82'  # push object from extension registry; 1-byte index
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEXT2            = '\x83'  # ditto, but 2-byte index
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEXT4            = '\x84'  # ditto, but 4-byte index
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTUPLE1          = '\x85'  # build 1-tuple from stack top
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTUPLE2          = '\x86'  # build 2-tuple from two topmost stack items
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTUPLE3          = '\x87'  # build 3-tuple from three topmost stack items
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNEWTRUE         = '\x88'  # push True
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNEWFALSE        = '\x89'  # push False
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLONG1           = '\x8a'  # push long from < 256 bytes
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoLONG4           = '\x8b'  # push really big long
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodel x
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Pickling machinery
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Pickler:
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, file, protocol=None):
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This takes a file-like object for writing a pickle data stream.
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The optional protocol argument tells the pickler to use the
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        given protocol; supported protocols are 0, 1, 2.  The default
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        protocol is 0, to be backwards compatible.  (Protocol 0 is the
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        only protocol that can be written to a file opened in text
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mode and read back successfully.  When using a protocol higher
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        than 0, make sure the file is opened in binary mode, both when
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickling and unpickling.)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Protocol 1 is more efficient than protocol 0; protocol 2 is
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        more efficient than protocol 1.
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Specifying a negative protocol version selects the highest
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        protocol version supported.  The higher the protocol used, the
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        more recent the version of Python needed to read the pickle
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        produced.
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The file parameter must have a write() method that accepts a single
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        string argument.  It can thus be an open file object, a StringIO
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        object, or any other custom object that meets this interface.
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if protocol is None:
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            protocol = 0
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if protocol < 0:
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            protocol = HIGHEST_PROTOCOL
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif not 0 <= protocol <= HIGHEST_PROTOCOL:
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write = file.write
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo = {}
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.proto = int(protocol)
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.bin = protocol >= 1
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.fast = 0
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def clear_memo(self):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Clears the pickler's "memo".
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The memo is the data structure that remembers which objects the
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickler has already seen, so that shared or recursive objects are
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled by reference and not by value.  This method is useful when
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        re-using picklers.
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo.clear()
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def dump(self, obj):
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Write a pickled representation of obj to the open file."""
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.proto >= 2:
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(PROTO + chr(self.proto))
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.save(obj)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(STOP)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def memoize(self, obj):
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Store an object in the memo."""
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The Pickler memo is a dictionary mapping object ids to 2-tuples
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # that contain the Unpickler memo key and the object being memoized.
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The memo key is written to the pickle and will become
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the key in the Unpickler's memo.  The object is stored in the
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Pickler memo so that transient objects are kept alive during
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pickling.
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The use of the Unpickler memo length as the memo key is just a
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # convention.  The only requirement is that the memo values be unique.
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # But there appears no advantage to any other scheme, and this
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # scheme allows the Unpickler memo to be implemented as a plain (but
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # growable) array, indexed by memo key.
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.fast:
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assert id(obj) not in self.memo
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo_len = len(self.memo)
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(self.put(memo_len))
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo[id(obj)] = memo_len, obj
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def put(self, i, pack=struct.pack):
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if i < 256:
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return BINPUT + chr(i)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return LONG_BINPUT + pack("<i", i)
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return PUT + repr(i) + '\n'
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get(self, i, pack=struct.pack):
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if i < 256:
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return BINGET + chr(i)
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return LONG_BINGET + pack("<i", i)
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return GET + repr(i) + '\n'
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save(self, obj):
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check for persistent id (defined by a subclass)
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pid = self.persistent_id(obj)
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if pid:
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.save_pers(pid)
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check the memo
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = self.memo.get(id(obj))
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if x:
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(self.get(x[0]))
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check the type dispatch table
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = type(obj)
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f = self.dispatch.get(t)
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if f:
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f(self, obj) # Call unbound method with explicit self
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check copy_reg.dispatch_table
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        reduce = dispatch_table.get(t)
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if reduce:
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rv = reduce(obj)
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Check for a class with a custom metaclass; treat as regular class
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                issc = issubclass(t, TypeType)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except TypeError: # t is not a class (old Boost; see SF #502085)
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                issc = 0
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if issc:
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.save_global(obj)
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Check for a __reduce_ex__ method, fall back to __reduce__
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            reduce = getattr(obj, "__reduce_ex__", None)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if reduce:
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rv = reduce(self.proto)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                reduce = getattr(obj, "__reduce__", None)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if reduce:
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    rv = reduce()
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise PicklingError("Can't pickle %r object: %r" %
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        (t.__name__, obj))
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check for string returned by reduce(), meaning "save as global"
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if type(rv) is StringType:
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.save_global(obj, rv)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Assert that reduce() returned a tuple
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if type(rv) is not TupleType:
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise PicklingError("%s must return string or tuple" % reduce)
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Assert that it returned an appropriately sized tuple
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        l = len(rv)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not (2 <= l <= 5):
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise PicklingError("Tuple returned by %s must have "
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                "two to five elements" % reduce)
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Save the reduce() output and finally memoize the object
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.save_reduce(obj=obj, *rv)
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def persistent_id(self, obj):
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This exists so a subclass can override it
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_pers(self, pid):
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Save a persistent id reference
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.save(pid)
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(BINPERSID)
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(PERSID + str(pid) + '\n')
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_reduce(self, func, args, state=None,
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    listitems=None, dictitems=None, obj=None):
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This API is called by some subclasses
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Assert that args is a tuple or None
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(args, TupleType):
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise PicklingError("args from reduce() should be a tuple")
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Assert that func is callable
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not hasattr(func, '__call__'):
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise PicklingError("func from reduce should be callable")
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save = self.save
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Protocol 2 special case: if func's name is __newobj__, use NEWOBJ
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.proto >= 2 and getattr(func, "__name__", "") == "__newobj__":
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # A __reduce__ implementation can direct protocol 2 to
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # use the more efficient NEWOBJ opcode, while still
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # allowing protocol 0 and 1 to work normally.  For this to
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # work, the function returned by __reduce__ should be
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # called __newobj__, and its first argument should be a
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # new-style class.  The implementation for __newobj__
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # should be as follows, although pickle has no way to
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # verify this:
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            #
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # def __newobj__(cls, *args):
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            #     return cls.__new__(cls, *args)
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            #
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Protocols 0 and 1 will pickle a reference to __newobj__,
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # while protocol 2 (and above) will pickle a reference to
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # cls, the remaining args tuple, and the NEWOBJ code,
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # which calls cls.__new__(cls, *args) at unpickling time
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # (see load_newobj below).  If __reduce__ returns a
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # three-tuple, the state from the third tuple item will be
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # pickled regardless of the protocol, calling __setstate__
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # at unpickling time (see load_build below).
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            #
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Note that no standard __newobj__ implementation exists;
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # you have to provide your own.  This is to enforce
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # compatibility with Python 2.2 (pickles written using
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # protocol 0 or 1 in Python 2.3 should be unpicklable by
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Python 2.2).
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cls = args[0]
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not hasattr(cls, "__new__"):
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise PicklingError(
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "args[0] from __newobj__ args has no __new__")
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if obj is not None and cls is not obj.__class__:
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise PicklingError(
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "args[0] from __newobj__ args has the wrong class")
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = args[1:]
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(cls)
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(args)
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(NEWOBJ)
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(func)
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(args)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(REDUCE)
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if obj is not None:
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.memoize(obj)
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # More new special cases (that work with older protocols as
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # well): when __reduce__ returns a tuple with 4 or 5 items,
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the 4th and 5th item should be iterators that provide list
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # items and dict items (as (key, value) tuples), or None.
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if listitems is not None:
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._batch_appends(listitems)
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if dictitems is not None:
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._batch_setitems(dictitems)
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if state is not None:
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(state)
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(BUILD)
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Methods below this point are dispatched through the dispatch table
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch = {}
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_none(self, obj):
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(NONE)
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[NoneType] = save_none
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_bool(self, obj):
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.proto >= 2:
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(obj and NEWTRUE or NEWFALSE)
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(obj and TRUE or FALSE)
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[bool] = save_bool
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_int(self, obj, pack=struct.pack):
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # If the int is small enough to fit in a signed 4-byte 2's-comp
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # format, we can store it more efficiently than the general
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # case.
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # First one- and two-byte unsigned ints:
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if obj >= 0:
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if obj <= 0xff:
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.write(BININT1 + chr(obj))
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if obj <= 0xffff:
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.write("%c%c%c" % (BININT2, obj&0xff, obj>>8))
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Next check for 4-byte signed ints:
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            high_bits = obj >> 31  # note that Python shift sign-extends
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if high_bits == 0 or high_bits == -1:
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # All high bits are copies of bit 2**31, so the value
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # fits in a 4-byte signed int.
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.write(BININT + pack("<i", obj))
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Text pickle, or int too big to fit in signed 4-byte format.
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(INT + repr(obj) + '\n')
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[IntType] = save_int
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_long(self, obj, pack=struct.pack):
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.proto >= 2:
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bytes = encode_long(obj)
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(bytes)
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n < 256:
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.write(LONG1 + chr(n) + bytes)
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.write(LONG4 + pack("<i", n) + bytes)
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(LONG + repr(obj) + '\n')
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LongType] = save_long
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_float(self, obj, pack=struct.pack):
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(BINFLOAT + pack('>d', obj))
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(FLOAT + repr(obj) + '\n')
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[FloatType] = save_float
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_string(self, obj, pack=struct.pack):
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(obj)
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n < 256:
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.write(SHORT_BINSTRING + chr(n) + obj)
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.write(BINSTRING + pack("<i", n) + obj)
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(STRING + repr(obj) + '\n')
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[StringType] = save_string
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_unicode(self, obj, pack=struct.pack):
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            encoding = obj.encode('utf-8')
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(encoding)
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(BINUNICODE + pack("<i", n) + encoding)
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            obj = obj.replace("\\", "\\u005c")
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            obj = obj.replace("\n", "\\u000a")
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.write(UNICODE + obj.encode('raw-unicode-escape') + '\n')
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[UnicodeType] = save_unicode
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if StringType is UnicodeType:
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This is true for Jython
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def save_string(self, obj, pack=struct.pack):
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            unicode = obj.isunicode()
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self.bin:
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if unicode:
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    obj = obj.encode("utf-8")
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                l = len(obj)
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if l < 256 and not unicode:
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.write(SHORT_BINSTRING + chr(l) + obj)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    s = pack("<i", l)
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if unicode:
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.write(BINUNICODE + s + obj)
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.write(BINSTRING + s + obj)
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if unicode:
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    obj = obj.replace("\\", "\\u005c")
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    obj = obj.replace("\n", "\\u000a")
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    obj = obj.encode('raw-unicode-escape')
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.write(UNICODE + obj + '\n')
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.write(STRING + repr(obj) + '\n')
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.memoize(obj)
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dispatch[StringType] = save_string
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_tuple(self, obj):
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        proto = self.proto
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = len(obj)
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n == 0:
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if proto:
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(EMPTY_TUPLE)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(MARK + TUPLE)
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save = self.save
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo = self.memo
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if n <= 3 and proto >= 2:
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for element in obj:
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(element)
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Subtle.  Same as in the big comment below.
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if id(obj) in memo:
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                get = self.get(memo[id(obj)][0])
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(POP * n + get)
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(_tuplesize2code[n])
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.memoize(obj)
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # has more than 3 elements.
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write(MARK)
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for element in obj:
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(element)
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if id(obj) in memo:
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Subtle.  d was not in memo when we entered save_tuple(), so
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # the process of saving the tuple's elements must have saved
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # the tuple itself:  the tuple is recursive.  The proper action
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # now is to throw away everything we put on the stack, and
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # simply GET the tuple (it's already constructed).  This check
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # could have been done in the "for element" loop instead, but
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # recursive tuples are a rare thing.
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            get = self.get(memo[id(obj)][0])
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if proto:
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(POP_MARK + get)
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:   # proto 0 -- POP_MARK not available
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(POP * (n+1) + get)
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # No recursion.
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(TUPLE)
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TupleType] = save_tuple
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # save_empty_tuple() isn't used by anything in Python 2.3.  However, I
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # found a Pickler subclass in Zope3 that calls it, so it's not harmless
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # to remove it.
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_empty_tuple(self, obj):
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.write(EMPTY_TUPLE)
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_list(self, obj):
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(EMPTY_LIST)
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:   # proto 0 -- can't use EMPTY_LIST
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(MARK + LIST)
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._batch_appends(iter(obj))
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[ListType] = save_list
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Keep in synch with cPickle's BATCHSIZE.  Nothing will break if it gets
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # out of synch, though.
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _BATCHSIZE = 1000
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _batch_appends(self, items):
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Helper to batch up APPENDS sequences
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save = self.save
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.bin:
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for x in items:
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(x)
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(APPEND)
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        r = xrange(self._BATCHSIZE)
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while items is not None:
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tmp = []
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in r:
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    x = items.next()
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    tmp.append(x)
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except StopIteration:
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    items = None
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(tmp)
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n > 1:
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(MARK)
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for x in tmp:
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    save(x)
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(APPENDS)
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif n:
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(tmp[0])
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(APPEND)
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # else tmp is empty, and we're done
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_dict(self, obj):
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(EMPTY_DICT)
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:   # proto 0 -- can't use EMPTY_DICT
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(MARK + DICT)
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._batch_setitems(obj.iteritems())
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[DictionaryType] = save_dict
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not PyStringMap is None:
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dispatch[PyStringMap] = save_dict
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _batch_setitems(self, items):
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Helper to batch up SETITEMS sequences; proto >= 1 only
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save = self.save
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.bin:
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k, v in items:
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(k)
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(v)
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(SETITEM)
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        r = xrange(self._BATCHSIZE)
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while items is not None:
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tmp = []
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in r:
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    tmp.append(items.next())
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except StopIteration:
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    items = None
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            n = len(tmp)
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if n > 1:
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(MARK)
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for k, v in tmp:
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    save(k)
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    save(v)
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(SETITEMS)
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif n:
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k, v = tmp[0]
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(k)
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(v)
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                write(SETITEM)
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # else tmp is empty, and we're done
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_inst(self, obj):
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cls = obj.__class__
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo  = self.memo
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save  = self.save
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if hasattr(obj, '__getinitargs__'):
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = obj.__getinitargs__()
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            len(args) # XXX Assert it's a sequence
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _keep_alive(args, memo)
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = ()
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write(MARK)
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bin:
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save(cls)
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for arg in args:
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(arg)
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(OBJ)
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for arg in args:
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                save(arg)
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            write(INST + cls.__module__ + '\n' + cls.__name__ + '\n')
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            getstate = obj.__getstate__
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            stuff = obj.__dict__
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            stuff = getstate()
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _keep_alive(stuff, memo)
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        save(stuff)
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write(BUILD)
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[InstanceType] = save_inst
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def save_global(self, obj, name=None, pack=struct.pack):
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write = self.write
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo = self.memo
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if name is None:
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name = obj.__name__
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        module = getattr(obj, "__module__", None)
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if module is None:
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            module = whichmodule(obj, name)
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __import__(module)
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            mod = sys.modules[module]
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            klass = getattr(mod, name)
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except (ImportError, KeyError, AttributeError):
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise PicklingError(
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Can't pickle %r: it's not found as %s.%s" %
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                (obj, module, name))
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if klass is not obj:
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise PicklingError(
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "Can't pickle %r: it's not the same object as %s.%s" %
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    (obj, module, name))
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.proto >= 2:
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            code = _extension_registry.get((module, name))
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if code:
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                assert code > 0
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if code <= 0xff:
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    write(EXT1 + chr(code))
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                elif code <= 0xffff:
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    write("%c%c%c" % (EXT2, code&0xff, code>>8))
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    write(EXT4 + pack("<i", code))
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        write(GLOBAL + module + '\n' + name + '\n')
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memoize(obj)
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[ClassType] = save_global
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[FunctionType] = save_global
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BuiltinFunctionType] = save_global
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TypeType] = save_global
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Pickling helpers
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _keep_alive(x, memo):
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Keeps a reference to the object x in the memo.
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Because we remember objects by their id, we have
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    to assure that possibly temporary objects are kept
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    alive by referencing them.
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    We store a reference at the id of the memo, which should
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    normally not be used unless someone tries to deepcopy
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    the memo itself...
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo[id(memo)].append(x)
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except KeyError:
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # aha, this is the first one :-)
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        memo[id(memo)]=[x]
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# A cache for whichmodule(), mapping a function object to the name of
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# the module in which the function was found.
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclassmap = {} # called classmap for backwards compatibility
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef whichmodule(func, funcname):
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Figure out the module in which a function occurs.
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Search sys.modules for the module.
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Cache in classmap.
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return a module name.
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If the function cannot be found, return "__main__".
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Python functions should always get an __module__ from their globals.
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mod = getattr(func, "__module__", None)
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if mod is not None:
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return mod
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if func in classmap:
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return classmap[func]
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for name, module in sys.modules.items():
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if module is None:
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            continue # skip dummy package entries
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if name != '__main__' and getattr(module, funcname, None) is func:
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            break
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = '__main__'
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    classmap[func] = name
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return name
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Unpickling machinery
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Unpickler:
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, file):
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This takes a file-like object for reading a pickle data stream.
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The protocol version of the pickle is detected automatically, so no
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        proto argument is needed.
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The file-like object must have two methods, a read() method that
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        takes an integer argument, and a readline() method that requires no
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        arguments.  Both methods should return a string.  Thus file-like
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        object can be a file object opened for reading, a StringIO object,
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        or any other custom object that meets this interface.
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.readline = file.readline
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.read = file.read
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo = {}
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load(self):
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Read a pickled object representation from the open file.
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Return the reconstituted object hierarchy specified in the file.
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.mark = object() # any new unique object
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack = []
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append = self.stack.append
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        read = self.read
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dispatch = self.dispatch
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while 1:
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = read(1)
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dispatch[key](self)
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except _Stop, stopinst:
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return stopinst.value
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Return largest index k such that self.stack[k] is self.mark.
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # If the stack doesn't contain a mark, eventually raises IndexError.
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # This could be sped by maintaining another stack, of indices at which
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the mark appears.  For that matter, the latter stack would suffice,
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # and we wouldn't need to push mark objects on self.stack at all.
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Doing so is probably a good thing, though, since if the pickle is
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # corrupt (or hostile) we may get a clue from finding self.mark embedded
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # in unpickled objects.
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def marker(self):
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mark = self.mark
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = len(stack)-1
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while stack[k] is not mark: k = k-1
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return k
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch = {}
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_eof(self):
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise EOFError
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[''] = load_eof
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_proto(self):
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        proto = ord(self.read(1))
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not 0 <= proto <= 2:
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError, "unsupported pickle protocol: %d" % proto
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[PROTO] = load_proto
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_persid(self):
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pid = self.readline()[:-1]
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.persistent_load(pid))
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[PERSID] = load_persid
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binpersid(self):
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pid = self.stack.pop()
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.persistent_load(pid))
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINPERSID] = load_binpersid
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_none(self):
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(None)
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[NONE] = load_none
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_false(self):
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(False)
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[NEWFALSE] = load_false
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_true(self):
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(True)
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[NEWTRUE] = load_true
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_int(self):
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        data = self.readline()
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if data == FALSE[1:]:
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            val = False
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif data == TRUE[1:]:
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            val = True
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                val = int(data)
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                val = long(data)
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(val)
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[INT] = load_int
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binint(self):
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(mloads('i' + self.read(4)))
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BININT] = load_binint
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binint1(self):
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(ord(self.read(1)))
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BININT1] = load_binint1
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binint2(self):
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(mloads('i' + self.read(2) + '\000\000'))
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BININT2] = load_binint2
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_long(self):
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(long(self.readline()[:-1], 0))
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LONG] = load_long
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_long1(self):
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = ord(self.read(1))
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bytes = self.read(n)
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(decode_long(bytes))
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LONG1] = load_long1
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_long4(self):
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = mloads('i' + self.read(4))
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bytes = self.read(n)
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(decode_long(bytes))
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LONG4] = load_long4
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_float(self):
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(float(self.readline()[:-1]))
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[FLOAT] = load_float
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binfloat(self, unpack=struct.unpack):
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(unpack('>d', self.read(8))[0])
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINFLOAT] = load_binfloat
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_string(self):
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rep = self.readline()[:-1]
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for q in "\"'": # double or single quote
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if rep.startswith(q):
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if len(rep) < 2 or not rep.endswith(q):
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise ValueError, "insecure string pickle"
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rep = rep[len(q):-len(q)]
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError, "insecure string pickle"
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(rep.decode("string-escape"))
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[STRING] = load_string
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binstring(self):
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        len = mloads('i' + self.read(4))
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.read(len))
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINSTRING] = load_binstring
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_unicode(self):
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[UNICODE] = load_unicode
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binunicode(self):
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        len = mloads('i' + self.read(4))
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(unicode(self.read(len),'utf-8'))
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINUNICODE] = load_binunicode
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_short_binstring(self):
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        len = ord(self.read(1))
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.read(len))
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[SHORT_BINSTRING] = load_short_binstring
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_tuple(self):
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = self.marker()
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[k:] = [tuple(self.stack[k+1:])]
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TUPLE] = load_tuple
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_empty_tuple(self):
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack.append(())
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EMPTY_TUPLE] = load_empty_tuple
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_tuple1(self):
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[-1] = (self.stack[-1],)
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TUPLE1] = load_tuple1
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_tuple2(self):
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TUPLE2] = load_tuple2
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_tuple3(self):
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[TUPLE3] = load_tuple3
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_empty_list(self):
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack.append([])
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EMPTY_LIST] = load_empty_list
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_empty_dictionary(self):
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack.append({})
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EMPTY_DICT] = load_empty_dictionary
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_list(self):
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = self.marker()
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[k:] = [self.stack[k+1:]]
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LIST] = load_list
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_dict(self):
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = self.marker()
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = {}
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        items = self.stack[k+1:]
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(0, len(items), 2):
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key = items[i]
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            value = items[i+1]
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            d[key] = value
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[k:] = [d]
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[DICT] = load_dict
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # INST and OBJ differ only in how they get a class object.  It's not
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # only sensible to do the rest in a common routine, the two routines
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # previously diverged and grew different bugs.
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # klass is the class to instantiate, and k points to the topmost mark
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # object, following which are the arguments for klass.__init__.
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _instantiate(self, klass, k):
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = tuple(self.stack[k+1:])
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self.stack[k:]
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        instantiated = 0
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if (not args and
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                type(klass) is ClassType and
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                not hasattr(klass, "__getinitargs__")):
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = _EmptyClass()
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value.__class__ = klass
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                instantiated = 1
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except RuntimeError:
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # In restricted execution, assignment to inst.__class__ is
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # prohibited
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not instantiated:
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = klass(*args)
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except TypeError, err:
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise TypeError, "in constructor for %s: %s" % (
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    klass.__name__, str(err)), sys.exc_info()[2]
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(value)
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_inst(self):
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        module = self.readline()[:-1]
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = self.readline()[:-1]
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        klass = self.find_class(module, name)
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._instantiate(klass, self.marker())
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[INST] = load_inst
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_obj(self):
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Stack is ... markobject classobject arg1 arg2 ...
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = self.marker()
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        klass = self.stack.pop(k+1)
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._instantiate(klass, k)
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[OBJ] = load_obj
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_newobj(self):
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = self.stack.pop()
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cls = self.stack[-1]
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        obj = cls.__new__(cls, *args)
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack[-1] = obj
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[NEWOBJ] = load_newobj
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_global(self):
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        module = self.readline()[:-1]
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = self.readline()[:-1]
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        klass = self.find_class(module, name)
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(klass)
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[GLOBAL] = load_global
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_ext1(self):
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        code = ord(self.read(1))
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_extension(code)
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EXT1] = load_ext1
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_ext2(self):
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        code = mloads('i' + self.read(2) + '\000\000')
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_extension(code)
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EXT2] = load_ext2
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_ext4(self):
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        code = mloads('i' + self.read(4))
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_extension(code)
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[EXT4] = load_ext4
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_extension(self, code):
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nil = []
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        obj = _extension_cache.get(code, nil)
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if obj is not nil:
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.append(obj)
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key = _inverted_registry.get(code)
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not key:
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("unregistered extension code %d" % code)
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        obj = self.find_class(*key)
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _extension_cache[code] = obj
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(obj)
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def find_class(self, module, name):
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Subclasses may override this
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __import__(module)
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mod = sys.modules[module]
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        klass = getattr(mod, name)
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return klass
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_reduce(self):
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = stack.pop()
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        func = stack[-1]
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        value = func(*args)
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack[-1] = value
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[REDUCE] = load_reduce
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_pop(self):
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self.stack[-1]
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[POP] = load_pop
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_pop_mark(self):
11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = self.marker()
11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self.stack[k:]
11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[POP_MARK] = load_pop_mark
11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_dup(self):
11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.stack[-1])
11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[DUP] = load_dup
11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_get(self):
11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.memo[self.readline()[:-1]])
11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[GET] = load_get
11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binget(self):
11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i = ord(self.read(1))
11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.memo[repr(i)])
11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINGET] = load_binget
11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_long_binget(self):
11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i = mloads('i' + self.read(4))
11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.memo[repr(i)])
11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LONG_BINGET] = load_long_binget
11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_put(self):
11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo[self.readline()[:-1]] = self.stack[-1]
11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[PUT] = load_put
11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_binput(self):
11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i = ord(self.read(1))
11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo[repr(i)] = self.stack[-1]
11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BINPUT] = load_binput
11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_long_binput(self):
11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i = mloads('i' + self.read(4))
11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.memo[repr(i)] = self.stack[-1]
11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[LONG_BINPUT] = load_long_binput
11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_append(self):
11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        value = stack.pop()
11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list = stack[-1]
11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list.append(value)
11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[APPEND] = load_append
11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_appends(self):
11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mark = self.marker()
11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list = stack[mark - 1]
11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list.extend(stack[mark + 1:])
11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del stack[mark:]
11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[APPENDS] = load_appends
11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_setitem(self):
11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        value = stack.pop()
11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key = stack.pop()
11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dict = stack[-1]
11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dict[key] = value
11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[SETITEM] = load_setitem
12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_setitems(self):
12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mark = self.marker()
12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dict = stack[mark - 1]
12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(mark + 1, len(stack), 2):
12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dict[stack[i]] = stack[i + 1]
12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del stack[mark:]
12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[SETITEMS] = load_setitems
12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_build(self):
12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        stack = self.stack
12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        state = stack.pop()
12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        inst = stack[-1]
12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        setstate = getattr(inst, "__setstate__", None)
12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if setstate:
12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            setstate(state)
12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        slotstate = None
12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(state, tuple) and len(state) == 2:
12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            state, slotstate = state
12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if state:
12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                d = inst.__dict__
12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    for k, v in state.iteritems():
12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        d[intern(k)] = v
12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # keys in state don't have to be strings
12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # don't blow up, but don't go out of our way
12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except TypeError:
12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    d.update(state)
12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except RuntimeError:
12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # XXX In restricted execution, the instance's __dict__
12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # is not accessible.  Use the old way of unpickling
12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # the instance variables.  This is a semantic
12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # difference when unpickling in restricted
12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # vs. unrestricted modes.
12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Note, however, that cPickle has never tried to do the
12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # .update() business, and always uses
12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                #     PyObject_SetItem(inst.__dict__, key, value) in a
12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # loop over state.items().
12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for k, v in state.items():
12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    setattr(inst, k, v)
12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if slotstate:
12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k, v in slotstate.items():
12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                setattr(inst, k, v)
12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[BUILD] = load_build
12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_mark(self):
12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.append(self.mark)
12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[MARK] = load_mark
12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def load_stop(self):
12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        value = self.stack.pop()
12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise _Stop(value)
12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dispatch[STOP] = load_stop
12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Helper class for load_inst/load_obj
12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _EmptyClass:
12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Encode/decode longs in linear time.
12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport binascii as _binascii
12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef encode_long(x):
12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    r"""Encode a long to a two's complement little-endian binary string.
12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note that 0L is a special case, returning an empty string, to save a
12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    byte in the LONG1 pickling context.
12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(0L)
12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ''
12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(255L)
12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\xff\x00'
12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(32767L)
12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\xff\x7f'
12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(-256L)
12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\x00\xff'
12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(-32768L)
12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\x00\x80'
12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(-128L)
12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\x80'
12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> encode_long(127L)
12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '\x7f'
12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>>
12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if x == 0:
12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return ''
12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if x > 0:
12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ashex = hex(x)
12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assert ashex.startswith("0x")
12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        njunkchars = 2 + ashex.endswith('L')
12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nibbles = len(ashex) - njunkchars
12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if nibbles & 1:
12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # need an even # of nibbles for unhexlify
12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ashex = "0x0" + ashex[2:]
13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif int(ashex[2], 16) >= 8:
13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # "looks negative", so need a byte of sign bits
13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ashex = "0x00" + ashex[2:]
13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Build the 256's-complement:  (1L << nbytes) + x.  The trick is
13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to find the number of bytes in linear time (although that should
13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # really be a constant-time task).
13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ashex = hex(-x)
13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assert ashex.startswith("0x")
13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        njunkchars = 2 + ashex.endswith('L')
13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nibbles = len(ashex) - njunkchars
13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if nibbles & 1:
13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Extend to a full byte.
13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            nibbles += 1
13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        nbits = nibbles * 4
13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x += 1L << nbits
13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assert x > 0
13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ashex = hex(x)
13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        njunkchars = 2 + ashex.endswith('L')
13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        newnibbles = len(ashex) - njunkchars
13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if newnibbles < nibbles:
13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ashex = "0x" + "0" * (nibbles - newnibbles) + ashex[2:]
13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if int(ashex[2], 16) < 8:
13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # "looks positive", so need a byte of sign bits
13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ashex = "0xff" + ashex[2:]
13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if ashex.endswith('L'):
13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ashex = ashex[2:-1]
13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ashex = ashex[2:]
13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    assert len(ashex) & 1 == 0, (x, ashex)
13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    binary = _binascii.unhexlify(ashex)
13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return binary[::-1]
13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef decode_long(data):
13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    r"""Decode a long from a two's complement little-endian binary string.
13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long('')
13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    0L
13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\xff\x00")
13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    255L
13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\xff\x7f")
13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    32767L
13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\x00\xff")
13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    -256L
13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\x00\x80")
13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    -32768L
13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\x80")
13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    -128L
13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    >>> decode_long("\x7f")
13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    127L
13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    nbytes = len(data)
13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if nbytes == 0:
13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 0L
13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ashex = _binascii.hexlify(data[::-1])
13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    n = long(ashex, 16) # quadratic time before Python 2.3; linear now
13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if data[-1] >= '\x80':
13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n -= 1L << (nbytes * 8)
13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return n
13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Shorthands
13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from cStringIO import StringIO
13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from StringIO import StringIO
13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef dump(obj, file, protocol=None):
13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pickler(file, protocol).dump(obj)
13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef dumps(obj, protocol=None):
13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file = StringIO()
13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pickler(file, protocol).dump(obj)
13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return file.getvalue()
13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef load(file):
13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Unpickler(file).load()
13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef loads(str):
13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file = StringIO(str)
13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Unpickler(file).load()
13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Doctest
13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _test():
13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import doctest
13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return doctest.testmod()
13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _test()
1392