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