14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "cStringIO.h" 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structmember.h" 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(cPickle_module_documentation, 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"C implementation and optimization of the Python pickle module."); 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_eval_input 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <graminit.h> 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_eval_input eval_input 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_eval_input */ 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL)) 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define WRITE_BUF_SIZE 256 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Bump this when new opcodes are added to the pickle protocol. */ 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HIGHEST_PROTOCOL 2 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * all headers have already been included here, we can safely redefine it. 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef UNICODE 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# undef UNICODE 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Pickle opcodes. These must be kept in synch with pickle.py. Extensive 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * docs are in pickletools.py. 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define MARK '(' 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define STOP '.' 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define POP '0' 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define POP_MARK '1' 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define DUP '2' 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FLOAT 'F' 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINFLOAT 'G' 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INT 'I' 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BININT 'J' 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BININT1 'K' 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG 'L' 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BININT2 'M' 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NONE 'N' 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PERSID 'P' 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINPERSID 'Q' 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define REDUCE 'R' 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define STRING 'S' 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINSTRING 'T' 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SHORT_BINSTRING 'U' 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define UNICODE 'V' 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINUNICODE 'X' 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define APPEND 'a' 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BUILD 'b' 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define GLOBAL 'c' 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define DICT 'd' 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EMPTY_DICT '}' 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define APPENDS 'e' 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define GET 'g' 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINGET 'h' 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INST 'i' 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_BINGET 'j' 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LIST 'l' 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EMPTY_LIST ']' 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define OBJ 'o' 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PUT 'p' 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BINPUT 'q' 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_BINPUT 'r' 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SETITEM 's' 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TUPLE 't' 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EMPTY_TUPLE ')' 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SETITEMS 'u' 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Protocol 2. */ 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PROTO '\x80' /* identify pickle protocol */ 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */ 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EXT1 '\x82' /* push object from extension registry; 1-byte index */ 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EXT2 '\x83' /* ditto, but 2-byte index */ 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EXT4 '\x84' /* ditto, but 4-byte index */ 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TUPLE1 '\x85' /* build 1-tuple from stack top */ 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */ 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */ 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NEWTRUE '\x88' /* push True */ 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NEWFALSE '\x89' /* push False */ 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG1 '\x8a' /* push long from < 256 bytes */ 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG4 '\x8b' /* push really big long */ 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* There aren't opcodes -- they're ways to pickle bools before protocol 2, 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * so that unpicklers written before bools were introduced unpickle them 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * as ints, but unpicklers after can recognize that bools were intended. 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Note that protocol 2 added direct ways to pickle bools. 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef TRUE 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TRUE "I01\n" 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef FALSE 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FALSE "I00\n" 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * break if this gets out of synch with pickle.py, but it's unclear that 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * would help anything either. 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BATCHSIZE 1000 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char MARKv = MARK; 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *PickleError; 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *PicklingError; 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *UnpickleableError; 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *UnpicklingError; 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *BadPickleGet; 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* As the name says, an empty tuple. */ 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *empty_tuple; 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* copy_reg.dispatch_table, {type_object: pickling_function} */ 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *dispatch_table; 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* For EXT[124] opcodes. */ 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* copy_reg._extension_registry, {(module_name, function_name): code} */ 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *extension_registry; 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* copy_reg._inverted_registry, {code: (module_name, function_name)} */ 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *inverted_registry; 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* copy_reg._extension_cache, {code: object} */ 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *extension_cache; 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* For looking up name pairs in copy_reg._extension_registry. */ 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *two_tuple; 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *__class___str, *__getinitargs___str, *__dict___str, 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *__getstate___str, *__setstate___str, *__name___str, *__reduce___str, 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *__reduce_ex___str, 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *write_str, *append_str, 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *read_str, *readline_str, *__main___str, 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *dispatch_table_str; 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/************************************************************************* 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Internal Data type for pickle data. */ 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct { 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int length; /* number of initial slots in data currently used */ 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size; /* number of slots in data allocated */ 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject **data; 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} Pdata; 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_dealloc(Pdata *self) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject **p; 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = self->length, p = self->data; --i >= 0; p++) { 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(*p); 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->data) 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(self->data); 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Del(self); 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject PdataType = { 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0, 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)Pdata_dealloc, 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, "" 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Pdata_Check(O) (Py_TYPE(O) == &PdataType) 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_New(void) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata *self; 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(self = PyObject_New(Pdata, &PdataType))) 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->size = 8; 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->length = 0; 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->data = malloc(self->size * sizeof(PyObject*)); 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->data) 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*)self; 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(self); 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstackUnderflow(void) 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "unpickling stack underflow"); 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Retain only the initial clearto items. If clearto >= the current 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * number of items, this is a (non-erroneous) NOP. 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_clear(Pdata *self, int clearto) 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject **p; 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (clearto < 0) return stackUnderflow(); 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (clearto >= self->length) return 0; 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = self->length, p = self->data + clearto; 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --i >= clearto; 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p++) { 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(*p); 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->length = clearto; 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_grow(Pdata *self) 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int bigger; 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbytes; 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject **tmp; 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bigger = self->size << 1; 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bigger <= 0) /* was 0, or new value overflows */ 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto nomemory; 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((int)(size_t)bigger != bigger) 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto nomemory; 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbytes = (size_t)bigger * sizeof(PyObject *); 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbytes / sizeof(PyObject *) != (size_t)bigger) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto nomemory; 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp = realloc(self->data, nbytes); 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tmp == NULL) 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto nomemory; 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->data = tmp; 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->size = bigger; 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nomemory: 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* D is a Pdata*. Pop the topmost element and store it into V, which 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * is raised and V is set to NULL. D and V may be evaluated several times. 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PDATA_POP(D, V) { \ 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((D)->length) \ 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (V) = (D)->data[--((D)->length)]; \ 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { \ 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "bad pickle data"); \ 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (V) = NULL; \ 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata* 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * D. If the Pdata stack can't be grown to hold the new value, both 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * raise MemoryError and execute "return ER". The difference is in ownership 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of O after: _PUSH transfers ownership of O from the caller to the stack 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * (no incref of O is done, and in case of error O is decrefed), while 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * _APPEND pushes a new reference. 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Push O on stack D, giving ownership of O to the stack. */ 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PDATA_PUSH(D, O, ER) { \ 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_grow((Pdata*)(D)) < 0) { \ 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(O); \ 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ER; \ 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Push O on stack D, pushing a new reference. */ 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PDATA_APPEND(D, O, ER) { \ 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_grow((Pdata*)(D)) < 0) \ 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ER; \ 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(O); \ 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_popTuple(Pdata *self, int start) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *r; 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, j, l; 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = self->length-start; 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r = PyTuple_New(l); 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (r == NULL) 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = start, j = 0 ; j < l; i++, j++) 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(r, j, self->data[i]); 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->length = start; 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r; 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPdata_popList(Pdata *self, int start) 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *r; 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, j, l; 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l=self->length-start; 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( r=PyList_New(l))) return NULL; 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=start, j=0 ; j < l; i++, j++) 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_SET_ITEM(r, j, self->data[i]); 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->length=start; 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r; 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*************************************************************************/ 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define ARG_TUP(self, o) { \ 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg || (self->arg=PyTuple_New(1))) { \ 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \ 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(self->arg,0,o); \ 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { \ 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(o); \ 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FREE_ARG_TUP(self) { \ 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_REFCNT(self->arg) > 1) { \ 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(self->arg); \ 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->arg=NULL; \ 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct Picklerobject { 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FILE *fp; 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *write; 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *file; 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *memo; 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *arg; 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pers_func; 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *inst_pers_func; 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* pickle protocol number, >= 0 */ 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int proto; 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* bool, true if proto > 0 */ 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int bin; 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t); 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *write_buf; 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int buf_size; 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dispatch_table; 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int fast_container; /* count nested container dumps */ 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *fast_memo; 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} Picklerobject; 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_CPICKLE_FAST_LIMIT 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_CPICKLE_FAST_LIMIT 50 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Picklertype; 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct Unpicklerobject { 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FILE *fp; 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *file; 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *readline; 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *read; 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *memo; 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *arg; 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata *stack; 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *mark; 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pers_func; 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *last_string; 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int *marks; 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int num_marks; 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int marks_size; 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t); 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **); 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int buf_size; 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *buf; 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *find_class; 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} Unpicklerobject; 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Unpicklertype; 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Forward decls that need the above structs */ 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int save(Picklerobject *, PyObject *, int); 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int put2(Picklerobject *, PyObject *); 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...) 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_list va; 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *args=0, *retval=0; 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_start(va, format); 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (format) args = Py_VaBuildValue(format, va); 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_end(va); 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (format && ! args) return NULL; 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (stringformat && !(retval=PyString_FromString(stringformat))) 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (retval) { 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args) { 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v=PyString_Format(retval, args); 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(retval); 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! v) return NULL; 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm retval=v; 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args) retval=args; 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(ErrType,Py_None); 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(ErrType,retval); 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(retval); 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite_file(Picklerobject *self, const char *s, Py_ssize_t n) 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbyteswritten; 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) { 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > INT_MAX) { 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* String too large */ 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_IncUseCount((PyFileObject *)self->file); 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BEGIN_ALLOW_THREADS 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbyteswritten = fwrite(s, sizeof(char), n, self->fp); 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_END_ALLOW_THREADS 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_DecUseCount((PyFileObject *)self->file); 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbyteswritten != (size_t)n) { 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetFromErrno(PyExc_IOError); 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (int)n; 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n) 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) { 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) { 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (int)n; 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite_none(Picklerobject *self, const char *s, Py_ssize_t n) 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) return 0; 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > INT_MAX) return -1; 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (int)n; 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite_other(Picklerobject *self, const char *s, Py_ssize_t _n) 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_str = 0, *junk = 0; 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int n; 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_n > INT_MAX) 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = (int)_n; 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) { 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self->buf_size )) return 0; 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_str = PyString_FromStringAndSize(self->write_buf, 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size); 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!py_str) 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) { 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > WRITE_BUF_SIZE) { 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_str = 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(s, n))) 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memcpy(self->write_buf + self->buf_size, s, n); 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size += n; 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write) { 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* object with write method */ 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, py_str); 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm junk = PyObject_Call(self->write, self->arg, NULL); 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (junk) Py_DECREF(junk); 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else return -1; 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->file, py_str, -1); 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = 0; 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread_file(Unpicklerobject *self, char **s, Py_ssize_t n) 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbytesread; 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->buf_size == 0) { 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size; 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = ((n < 32) ? 32 : n); 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self->buf = (char *)malloc(size))) { 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = size; 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (n > self->buf_size) { 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *newbuf = (char *)realloc(self->buf, n); 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!newbuf) { 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf = newbuf; 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = n; 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_IncUseCount((PyFileObject *)self->file); 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BEGIN_ALLOW_THREADS 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbytesread = fread(self->buf, sizeof(char), n, self->fp); 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_END_ALLOW_THREADS 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_DecUseCount((PyFileObject *)self->file); 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbytesread != (size_t)n) { 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (feof(self->fp)) { 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetFromErrno(PyExc_IOError); 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s = self->buf; 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreadline_file(Unpicklerobject *self, char **s) 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->buf_size == 0) { 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self->buf = (char *)malloc(40))) { 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = 40; 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (1) { 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int bigger; 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *newbuf; 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; i < (self->buf_size - 1); i++) { 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (feof(self->fp) || 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (self->buf[i] = getc(self->fp)) == '\n') { 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf[i + 1] = '\0'; 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s = self->buf; 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return i + 1; 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bigger = self->buf_size << 1; 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bigger <= 0) { /* overflow */ 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newbuf = (char *)realloc(self->buf, bigger); 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!newbuf) { 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf = newbuf; 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = bigger; 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n) 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *ptr; 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) { 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s = ptr; 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreadline_cStringIO(Unpicklerobject *self, char **s) 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n; 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *ptr; 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) { 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s = ptr; 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread_other(Unpicklerobject *self, char **s, Py_ssize_t n) 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *bytes, *str=0; 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( bytes = PyInt_FromSsize_t(n))) return -1; 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, bytes); 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyObject_Call(self->read, self->arg, NULL); 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! str) return -1; 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->last_string); 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->last_string = str; 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! (*s = PyString_AsString(str))) return -1; 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(str) != n) { 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreadline_other(Unpicklerobject *self, char **s) 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *str; 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t str_size; 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( str = PyObject_CallObject(self->readline, empty_tuple))) { 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((str_size = PyString_Size(str)) < 0) 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->last_string); 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->last_string = str; 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! (*s = PyString_AsString(str))) 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return str_size; 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Copy the first n bytes from s into newly malloc'ed memory, plus a 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * trailing 0 byte. Return a pointer to that, or NULL if out of memory. 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The caller is responsible for free()'ing the return value. 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char * 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpystrndup(const char *s, int n) 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *r = (char *)malloc(n+1); 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (r == NULL) 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (char*)PyErr_NoMemory(); 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memcpy(r, s, n); 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r[n] = 0; 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r; 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget(Picklerobject *self, PyObject *id) 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *value, *mv; 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long c_value; 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char s[30]; 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t len; 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( mv = PyDict_GetItem(self->memo, id))) { 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(PyExc_KeyError, id); 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( value = PyTuple_GetItem(mv, 0))) 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( PyInt_Check(value))) { 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, "no int where int expected in memo"); 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_value = PyInt_AS_LONG((PyIntObject*)value); 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = GET; 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value); 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = strlen(s); 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (Pdata_Check(self->file)) { 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) return -1; 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->file, mv, -1); 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c_value < 256) { 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = BINGET; 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = (int)(c_value & 0xff); 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = LONG_BINGET; 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = (int)(c_value & 0xff); 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[2] = (int)((c_value >> 8) & 0xff); 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[3] = (int)((c_value >> 16) & 0xff); 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[4] = (int)((c_value >> 24) & 0xff); 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 5; 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, s, len) < 0) 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmput(Picklerobject *self, PyObject *ob) 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_REFCNT(ob) < 2 || self->fast) 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return put2(self, ob); 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmput2(Picklerobject *self, PyObject *ob) 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[30]; 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int p; 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t len; 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_ob_id = 0, *memo_len = 0, *t = 0; 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast) 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = PyDict_Size(self->memo)) < 0) 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Make sure memo keys are positive! */ 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX Why? 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX And does "positive" really mean non-negative? 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX pickle.py starts with PUT index 0, not 1. This makes for 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX gratuitous differences between the pickling modules. 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p++; 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_ob_id = PyLong_FromVoidPtr(ob))) 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( memo_len = PyInt_FromLong(p))) 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( t = PyTuple_New(2))) 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(t, 0, memo_len); 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(memo_len); 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(t, 1, ob); 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(ob); 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItem(self->memo, py_ob_id, t) < 0) 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = PUT; 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p); 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = strlen(c_str); 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (Pdata_Check(self->file)) { 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) return -1; 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->file, memo_len, -1); 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res=0; /* Job well done ;) */ 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p >= 256) { 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = LONG_BINPUT; 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (int)(p & 0xff); 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[2] = (int)((p >> 8) & 0xff); 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[3] = (int)((p >> 16) & 0xff); 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[4] = (int)((p >> 24) & 0xff); 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 5; 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BINPUT; 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = p; 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, len) < 0) 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(py_ob_id); 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(memo_len); 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(t); 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhichmodule(PyObject *global, PyObject *global_name) 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, j; 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *module = 0, *modules_dict = 0, 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *global_name_attr = 0, *name = 0; 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module = PyObject_GetAttrString(global, "__module__"); 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (module) 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return module; 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( modules_dict = PySys_GetObject("modules"))) 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while ((j = PyDict_Next(modules_dict, &i, &name, &module))) { 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_Compare(name, __main___str)==0) continue; 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global_name_attr = PyObject_GetAttr(module, global_name); 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!global_name_attr) { 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (global_name_attr != global) { 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(global_name_attr); 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(global_name_attr); 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The following implements the rule in pickle.py added in 1.5 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm that used __main__ if no module is found. I don't actually 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm like this rule. jlf 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!j) { 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name=__main___str; 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(name); 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return name; 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfast_save_enter(Picklerobject *self, PyObject *obj) 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* if fast_container < 0, we're doing an error exit. */ 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) { 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *key = NULL; 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast_memo == NULL) { 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_memo = PyDict_New(); 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast_memo == NULL) { 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_container = -1; 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = PyLong_FromVoidPtr(obj); 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (key == NULL) 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItem(self->fast_memo, key)) { 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "fast mode: can't pickle cyclic objects " 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "including object type %s at %p", 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(obj)->tp_name, obj); 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_container = -1; 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_container = -1; 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfast_save_leave(Picklerobject *self, PyObject *obj) 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) { 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *key = PyLong_FromVoidPtr(obj); 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (key == NULL) 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_DelItem(self->fast_memo, key) < 0) { 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_none(Picklerobject *self, PyObject *args) 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char none = NONE; 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &none, 1) < 0) 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_bool(Picklerobject *self, PyObject *args) 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static const char *buf[2] = {FALSE, TRUE}; 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l = PyInt_AS_LONG((PyIntObject *)args); 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto >= 2) { 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char opcode = l ? NEWTRUE : NEWFALSE; 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &opcode, 1) < 0) 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (self->write_func(self, buf[l], len[l]) < 0) 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_int(Picklerobject *self, PyObject *args) 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[32]; 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l = PyInt_AS_LONG((PyIntObject *)args); 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len = 0; 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_LONG > 4 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm || l > 0x7fffffffL 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm || l < -0x80000000L 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) { 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Text-mode pickle, or long too big to fit in the 4-byte 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * signed BININT format: store as a string. 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = INT; 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l); 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, strlen(c_str)) < 0) 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Binary pickle and l fits in a signed 4-byte int. */ 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (int)( l & 0xff); 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[2] = (int)((l >> 8) & 0xff); 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[3] = (int)((l >> 16) & 0xff); 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[4] = (int)((l >> 24) & 0xff); 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((c_str[4] == 0) && (c_str[3] == 0)) { 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c_str[2] == 0) { 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BININT1; 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BININT2; 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 3; 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BININT; 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 5; 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, len) < 0) 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_long(Picklerobject *self, PyObject *args) 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size; 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *repr = NULL; 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char l = LONG; 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto >= 2) { 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Linear-time pickling. */ 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbits; 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbytes; 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char *pdata; 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[5]; 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int sign = _PyLong_Sign(args); 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign == 0) { 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* It's 0 -- an empty bytestring. */ 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = LONG1; 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = 0; 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->write_func(self, c_str, 2); 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) goto finally; 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbits = _PyLong_NumBits(args); 10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbits == (size_t)-1 && PyErr_Occurred()) 10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* How many bytes do we need? There are nbits >> 3 full 10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * bytes of data, and nbits & 7 leftover bits. If there 10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * are any leftover bits, then we clearly need another 10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * byte. Wnat's not so obvious is that we *probably* 10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * need another byte even if there aren't any leftovers: 10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the most-significant bit of the most-significant byte 10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * acts like a sign bit, and it's usually got a sense 10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * opposite of the one we need. The exception is longs 10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of the form -(2**(8*j-1)) for j > 0. Such a long is 10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * its own 256's-complement, so has the right sign bit 10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * even without the extra byte. That's a pain to check 10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * for in advance, though, so we always grab an extra 10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * byte at the start, and cut it back later if possible. 10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbytes = (nbits >> 3) + 1; 10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbytes > INT_MAX) { 10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "long too large " 10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "to pickle"); 10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr = PyString_FromStringAndSize(NULL, (int)nbytes); 10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (repr == NULL) goto finally; 10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pdata = (unsigned char *)PyString_AS_STRING(repr); 10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = _PyLong_AsByteArray((PyLongObject *)args, 10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pdata, nbytes, 10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1 /* little endian */, 1 /* signed */); 10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) goto finally; 11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If the long is negative, this may be a byte more than 11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * needed. This is so iff the MSB is all redundant sign 11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * bits. 11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff && 11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (pdata[nbytes - 2] & 0x80) != 0) 11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --nbytes; 11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbytes < 256) { 11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = LONG1; 11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (char)nbytes; 11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = 2; 11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = LONG4; 11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = (int)nbytes; 11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 1; i < 5; i++) { 11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[i] = (char)(size & 0xff); 11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size >>= 8; 11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = 5; 11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->write_func(self, c_str, size); 11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) goto finally; 11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->write_func(self, (char *)pdata, (int)nbytes); 11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) goto finally; 11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* proto < 2: write the repr and newline. This is quadratic-time 11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * (in the number of digits), in both directions. 11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( repr = PyObject_Repr(args))) 11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((size = PyString_Size(repr)) < 0) 11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &l, 1) < 0) 11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, 11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING((PyStringObject *)repr), 11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size) < 0) 11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(repr); 11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_float(Picklerobject *self, PyObject *args) 11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm double x = PyFloat_AS_DOUBLE((PyFloatObject *)args); 11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->bin) { 11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char str[9]; 11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str[0] = BINFLOAT; 11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0) 11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, str, 9) < 0) 11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int result = -1; 11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *buf = NULL; 11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char op = FLOAT; 11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &op, 1) < 0) 11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf = PyOS_double_to_string(x, 'g', 17, 0, NULL); 11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!buf) { 11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, buf, strlen(buf)) < 0) 11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = 0; 11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdone: 11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMem_Free(buf); 11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_string(Picklerobject *self, PyObject *args, int doput) 12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size, len; 12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *repr=0; 12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((size = PyString_Size(args)) < 0) 12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *repr_str; 12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char string = STRING; 12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( repr = PyObject_Repr(args))) 12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyString_Size(repr)) < 0) 12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr_str = PyString_AS_STRING((PyStringObject *)repr); 12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &string, 1) < 0) 12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, repr_str, len) < 0) 12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(repr); 12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[5]; 12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size < 256) { 12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = SHORT_BINSTRING; 12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = size; 12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (size <= INT_MAX) { 12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BINSTRING; 12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 1; i < 5; i++) 12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[i] = (int)(size >> ((i - 1) * 8)); 12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 5; 12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; /* string too large */ 12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, len) < 0) 12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > 128 && Pdata_Check(self->file)) { 12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) return -1; 12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->file, args, -1); 12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, 12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING( 12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyStringObject *)args), 12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size) < 0) 12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (doput) 12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) < 0) 12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(repr); 12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates 12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm backslash and newline characters to \uXXXX escapes. */ 12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmodified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) 12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *repr; 12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *q; 12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static const char *hexdigit = "0123456789abcdef"; 12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_UNICODE_WIDE 12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const Py_ssize_t expandsize = 10; 12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const Py_ssize_t expandsize = 6; 12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > PY_SSIZE_T_MAX / expandsize) 12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr = PyString_FromStringAndSize(NULL, expandsize * size); 13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (repr == NULL) 13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0) 13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return repr; 13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = q = PyString_AS_STRING(repr); 13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (size-- > 0) { 13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_UNICODE ch = *s++; 13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_UNICODE_WIDE 13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Map 32-bit characters to '\Uxxxxxxxx' */ 13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ch >= 0x10000) { 13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\'; 13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = 'U'; 13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 28) & 0xf]; 13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 24) & 0xf]; 13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 20) & 0xf]; 13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 16) & 0xf]; 13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 12) & 0xf]; 13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 8) & 0xf]; 13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 4) & 0xf]; 13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[ch & 15]; 13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */ 13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ch >= 0xD800 && ch < 0xDC00) { 13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_UNICODE ch2; 13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_UCS4 ucs; 13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ch2 = *s++; 13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size--; 13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { 13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; 13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\'; 13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = 'U'; 13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 28) & 0xf]; 13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 24) & 0xf]; 13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 20) & 0xf]; 13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 16) & 0xf]; 13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 12) & 0xf]; 13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 8) & 0xf]; 13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ucs >> 4) & 0xf]; 13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[ucs & 0xf]; 13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fall through: isolated surrogates are copied as-is */ 13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s--; 13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size++; 13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Map 16-bit characters to '\uxxxx' */ 13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ch >= 256 || ch == '\\' || ch == '\n') { 13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\'; 13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = 'u'; 13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 12) & 0xf]; 13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 8) & 0xf]; 13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[(ch >> 4) & 0xf]; 13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = hexdigit[ch & 15]; 13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Copy everything else as-is */ 13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = (char) ch; 13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p = '\0'; 13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyString_Resize(&repr, p - q); 13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return repr; 13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_unicode(Picklerobject *self, PyObject *args, int doput) 13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size, len; 13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *repr=0; 13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyUnicode_Check(args)) 13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *repr_str; 13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char string = UNICODE; 13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr = modified_EncodeRawUnicodeEscape( 13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)); 13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!repr) 13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyString_Size(repr)) < 0) 13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm repr_str = PyString_AS_STRING((PyStringObject *)repr); 13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &string, 1) < 0) 13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, repr_str, len) < 0) 13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(repr); 14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[5]; 14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( repr = PyUnicode_AsUTF8String(args))) 14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((size = PyString_Size(repr)) < 0) 14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > INT_MAX) 14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; /* string too large */ 14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = BINUNICODE; 14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 1; i < 5; i++) 14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[i] = (int)(size >> ((i - 1) * 8)); 14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 5; 14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, len) < 0) 14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > 128 && Pdata_Check(self->file)) { 14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) 14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->file, repr, -1); 14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, PyString_AS_STRING(repr), 14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size) < 0) 14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(repr); 14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (doput) 14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) < 0) 14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(repr); 14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A helper for save_tuple. Push the len elements in tuple t on the stack. */ 14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstore_tuple_elements(Picklerobject *self, PyObject *t, int len) 14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; /* guilty until proved innocent */ 14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyTuple_Size(t) == len); 14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < len; i++) { 14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *element = PyTuple_GET_ITEM(t, i); 14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (element == NULL) 14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, element, 0) < 0) 14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Tuples are ubiquitous in the pickle protocols, so many techniques are 14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * used across protocols to minimize the space needed to pickle them. 14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Tuples are also the only builtin immutable type that can be recursive 14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * (a tuple can be reached from itself), and that requires some subtle 14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * magic so that it works in all cases. IOW, this is a long routine. 14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_tuple(Picklerobject *self, PyObject *args) 14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_tuple_id = NULL; 14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, i; 14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char tuple = TUPLE; 14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char pop = POP; 14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char pop_mark = POP_MARK; 14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3}; 14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyTuple_Size(args)) < 0) 14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len == 0) { 14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[2]; 14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto) { 14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = EMPTY_TUPLE; 14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 1; 14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = MARK; 15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = TUPLE; 15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, len) >= 0) 15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Don't memoize an empty tuple. */ 15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* A non-empty tuple. */ 15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* id(tuple) isn't in the memo now. If it shows up there after 15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * saving the tuple elements, the tuple must be recursive, in 15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * which case we'll pop everything we put on the stack, and fetch 15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * its value from the memo. 15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_tuple_id = PyLong_FromVoidPtr(args); 15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (py_tuple_id == NULL) 15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len <= 3 && self->proto >= 2) { 15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Use TUPLE{1,2,3} opcodes. */ 15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (store_tuple_elements(self, args, len) < 0) 15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItem(self->memo, py_tuple_id)) { 15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* pop the len elements */ 15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < len; ++i) 15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &pop, 1) < 0) 15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* fetch from memo */ 15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (get(self, py_tuple_id) < 0) 15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Not recursive. */ 15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, len2opcode + len, 1) < 0) 15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto memoize; 15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* proto < 2 and len > 0, or proto >= 2 and len > 3. 15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Generate MARK elt1 elt2 ... TUPLE 15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &MARKv, 1) < 0) 15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (store_tuple_elements(self, args, len) < 0) 15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItem(self->memo, py_tuple_id)) { 15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* pop the stack stuff we pushed */ 15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->bin) { 15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &pop_mark, 1) < 0) 15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Note that we pop one more than len, to remove 15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the MARK too. 15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i <= len; i++) 15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &pop, 1) < 0) 15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* fetch from memo */ 15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (get(self, py_tuple_id) >= 0) 15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Not recursive. */ 15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &tuple, 1) < 0) 15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memoize: 15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) >= 0) 15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(py_tuple_id); 15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* iter is an iterator giving items, and we batch up chunks of 15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * MARK item item ... item APPENDS 15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * opcode sequences. Calling code should have arranged to first create an 15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * empty list, or list-like object, for the APPENDS to operate on. 15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Returns 0 on success, <0 on error. 15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbatch_list(Picklerobject *self, PyObject *iter) 15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj = NULL; 15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *firstitem = NULL; 15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, n; 15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char append = APPEND; 15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char appends = APPENDS; 15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(iter != NULL); 16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto == 0) { 16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* APPENDS isn't available; do one at a time. */ 16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (;;) { 16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = PyIter_Next(iter); 16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) { 16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = save(self, obj, 0); 16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &append, 1) < 0) 16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* proto > 0: write in batches of BATCHSIZE. */ 16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get first item */ 16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm firstitem = PyIter_Next(iter); 16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (firstitem == NULL) { 16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing more to add */ 16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Try to get a second item */ 16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = PyIter_Next(iter); 16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) { 16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Only one item to write */ 16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, firstitem, 0) < 0) 16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &append, 1) < 0) 16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(firstitem); 16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* More than one item to write */ 16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Pump out MARK, items, APPENDS. */ 16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &MARKv, 1) < 0) 16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, firstitem, 0) < 0) 16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(firstitem); 16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 1; 16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fetch and save up to BATCHSIZE items */ 16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (obj) { 16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, obj, 0) < 0) 16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(obj); 16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += 1; 16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n == BATCHSIZE) 16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = PyIter_Next(iter); 16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) { 16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &appends, 1) < 0) 16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (n == BATCHSIZE); 16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBatchFailed: 16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(firstitem); 16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(obj); 16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_list(Picklerobject *self, PyObject *args) 16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char s[3]; 16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *iter; 16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_enter(self, args)) 16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Create an empty list. */ 17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->bin) { 17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = EMPTY_LIST; 17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 1; 17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = MARK; 17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = LIST; 17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, s, len) < 0) 17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get list length, and bow out early if empty. */ 17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyList_Size(args)) < 0) 17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Memoize. */ 17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len == 0) { 17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) >= 0) 17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put2(self, args) < 0) 17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Materialize the list elements. */ 17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iter = PyObject_GetIter(args); 17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (iter == NULL) 17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_EnterRecursiveCall(" while pickling an object") == 0) 17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = batch_list(self, iter); 17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_LeaveRecursiveCall(); 17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(iter); 17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_leave(self, args)) 17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = -1; 17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* iter is an iterator giving (key, value) pairs, and we batch up chunks of 17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * MARK key value ... key value SETITEMS 17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * opcode sequences. Calling code should have arranged to first create an 17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * empty dict, or dict-like object, for the SETITEMS to operate on. 17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Returns 0 on success, <0 on error. 17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This is very much like batch_list(). The difference between saving 17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * elements directly, and picking apart two-tuples, is so long-winded at 17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the C level, though, that attempts to combine these routines were too 17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * ugly to bear. 17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbatch_dict(Picklerobject *self, PyObject *iter) 17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *p = NULL; 17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *firstitem = NULL; 17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, n; 17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char setitem = SETITEM; 17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char setitems = SETITEMS; 17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(iter != NULL); 17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto == 0) { 17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* SETITEMS isn't available; do one at a time. */ 17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (;;) { 17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyIter_Next(iter); 17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) { 17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { 17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, "dict items " 17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "iterator must return 2-tuples"); 17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = save(self, PyTuple_GET_ITEM(p, 0), 0); 17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i >= 0) 17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = save(self, PyTuple_GET_ITEM(p, 1), 0); 17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(p); 17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &setitem, 1) < 0) 17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* proto > 0: write in batches of BATCHSIZE. */ 17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get first item */ 17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm firstitem = PyIter_Next(iter); 17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (firstitem == NULL) { 18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing more to add */ 18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) { 18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, "dict items " 18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "iterator must return 2-tuples"); 18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Try to get a second item */ 18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyIter_Next(iter); 18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) { 18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Only one item to write */ 18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) 18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) 18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &setitem, 1) < 0) 18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(firstitem); 18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* More than one item to write */ 18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Pump out MARK, items, SETITEMS. */ 18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &MARKv, 1) < 0) 18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) 18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) 18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(firstitem); 18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 1; 18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fetch and save up to BATCHSIZE items */ 18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (p) { 18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { 18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, "dict items " 18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "iterator must return 2-tuples"); 18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0) 18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0) 18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(p); 18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += 1; 18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n == BATCHSIZE) 18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyIter_Next(iter); 18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) { 18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &setitems, 1) < 0) 18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto BatchFailed; 18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (n == BATCHSIZE); 18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBatchFailed: 18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(firstitem); 18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(p); 18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This is a variant of batch_dict() above that specializes for dicts, with no 18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * support for dict subclasses. Like batch_dict(), we batch up chunks of 18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * MARK key value ... key value SETITEMS 18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * opcode sequences. Calling code should have arranged to first create an 18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * empty dict, or dict-like object, for the SETITEMS to operate on. 18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Returns 0 on success, -1 on error. 18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Note that this currently doesn't work for protocol 0. 18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbatch_dict_exact(Picklerobject *self, PyObject *obj) 18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *key = NULL, *value = NULL; 18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t dict_size, ppos = 0; 18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char setitem = SETITEM; 18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char setitems = SETITEMS; 18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(obj != NULL); 18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(self->proto > 0); 19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict_size = PyDict_Size(obj); 19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special-case len(d) == 1 to save space. */ 19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict_size == 1) { 19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_Next(obj, &ppos, &key, &value); 19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, key, 0) < 0) 19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, value, 0) < 0) 19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &setitem, 1) < 0) 19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Write in batches of BATCHSIZE. */ 19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &MARKv, 1) < 0) 19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (PyDict_Next(obj, &ppos, &key, &value)) { 19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, key, 0) < 0) 19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, value, 0) < 0) 19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (++i == BATCHSIZE) 19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &setitems, 1) < 0) 19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_Size(obj) != dict_size) { 19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format( 19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyExc_RuntimeError, 19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "dictionary changed size during iteration"); 19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (i == BATCHSIZE); 19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_dict(Picklerobject *self, PyObject *args) 19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char s[3]; 19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_enter(self, args)) 19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Create an empty dict. */ 19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->bin) { 19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = EMPTY_DICT; 19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 1; 19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = MARK; 19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = DICT; 19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 2; 19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, s, len) < 0) 19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get dict size, and bow out early if empty. */ 19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyDict_Size(args)) < 0) 19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len == 0) { 19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) >= 0) 19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put2(self, args) < 0) 19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Materialize the dict items. */ 19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_CheckExact(args) && self->proto > 0) { 19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* We can take certain shortcuts if we know this is a dict and 19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm not a dict subclass. */ 19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_EnterRecursiveCall(" while pickling an object") == 0) { 19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = batch_dict_exact(self, args); 19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_LeaveRecursiveCall(); 19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *iter = PyObject_CallMethod(args, "iteritems", "()"); 19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (iter == NULL) 19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_EnterRecursiveCall(" while pickling an object") == 0) { 19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = batch_dict(self, iter); 19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_LeaveRecursiveCall(); 19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(iter); 19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_leave(self, args)) 19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = -1; 19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_inst(Picklerobject *self, PyObject *args) 20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *class = 0, *module = 0, *name = 0, *state = 0, 20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *getinitargs_func = 0, *getstate_func = 0, *class_args = 0; 20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *module_str, *name_str; 20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int module_size, name_size, res = -1; 20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char inst = INST, obj = OBJ, build = BUILD; 20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_enter(self, args)) 20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &MARKv, 1) < 0) 20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( class = PyObject_GetAttr(args, __class___str))) 20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->bin) { 20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, class, 0) < 0) 20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) { 20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *element = 0; 20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, len; 20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( class_args = 20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Call(getinitargs_func, empty_tuple, NULL))) 20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = PyObject_Size(class_args)) < 0) 20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < len; i++) { 20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( element = PySequence_GetItem(class_args, i))) 20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, element, 0) < 0) { 20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(element); 20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(element); 20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( name = ((PyClassObject *)class)->cl_name )) { 20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, "class has no name"); 20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( module = whichmodule(class, name))) 20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((module_size = PyString_Size(module)) < 0 || 20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (name_size = PyString_Size(name)) < 0) 20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_str = PyString_AS_STRING((PyStringObject *)module); 20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name_str = PyString_AS_STRING((PyStringObject *)name); 20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &inst, 1) < 0) 20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, module_str, module_size) < 0) 20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, name_str, name_size) < 0) 20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (self->write_func(self, &obj, 1) < 0) { 20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) { 20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm state = PyObject_Call(getstate_func, empty_tuple, NULL); 20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!state) 20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( state = PyObject_GetAttr(args, __dict___str))) { 21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyDict_Check(state)) { 21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put2(self, args) < 0) 21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) < 0) 21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, state, 0) < 0) 21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &build, 1) < 0) 21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fast && !fast_save_leave(self, args)) 21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = -1; 21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(module); 21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(class); 21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(state); 21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(getinitargs_func); 21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(getstate_func); 21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(class_args); 21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_global(Picklerobject *self, PyObject *args, PyObject *name) 21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0; 21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *name_str, *module_str; 21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int module_size, name_size, res = -1; 21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char global = GLOBAL; 21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (name) { 21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global_name = name; 21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(global_name); 21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( global_name = PyObject_GetAttr(args, __name___str))) 21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( module = whichmodule(args, global_name))) 21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((module_size = PyString_Size(module)) < 0 || 21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (name_size = PyString_Size(global_name)) < 0) 21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_str = PyString_AS_STRING((PyStringObject *)module); 21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name_str = PyString_AS_STRING((PyStringObject *)global_name); 21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX This can be doing a relative import. Clearly it shouldn't, 21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm but I don't know how to stop it. :-( */ 21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyImport_ImportModule(module_str); 21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod == NULL) { 21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, 21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Can't pickle %s: import of module %s " 21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "failed", 21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OS", args, module); 21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm klass = PyObject_GetAttrString(mod, name_str); 21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (klass == NULL) { 21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, 21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Can't pickle %s: attribute lookup %s.%s " 21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "failed", 21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OSS", args, module, global_name); 21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (klass != args) { 21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(klass); 21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, 21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Can't pickle %s: it's not the same object " 21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "as %s.%s", 21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OSS", args, module, global_name); 21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(klass); 22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto >= 2) { 22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* See whether this is in the extension registry, and if 22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * so generate an EXT opcode. 22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_code; /* extension code as Python object */ 22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long code; /* extension code as C value */ 22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c_str[5]; 22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int n; 22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(two_tuple, 0, module); 22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(two_tuple, 1, global_name); 22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_code = PyDict_GetItem(extension_registry, two_tuple); 22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (py_code == NULL) 22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto gen_global; /* not registered */ 22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Verify py_code has the right type and value. */ 22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyInt_Check(py_code)) { 22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Can't pickle %s: " 22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "extension code %s isn't an integer", 22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "OO", args, py_code); 22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = PyInt_AS_LONG(py_code); 22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (code <= 0 || code > 0x7fffffffL) { 22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Can't pickle %s: " 22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "extension code %ld is out of range", 22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Ol", args, code); 22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Generate an EXT opcode. */ 22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (code <= 0xff) { 22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = EXT1; 22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (char)code; 22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 2; 22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (code <= 0xffff) { 22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = EXT2; 22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (char)(code & 0xff); 22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[2] = (char)((code >> 8) & 0xff); 22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 3; 22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[0] = EXT4; 22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[1] = (char)(code & 0xff); 22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[2] = (char)((code >> 8) & 0xff); 22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[3] = (char)((code >> 16) & 0xff); 22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c_str[4] = (char)((code >> 24) & 0xff); 22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 5; 22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, c_str, n) >= 0) 22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; /* and don't memoize */ 22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gen_global: 22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &global, 1) < 0) 22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, module_str, module_size) < 0) 22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, name_str, name_size) < 0) 22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put(self, args) < 0) 22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(module); 22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(global_name); 22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(mod); 22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_pers(Picklerobject *self, PyObject *args, PyObject *f) 22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pid = 0; 22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size, res = -1; 22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char persid = PERSID, binpersid = BINPERSID; 22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(args); 22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, args); 22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pid = PyObject_Call(f, self->arg, NULL); 23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! pid) return -1; 23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (pid != Py_None) { 23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->bin) { 23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(pid)) { 23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, 23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "persistent id must be string"); 23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &persid, 1) < 0) 23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((size = PyString_Size(pid)) < 0) 23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, 23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING( 23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyStringObject *)pid), 23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size) < 0) 23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, "\n", 1) < 0) 23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 1; 23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (save(self, pid, 1) >= 0) { 23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &binpersid, 1) < 0) 23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = -1; 23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 1; 23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(pid); 23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* We're saving ob, and args is the 2-thru-5 tuple returned by the 23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * appropriate __reduce__ method for ob. 23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob) 23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *callable; 23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *argtup; 23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *state = NULL; 23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *listitems = Py_None; 23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dictitems = Py_None; 23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size; 23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int use_newobj = self->proto >= 2; 23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char reduce = REDUCE; 23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char build = BUILD; 23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char newobj = NEWOBJ; 23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = PyTuple_Size(args); 23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size < 2 || size > 5) { 23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "tuple returned by " 23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%s must contain 2 through 5 elements", 23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "O", fn); 23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5, 23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &callable, 23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &argtup, 23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &state, 23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &listitems, 23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &dictitems)) 23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(argtup)) { 23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Second element of " 23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "tuple returned by %s must be a tuple", 23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "O", fn); 23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (state == Py_None) 23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm state = NULL; 23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (listitems == Py_None) 23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm listitems = NULL; 23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (!PyIter_Check(listitems)) { 23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Fourth element of " 23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "tuple returned by %s must be an iterator, not %s", 23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Os", fn, Py_TYPE(listitems)->tp_name); 23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dictitems == Py_None) 24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dictitems = NULL; 24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (!PyIter_Check(dictitems)) { 24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Fifth element of " 24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "tuple returned by %s must be an iterator, not %s", 24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Os", fn, Py_TYPE(dictitems)->tp_name); 24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Protocol 2 special case: if callable's name is __newobj__, use 24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * NEWOBJ. This consumes a lot of code. 24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (use_newobj) { 24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = PyObject_GetAttr(callable, __name___str); 24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp == NULL) { 24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm use_newobj = 0; 24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm use_newobj = PyString_Check(temp) && 24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcmp(PyString_AS_STRING(temp), 24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "__newobj__") == 0; 24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (use_newobj) { 24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *cls; 24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newargtup; 24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int n, i; 24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Sanity checks. */ 24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyTuple_Size(argtup); 24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n < 1) { 24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, "__newobj__ arglist " 24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "is empty"); 24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cls = PyTuple_GET_ITEM(argtup, 0); 24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyObject_HasAttrString(cls, "__new__")) { 24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, "args[0] from " 24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "__newobj__ args has no __new__"); 24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX How could ob be NULL? */ 24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ob != NULL) { 24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob_dot_class; 24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ob_dot_class = PyObject_GetAttr(ob, __class___str); 24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ob_dot_class == NULL) { 24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches( 24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyExc_AttributeError)) 24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = ob_dot_class != cls; /* true iff a problem */ 24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(ob_dot_class); 24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i) { 24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, "args[0] from " 24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "__newobj__ args has the wrong class"); 24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Save the class and its __new__ arguments. */ 24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, cls, 0) < 0) 24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newargtup = PyTuple_New(n-1); /* argtup[1:] */ 24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newargtup == NULL) 24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 1; i < n; ++i) { 24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = PyTuple_GET_ITEM(argtup, i); 24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(temp); 24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(newargtup, i-1, temp); 24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = save(self, newargtup, 0); 24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(newargtup); 24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Add NEWOBJ opcode. */ 24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &newobj, 1) < 0) 24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Not using NEWOBJ. */ 24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, callable, 0) < 0 || 24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm save(self, argtup, 0) < 0 || 24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func(self, &reduce, 1) < 0) 24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Memoize. */ 25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX How can ob be NULL? */ 25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ob != NULL) { 25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (state && !PyDict_Check(state)) { 25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (put2(self, ob) < 0) 25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (put(self, ob) < 0) 25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (listitems && batch_list(self, listitems) < 0) 25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dictitems && batch_dict(self, dictitems) < 0) 25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (state) { 25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, state, 0) < 0 || 25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func(self, &build, 1) < 0) 25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsave(Picklerobject *self, PyObject *args, int pers_save) 25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTypeObject *type; 25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0; 25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int tmp; 25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_EnterRecursiveCall(" while pickling an object")) 25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!pers_save && self->pers_func) { 25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((tmp = save_pers(self, args, self->pers_func)) != 0) { 25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = tmp; 25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == Py_None) { 25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_none(self, args); 25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = Py_TYPE(args); 25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (type->tp_name[0]) { 25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'b': 25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == Py_False || args == Py_True) { 25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_bool(self, args); 25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'i': 25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyInt_Type) { 25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_int(self, args); 25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'l': 25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyLong_Type) { 25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_long(self, args); 25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'f': 25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyFloat_Type) { 25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_float(self, args); 25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 't': 25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyTuple_Type && PyTuple_Size(args) == 0) { 25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_tuple(self, args); 25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 's': 25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) { 25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_string(self, args, 0); 25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) { 25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_unicode(self, args, 0); 25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_REFCNT(args) > 1) { 26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_ob_id = PyLong_FromVoidPtr(args))) 26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItem(self->memo, py_ob_id)) { 26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (get(self, py_ob_id) < 0) 26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (type->tp_name[0]) { 26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 's': 26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyString_Type) { 26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_string(self, args, 1); 26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyUnicode_Type) { 26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_unicode(self, args, 1); 26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 't': 26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyTuple_Type) { 26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_tuple(self, args); 26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyType_Type) { 26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, NULL); 26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'l': 26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyList_Type) { 26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_list(self, args); 26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'd': 26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyDict_Type) { 26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_dict(self, args); 26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'i': 26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyInstance_Type) { 26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_inst(self, args); 26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'c': 26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyClass_Type) { 26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, NULL); 26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'f': 26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyFunction_Type) { 26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, NULL); 26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (res && PyErr_ExceptionMatches(PickleError)) { 26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* fall back to reduce */ 26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'b': 26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == &PyCFunction_Type) { 26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, NULL); 26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!pers_save && self->inst_pers_func) { 26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) { 26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = tmp; 26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_IsSubtype(type, &PyType_Type)) { 27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, NULL); 27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get a reduction callable, and call it. This may come from 27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * copy_reg.dispatch_table, the object's __reduce_ex__ method, 27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * or the object's __reduce__ method. 27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type); 27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (__reduce__ != NULL) { 27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(__reduce__); 27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(args); 27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, args); 27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = PyObject_Call(__reduce__, self->arg, NULL); 27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check for a __reduce_ex__ method. */ 27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __reduce__ = PyObject_GetAttr(args, __reduce_ex___str); 27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (__reduce__ != NULL) { 27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = PyInt_FromLong(self->proto); 27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (t != NULL) { 27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, t); 27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = NULL; 27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = PyObject_Call(__reduce__, 27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->arg, NULL); 27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_AttributeError)) 27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check for a __reduce__ method. */ 27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __reduce__ = PyObject_GetAttr(args, __reduce___str); 27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (__reduce__ != NULL) { 27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = PyObject_Call(__reduce__, 27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm empty_tuple, NULL); 27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(UnpickleableError, args); 27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (t == NULL) 27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(t)) { 27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_global(self, args, t); 27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(t)) { 27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(PicklingError, "Value returned by " 27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%s must be string or tuple", 27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "O", __reduce__); 27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = save_reduce(self, t, __reduce__, args); 27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_LeaveRecursiveCall(); 27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(py_ob_id); 27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(__reduce__); 27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(t); 27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdump(Picklerobject *self, PyObject *args) 27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char stop = STOP; 27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->proto >= 2) { 27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char bytes[2]; 27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bytes[0] = PROTO; 27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(self->proto >= 0 && self->proto < 256); 27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bytes[1] = (char)self->proto; 27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, bytes, 2) < 0) 27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (save(self, args, 0) < 0) 27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, &stop, 1) < 0) 27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_func(self, NULL, 0) < 0) 28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickle_clear_memo(Picklerobject *self, PyObject *args) 28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->memo) 28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_Clear(self->memo); 28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickle_getvalue(Picklerobject *self, PyObject *args) 28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int l, i, rsize, ssize, clear=1, lm; 28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long ik; 28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *k, *r; 28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s, *p, *have_get; 28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata *data; 28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Can be called by Python code or C code */ 28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear)) 28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check to make sure we are based on a list */ 28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! Pdata_Check(self->file)) { 28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, 28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Attempt to getvalue() a non-list-based pickler"); 28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* flush write buffer */ 28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (write_other(self, NULL, 0) < 0) return NULL; 28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data=(Pdata*)self->file; 28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l=data->length; 28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* set up an array to hold get/put status */ 28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lm = PyDict_Size(self->memo); 28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (lm < 0) return NULL; 28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lm++; 28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm have_get = malloc(lm); 28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (have_get == NULL) return PyErr_NoMemory(); 28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memset(have_get, 0, lm); 28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Scan for gets. */ 28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (rsize = 0, i = l; --i >= 0; ) { 28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = data->data[i]; 28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(k)) 28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rsize += PyString_GET_SIZE(k); 28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyInt_Check(k)) { /* put */ 28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ik = PyInt_AS_LONG((PyIntObject*)k); 28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ik >= lm || ik == 0) { 28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, 28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Invalid get data"); 28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (have_get[ik]) /* with matching get */ 28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rsize += ik < 256 ? 2 : 5; 28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (! (PyTuple_Check(k) && 28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_GET_SIZE(k) == 2 && 28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_Check((k = PyTuple_GET_ITEM(k, 0)))) 28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) { 28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, 28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Unexpected data in internal list"); 28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { /* put */ 28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ik = PyInt_AS_LONG((PyIntObject *)k); 28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ik >= lm || ik == 0) { 28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PicklingError, 28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Invalid get data"); 28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm have_get[ik] = 1; 28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rsize += ik < 256 ? 2 : 5; 28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Now generate the result */ 28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r = PyString_FromStringAndSize(NULL, rsize); 28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (r == NULL) goto err; 28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = PyString_AS_STRING((PyStringObject *)r); 28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < l; i++) { 28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = data->data[i]; 28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(k)) { 28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ssize = PyString_GET_SIZE(k); 28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ssize) { 28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p=PyString_AS_STRING((PyStringObject *)k); 29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--ssize >= 0) 29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = *p++; 29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyTuple_Check(k)) { /* get */ 29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ik = PyInt_AS_LONG((PyIntObject *) 29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_GET_ITEM(k, 0)); 29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ik < 256) { 29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = BINGET; 29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)(ik & 0xff); 29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = LONG_BINGET; 29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)(ik & 0xff); 29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 8) & 0xff); 29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 16) & 0xff); 29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 24) & 0xff); 29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { /* put */ 29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ik = PyInt_AS_LONG((PyIntObject*)k); 29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (have_get[ik]) { /* with matching get */ 29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ik < 256) { 29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = BINPUT; 29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)(ik & 0xff); 29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = LONG_BINPUT; 29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)(ik & 0xff); 29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 8) & 0xff); 29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 16) & 0xff); 29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = (int)((ik >> 24) & 0xff); 29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (clear) { 29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_Clear(self->memo); 29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(data, 0); 29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(have_get); 29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r; 29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(have_get); 29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_dump(Picklerobject *self, PyObject *args) 29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob; 29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int get=0; 29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get))) 29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dump(self, ob) < 0) 29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (get) return Pickle_getvalue(self, NULL); 29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX Why does dump() return self? */ 29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*)self; 29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMethodDef Pickler_methods[] = 29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"dump", (PyCFunction)Pickler_dump, METH_VARARGS, 29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("dump(object) -- " 29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Write an object in pickle format to the object's pickle stream")}, 29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS, 29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("clear_memo() -- Clear the picklers memo")}, 29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS, 29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("getvalue() -- Finish picking a list-based pickle")}, 29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} /* sentinel */ 29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Picklerobject * 29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnewPicklerobject(PyObject *file, int proto) 29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Picklerobject *self; 29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (proto < 0) 29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm proto = HIGHEST_PROTOCOL; 29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (proto > HIGHEST_PROTOCOL) { 29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; " 29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "the highest available protocol is %d", 29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm proto, HIGHEST_PROTOCOL); 29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self = PyObject_GC_New(Picklerobject, &Picklertype); 30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self == NULL) 30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->proto = proto; 30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->bin = proto > 0; 30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fp = NULL; 30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write = NULL; 30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->memo = NULL; 30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->arg = NULL; 30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->pers_func = NULL; 30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->inst_pers_func = NULL; 30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_buf = NULL; 30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast = 0; 30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_container = 0; 30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fast_memo = NULL; 30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = 0; 30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->dispatch_table = NULL; 30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->file = NULL; 30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (file) 30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(file); 30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm file = Pdata_New(); 30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (file == NULL) 30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->file = file; 30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self->memo = PyDict_New())) 30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyFile_Check(file)) { 30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fp = PyFile_AsFile(file); 30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fp == NULL) { 30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "I/O operation on closed file"); 30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func = write_file; 30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PycStringIO_OutputCheck(file)) { 30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func = write_cStringIO; 30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (file == Py_None) { 30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func = write_none; 30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_func = write_other; 30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! Pdata_Check(file)) { 30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write = PyObject_GetAttr(file, write_str); 30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->write) { 30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "argument must have 'write' " 30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute"); 30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE); 30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->write_buf == NULL) { 30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyEval_GetRestricted()) { 30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Restricted execution, get private tables */ 30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m = PyImport_ImportModule("copy_reg"); 30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str); 30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(m); 30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->dispatch_table == NULL) 30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->dispatch_table = dispatch_table; 30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(dispatch_table); 30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Track(self); 30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self; 30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(self); 30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_Pickler(PyObject *self, PyObject *args, PyObject *kwds) 30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"file", "protocol", NULL}; 30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *file = NULL; 30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int proto = 0; 30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX 30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The documented signature is Pickler(file, protocol=0), but this 31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * accepts Pickler() and Pickler(integer) too. The meaning then 31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * is clear as mud, undocumented, and not supported by pickle.py. 31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * I'm told Zope uses this, but I haven't traced into this code 31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * far enough to figure out what it means. 31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) { 31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm proto = 0; 31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler", 31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwlist, &file, &proto)) 31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)newPicklerobject(file, proto); 31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_dealloc(Picklerobject *self) 31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack(self); 31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->write); 31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->memo); 31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->fast_memo); 31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->arg); 31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->file); 31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->pers_func); 31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->inst_pers_func); 31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->dispatch_table); 31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMem_Free(self->write_buf); 31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(self)->tp_free((PyObject *)self); 31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_traverse(Picklerobject *self, visitproc visit, void *arg) 31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->write); 31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->memo); 31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->fast_memo); 31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->arg); 31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->file); 31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->pers_func); 31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->inst_pers_func); 31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->dispatch_table); 31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_clear(Picklerobject *self) 31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->write); 31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->memo); 31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->fast_memo); 31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->arg); 31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->file); 31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->pers_func); 31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->inst_pers_func); 31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->dispatch_table); 31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_get_pers_func(Picklerobject *p) 31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p->pers_func == NULL) 31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, "persistent_id"); 31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(p->pers_func); 31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return p->pers_func; 31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_set_pers_func(Picklerobject *p, PyObject *v) 31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute deletion is not supported"); 31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(p->pers_func); 31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p->pers_func = v; 31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_set_inst_pers_func(Picklerobject *p, PyObject *v) 31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute deletion is not supported"); 31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(p->inst_pers_func); 31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p->inst_pers_func = v; 31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_get_memo(Picklerobject *p) 32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p->memo == NULL) 32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, "memo"); 32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(p->memo); 32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return p->memo; 32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_set_memo(Picklerobject *p, PyObject *v) 32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute deletion is not supported"); 32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyDict_Check(v)) { 32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, "memo must be a dictionary"); 32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(p->memo); 32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p->memo = v; 32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPickler_get_error(Picklerobject *p) 32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* why is this an attribute on the Pickler? */ 32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(PicklingError); 32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PicklingError; 32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMemberDef Pickler_members[] = { 32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"binary", T_INT, offsetof(Picklerobject, bin)}, 32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"fast", T_INT, offsetof(Picklerobject, fast)}, 32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL} 32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyGetSetDef Pickler_getsets[] = { 32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"persistent_id", (getter)Pickler_get_pers_func, 32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (setter)Pickler_set_pers_func}, 32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func}, 32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo}, 32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"PicklingError", (getter)Pickler_get_error, NULL}, 32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL} 32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(Picklertype__doc__, 32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Objects that know how to pickle objects\n"); 32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Picklertype = { 32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) 32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cPickle.Pickler", /*tp_name*/ 32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(Picklerobject), /*tp_basicsize*/ 32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)Pickler_dealloc, /* tp_dealloc */ 32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_call */ 32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericGetAttr, /* tp_getattro */ 32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericSetAttr, /* tp_setattro */ 32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Picklertype__doc__, /* tp_doc */ 32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (traverseproc)Pickler_traverse, /* tp_traverse */ 32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (inquiry)Pickler_clear, /* tp_clear */ 32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_richcompare */ 32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pickler_methods, /* tp_methods */ 32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pickler_members, /* tp_members */ 32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pickler_getsets, /* tp_getset */ 32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfind_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) 32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *global = 0, *module; 32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fc) { 32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fc==Py_None) { 32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "Global and instance " 32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "pickles are not supported."); 32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyObject_CallFunctionObjArgs(fc, py_module_name, 32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_global_name, NULL); 32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module = PySys_GetObject("modules"); 33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (module == NULL) 33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module = PyDict_GetItem(module, py_module_name); 33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (module == NULL) { 33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module = PyImport_Import(py_module_name); 33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!module) 33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global = PyObject_GetAttr(module, py_global_name); 33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(module); 33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm global = PyObject_GetAttr(module, py_global_name); 33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return global; 33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmarker(Unpicklerobject *self) 33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->num_marks < 1) { 33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "could not find MARK"); 33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self->marks[--self->num_marks]; 33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_none(Unpicklerobject *self) 33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None, -1); 33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbad_readline(void) 33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "pickle data was truncated"); 33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_int(Unpicklerobject *self) 33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_int = 0; 33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *endptr, *s; 33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, res = -1; 33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l; 33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( s=pystrndup(s,len))) return -1; 33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = 0; 33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = strtol(s, &endptr, 0); 33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errno || (*endptr != '\n') || (endptr[1] != '\0')) { 33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Hm, maybe we've got something long. Let's try reading 33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm it as a Python long object. */ 33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = 0; 33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_int = PyLong_FromString(s, NULL, 0); 33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (py_int == NULL) { 33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "could not convert string to int"); 33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len == 3 && (l == 0 || l == 1)) { 33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_int = PyBool_FromLong(l))) goto finally; 33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_int = PyInt_FromLong(l))) goto finally; 33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_int, -1); 33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_bool(Unpicklerobject *self, PyObject *boolean) 33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(boolean == Py_True || boolean == Py_False); 33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, boolean, -1); 33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s contains x bytes of a little-endian integer. Return its value as a 33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian 33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * int, but when x is 4 it's a signed one. This is an historical source 33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of x-platform bugs. 34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic long 34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcalc_binint(char *s, int x) 34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char c; 34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l; 34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0, l = 0L; i < x; i++) { 34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[i]; 34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l |= (long)c << (i * 8); 34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_LONG > 4 34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) 34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * is signed, so on a box with longs bigger than 4 bytes we need 34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * to extend a BININT's sign bit to the full width. 34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == 4 && l & (1L << 31)) 34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l |= (~0L) << 32; 34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return l; 34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binintx(Unpicklerobject *self, char *s, int x) 34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_int = 0; 34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l; 34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = calc_binint(s, x); 34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_int = PyInt_FromLong(l))) 34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_int, -1); 34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binint(Unpicklerobject *self) 34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 4) < 0) 34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return load_binintx(self, s, 4); 34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binint1(Unpicklerobject *self) 34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) 34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return load_binintx(self, s, 1); 34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binint2(Unpicklerobject *self) 34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 2) < 0) 34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return load_binintx(self, s, 2); 34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_long(Unpicklerobject *self) 34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *l = 0; 34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *end, *s; 34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, res = -1; 34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( s=pystrndup(s,len))) return -1; 34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( l = PyLong_FromString(s, &end, 0))) 34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, l, -1); 34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 'size' bytes contain the # of bytes of little-endian 256's-complement 35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * data following. 35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_counted_long(Unpicklerobject *self, int size) 35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *nbytes; 35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char *pdata; 35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *along; 35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(size == 1 || size == 4); 35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->read_func(self, &nbytes, size); 35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) return -1; 35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = calc_binint(nbytes, size); 35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size < 0) { 35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Corrupt or hostile pickle -- we never write one like 35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * this. 35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "LONG pickle has negative " 35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "byte count"); 35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0) 35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm along = PyLong_FromLong(0L); 35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Read the raw little-endian bytes & convert. */ 35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->read_func(self, (char **)&pdata, size); 35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) return -1; 35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm along = _PyLong_FromByteArray(pdata, (size_t)size, 35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1 /* little endian */, 1 /* signed */); 35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (along == NULL) 35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, along, -1); 35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_float(Unpicklerobject *self) 35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_float = 0; 35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *endptr, *s; 35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, res = -1; 35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm double d; 35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( s=pystrndup(s,len))) return -1; 35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); 35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (d == -1.0 && PyErr_Occurred()) { 35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) { 35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "could not convert string to float"); 35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 35594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_float = PyFloat_FromDouble(d))) 35624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 35634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 35654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_float, -1); 35664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 35674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 35694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 35704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 35724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 35754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binfloat(Unpicklerobject *self) 35764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_float; 35784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm double x; 35794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 35804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &p, 8) < 0) 35824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 35834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = _PyFloat_Unpack8((unsigned char *)p, 0); 35854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == -1.0 && PyErr_Occurred()) 35864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 35874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_float = PyFloat_FromDouble(x); 35894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (py_float == NULL) 35904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 35914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_float, -1); 35934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 35944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 35974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_string(Unpicklerobject *self) 35984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *str = 0; 36004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, res = -1; 36014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s, *p; 36024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 36044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 36054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( s=pystrndup(s,len))) return -1; 36064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Strip outermost quotes */ 36094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (s[len-1] <= ' ') 36104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len--; 36114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(s[0]=='"' && s[len-1]=='"'){ 36124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[len-1] = '\0'; 36134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = s + 1 ; 36144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len -= 2; 36154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if(s[0]=='\'' && s[len-1]=='\''){ 36164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[len-1] = '\0'; 36174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = s + 1 ; 36184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len -= 2; 36194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 36204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto insecure; 36214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /********************************************/ 36224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyString_DecodeEscape(p, len, NULL, 0, NULL); 36244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 36254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str) { 36264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, str, -1); 36274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 36284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 36294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 36304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm insecure: 36324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(s); 36334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError,"insecure string pickle"); 36344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 36354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 36364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 36394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binstring(Unpicklerobject *self) 36404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 36414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_string = 0; 36424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l; 36434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 36444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 4) < 0) return -1; 36464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = calc_binint(s, 4); 36484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (l < 0) { 36494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Corrupt or hostile pickle -- we never write one like 36504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * this. 36514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 36524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, 36534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "BINSTRING pickle has negative byte count"); 36544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 36554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 36564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, l) < 0) 36584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 36594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_string = PyString_FromStringAndSize(s, l))) 36614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 36624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_string, -1); 36644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 36654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 36664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 36694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_short_binstring(Unpicklerobject *self) 36704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 36714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_string = 0; 36724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char l; 36734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 36744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) 36764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 36774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = (unsigned char)s[0]; 36794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, l) < 0) return -1; 36814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_string = PyString_FromStringAndSize(s, l))) return -1; 36834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, py_string, -1); 36854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 36864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 36874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 36904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 36914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_unicode(Unpicklerobject *self) 36924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 36934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *str = 0; 36944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, res = -1; 36954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 36964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 36984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 1) return bad_readline(); 36994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))) 37014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 37024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, str, -1); 37044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 37074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 37084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 37104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 37134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binunicode(Unpicklerobject *self) 37154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *unicode; 37174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long l; 37184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 37194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 4) < 0) return -1; 37214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = calc_binint(s, 4); 37234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (l < 0) { 37244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Corrupt or hostile pickle -- we never write one like 37254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * this. 37264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 37274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, 37284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "BINUNICODE pickle has negative byte count"); 37294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 37304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 37314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, l) < 0) 37334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 37344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL))) 37364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 37374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, unicode, -1); 37394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 37424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_tuple(Unpicklerobject *self) 37464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup; 37484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 37494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 37514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( tup=Pdata_popTuple(self->stack, i))) return -1; 37524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, tup, -1); 37534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_counted_tuple(Unpicklerobject *self, int len) 37584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup = PyTuple_New(len); 37604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tup == NULL) 37624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 37634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--len >= 0) { 37654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *element; 37664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, element); 37684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (element == NULL) 37694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 37704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(tup, len, element); 37714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 37724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, tup, -1); 37734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_empty_list(Unpicklerobject *self) 37784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *list; 37804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( list=PyList_New(0))) return -1; 37824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, list, -1); 37834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_empty_dict(Unpicklerobject *self) 37884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict; 37904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( dict=PyDict_New())) return -1; 37924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, dict, -1); 37934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 37944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 37984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_list(Unpicklerobject *self) 37994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *list = 0; 38014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 38024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 38044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( list=Pdata_popList(self->stack, i))) return -1; 38054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, list, -1); 38064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 38074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 38084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 38104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_dict(Unpicklerobject *self) 38114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict, *key, *value; 38134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, j, k; 38144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 38164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j=self->stack->length; 38174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( dict = PyDict_New())) return -1; 38194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (k = i+1; k < j; k += 2) { 38214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key =self->stack->data[k-1]; 38224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[k ]; 38234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItem(dict, key, value) < 0) { 38244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(dict); 38254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 38264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, i); 38294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, dict, -1); 38304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 38314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 38324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 38344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmInstance_New(PyObject *cls, PyObject *args) 38354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *r = 0; 38374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyClass_Check(cls)) { 38394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int l; 38404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((l=PyObject_Size(args)) < 0) goto err; 38424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( l )) { 38434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *__getinitargs__; 38444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __getinitargs__ = PyObject_GetAttr(cls, 38464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __getinitargs___str); 38474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!__getinitargs__) { 38484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* We have a class with no __getinitargs__, 38494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm so bypass usual construction */ 38504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *inst; 38514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 38534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( inst=PyInstance_NewRaw(cls, NULL))) 38544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 38554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return inst; 38564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(__getinitargs__); 38584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((r=PyInstance_New(cls, args, NULL))) return r; 38614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else goto err; 38624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((r=PyObject_CallObject(cls, args))) return r; 38654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 38674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 38684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tp, *v, *tb, *tmp_value; 38694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&tp, &v, &tb); 38714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp_value = v; 38724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* NULL occurs when there was a KeyboardInterrupt */ 38734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tmp_value == NULL) 38744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp_value = Py_None; 38754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((r = PyTuple_Pack(3, tmp_value, cls, args))) { 38764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 38774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v=r; 38784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Restore(tp,v,tb); 38804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 38824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 38834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 38864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_obj(Unpicklerobject *self) 38874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *class, *tup, *obj=0; 38894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 38904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 38924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1; 38934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, class); 38944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (class) { 38954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = Instance_New(class, tup); 38964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(class); 38974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 38994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! obj) return -1; 39014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, obj, -1); 39024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 39034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 39074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_inst(Unpicklerobject *self) 39084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tup, *class=0, *obj=0, *module_name, *class_name; 39104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, len; 39114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 39124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 39144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 39164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 39174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_name = PyString_FromStringAndSize(s, len - 1); 39184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!module_name) return -1; 39194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) >= 0) { 39214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 39224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((class_name = PyString_FromStringAndSize(s, len - 1))) { 39234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class = find_class(module_name, class_name, 39244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->find_class); 39254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(class_name); 39264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(module_name); 39294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! class) return -1; 39314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((tup=Pdata_popTuple(self->stack, i))) { 39334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = Instance_New(class, tup); 39344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tup); 39354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(class); 39374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! obj) return -1; 39394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, obj, -1); 39414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 39424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 39454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_newobj(Unpicklerobject *self) 39464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *args = NULL; 39484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *clsraw = NULL; 39494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTypeObject *cls; /* clsraw cast to its true type */ 39504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj; 39514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Stack is ... cls argtuple, and we want to call 39534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * cls.__new__(cls, *argtuple). 39544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 39554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, args); 39564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == NULL) goto Fail; 39574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyTuple_Check(args)) { 39584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg " 39594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "tuple."); 39604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto Fail; 39614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, clsraw); 39644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cls = (PyTypeObject *)clsraw; 39654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (cls == NULL) goto Fail; 39664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyType_Check(cls)) { 39674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "NEWOBJ class argument " 39684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isn't a type object"); 39694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto Fail; 39704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (cls->tp_new == NULL) { 39724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "NEWOBJ class argument " 39734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "has NULL tp_new"); 39744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto Fail; 39754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Call __new__. */ 39784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = cls->tp_new(cls, args, NULL); 39794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) goto Fail; 39804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 39824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(clsraw); 39834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, obj, -1); 39844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 39854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Fail: 39874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(args); 39884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(clsraw); 39894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 39904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 39934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_global(Unpicklerobject *self) 39944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *class = 0, *module_name = 0, *class_name = 0; 39964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 39974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 39984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 40004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 40014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_name = PyString_FromStringAndSize(s, len - 1); 40024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!module_name) return -1; 40034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) >= 0) { 40054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) { 40064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(module_name); 40074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return bad_readline(); 40084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((class_name = PyString_FromStringAndSize(s, len - 1))) { 40104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class = find_class(module_name, class_name, 40114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->find_class); 40124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(class_name); 40134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(module_name); 40164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! class) return -1; 40184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, class, -1); 40194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 40204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 40214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 40244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_persid(Unpicklerobject *self) 40254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 40264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pid = 0; 40274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 40284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 40294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->pers_func) { 40314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 40324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 40334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pid = PyString_FromStringAndSize(s, len - 1); 40354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!pid) return -1; 40364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Check(self->pers_func)) { 40384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Append(self->pers_func, pid) < 0) { 40394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(pid); 40404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 40414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 40444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, pid); 40454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 40464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pid = PyObject_Call(self->pers_func, self->arg, 40474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL); 40484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 40494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! pid) return -1; 40534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, pid, -1); 40554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 40564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 40584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, 40594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "A load persistent id instruction was encountered,\n" 40604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "but no persistent_load function was specified."); 40614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 40624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 40644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 40664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binpersid(Unpicklerobject *self) 40674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 40684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pid = 0; 40694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->pers_func) { 40714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, pid); 40724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! pid) return -1; 40734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Check(self->pers_func)) { 40754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Append(self->pers_func, pid) < 0) { 40764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(pid); 40774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 40784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 40814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, pid); 40824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 40834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pid = PyObject_Call(self->pers_func, self->arg, 40844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL); 40854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 40864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! pid) return -1; 40884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, pid, -1); 40914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 40924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 40944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, 40954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "A load persistent id instruction was encountered,\n" 40964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "but no persistent_load function was specified."); 40974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 40984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 41034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_pop(Unpicklerobject *self) 41044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len = self->stack->length; 41064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Note that we split the (pickle.py) stack into two stacks, 41084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an object stack and a mark stack. We have to be clever and 41094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pop the right one. We do this by looking at the top of the 41104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mark stack first, and only signalling a stack underflow if 41114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the object stack is empty and the mark stack doesn't match 41124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm our expectations. 41134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 41144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) { 41154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->num_marks--; 41164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (len > 0) { 41174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len--; 41184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(self->stack->data[len]); 41194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->stack->length = len; 41204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 41214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stackUnderflow(); 41224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 41244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 41284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_pop_mark(Unpicklerobject *self) 41294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 41314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) 41334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 41344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, i); 41364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 41384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 41424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_dup(Unpicklerobject *self) 41434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *last; 41454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 41464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->stack->length) <= 0) return stackUnderflow(); 41484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm last=self->stack->data[len-1]; 41494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(last); 41504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, last, -1); 41514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 41524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 41564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_get(Unpicklerobject *self) 41574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_str = 0, *value = 0; 41594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 41604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 41614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int rc; 41624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((len = self->readline_func(self, &s)) < 0) return -1; 41644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 2) return bad_readline(); 41654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1; 41674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = PyDict_GetItem(self->memo, py_str); 41694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! value) { 41704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(BadPickleGet, py_str); 41714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = -1; 41724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 41744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, value, -1); 41754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = 0; 41764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_str); 41794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return rc; 41804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 41844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binget(Unpicklerobject *self) 41854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_key = 0, *value = 0; 41874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char key; 41884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 41894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int rc; 41904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) return -1; 41924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = (unsigned char)s[0]; 41944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_key = PyInt_FromLong((long)key))) return -1; 41954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = PyDict_GetItem(self->memo, py_key); 41974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! value) { 41984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(BadPickleGet, py_key); 41994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = -1; 42004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 42024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, value, -1); 42034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = 0; 42044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_key); 42074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return rc; 42084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 42094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 42124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_long_binget(Unpicklerobject *self) 42134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 42144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_key = 0, *value = 0; 42154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char c; 42164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 42174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long key; 42184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int rc; 42194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 4) < 0) return -1; 42214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[0]; 42234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = (long)c; 42244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[1]; 42254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 8; 42264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[2]; 42274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 16; 42284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[3]; 42294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 24; 42304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_key = PyInt_FromLong((long)key))) return -1; 42324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = PyDict_GetItem(self->memo, py_key); 42344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! value) { 42354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(BadPickleGet, py_key); 42364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = -1; 42374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 42394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, value, -1); 42404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rc = 0; 42414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_key); 42444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return rc; 42454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 42464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Push an object from the extension registry (EXT[124]). nbytes is 42484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the number of bytes following the opcode, holding the index (code) value. 42494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 42504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 42514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_extension(Unpicklerobject *self, int nbytes) 42524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 42534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *codebytes; /* the nbytes bytes after the opcode */ 42544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long code; /* calc_binint returns long */ 42554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_code; /* code as a Python int */ 42564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj; /* the object to push */ 42574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *pair; /* (module_name, class_name) */ 42584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *module_name, *class_name; 42594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(nbytes == 1 || nbytes == 2 || nbytes == 4); 42614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &codebytes, nbytes) < 0) return -1; 42624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = calc_binint(codebytes, nbytes); 42634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (code <= 0) { /* note that 0 is forbidden */ 42644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Corrupt or hostile pickle. */ 42654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "EXT specifies code <= 0"); 42664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 42674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Look for the code in the cache. */ 42704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm py_code = PyInt_FromLong(code); 42714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (py_code == NULL) return -1; 42724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = PyDict_GetItem(extension_cache, py_code); 42734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj != NULL) { 42744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Bingo. */ 42754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_code); 42764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, obj, -1); 42774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 42784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Look up the (module_name, class_name) pair. */ 42814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pair = PyDict_GetItem(inverted_registry, py_code); 42824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (pair == NULL) { 42834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_code); 42844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, "unregistered extension " 42854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "code %ld", code); 42864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 42874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Since the extension registry is manipulable via Python code, 42894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * confirm that pair is really a 2-tuple of strings. 42904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 42914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || 42924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || 42934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { 42944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_code); 42954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " 42964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isn't a 2-tuple of strings", code); 42974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 42984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Load the object. */ 43004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = find_class(module_name, class_name, self->find_class); 43014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) { 43024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_code); 43034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 43044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Cache code -> obj. */ 43064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = PyDict_SetItem(extension_cache, py_code, obj); 43074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_code); 43084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (code < 0) { 43094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 43104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 43114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, obj, -1); 43134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 43144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 43154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 43174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_put(Unpicklerobject *self) 43184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 43194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_str = 0, *value = 0; 43204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, l; 43214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 43224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((l = self->readline_func(self, &s)) < 0) return -1; 43244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (l < 2) return bad_readline(); 43254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( len=self->stack->length )) return stackUnderflow(); 43264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1; 43274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[len-1]; 43284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l=PyDict_SetItem(self->memo, py_str, value); 43294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_str); 43304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return l; 43314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 43324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 43354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_binput(Unpicklerobject *self) 43364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 43374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_key = 0, *value = 0; 43384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char key; 43394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 43404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 43414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) return -1; 43434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( (len=self->stack->length) > 0 )) return stackUnderflow(); 43444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = (unsigned char)s[0]; 43464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_key = PyInt_FromLong((long)key))) return -1; 43484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[len-1]; 43494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len=PyDict_SetItem(self->memo, py_key, value); 43504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_key); 43514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len; 43524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 43534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 43564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_long_binput(Unpicklerobject *self) 43574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 43584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *py_key = 0, *value = 0; 43594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long key; 43604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char c; 43614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 43624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; 43634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 4) < 0) return -1; 43654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( len=self->stack->length )) return stackUnderflow(); 43664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[0]; 43684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = (long)c; 43694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[1]; 43704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 8; 43714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[2]; 43724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 16; 43734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (unsigned char)s[3]; 43744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key |= (long)c << 24; 43754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( py_key = PyInt_FromLong(key))) return -1; 43774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[len-1]; 43784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len=PyDict_SetItem(self->memo, py_key, value); 43794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(py_key); 43804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len; 43814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 43824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 43854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_append(Unpicklerobject *self, int x) 43864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 43874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *value = 0, *list = 0, *append_method = 0; 43884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, i; 43894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len=self->stack->length; 43914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( len >= x && x > 0 )) return stackUnderflow(); 43924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing to do */ 43934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len==x) return 0; 43944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list=self->stack->data[x-1]; 43964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 43974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Check(list)) { 43984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *slice; 43994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int list_len; 44004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slice=Pdata_popList(self->stack, x); 44024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! slice) return -1; 44034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list_len = PyList_GET_SIZE(list); 44044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i=PyList_SetSlice(list, list_len, list_len, slice); 44054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(slice); 44064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return i; 44074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 44094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( append_method = PyObject_GetAttr(list, append_str))) 44114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 44124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = x; i < len; i++) { 44144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *junk; 44154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[i]; 44174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm junk=0; 44184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, value); 44194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 44204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm junk = PyObject_Call(append_method, self->arg, 44214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm NULL); 44224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 44234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! junk) { 44254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, i+1); 44264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->stack->length=x; 44274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(append_method); 44284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 44294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(junk); 44314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->stack->length=x; 44334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(append_method); 44344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 44374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_append(Unpicklerobject *self) 44424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_append(self, self->stack->length - 1); 44444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_appends(Unpicklerobject *self) 44494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_append(self, marker(self)); 44514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_setitems(Unpicklerobject *self, int x) 44564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *value = 0, *key = 0, *dict = 0; 44584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len, i, r=0; 44594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( (len=self->stack->length) >= x 44614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm && x > 0 )) return stackUnderflow(); 44624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict=self->stack->data[x-1]; 44644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = x+1; i < len; i += 2) { 44664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key =self->stack->data[i-1]; 44674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value=self->stack->data[i ]; 44684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetItem(dict, key, value) < 0) { 44694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r=-1; 44704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 44714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, x); 44754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r; 44774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_setitem(Unpicklerobject *self) 44824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_setitems(self, self->stack->length - 2); 44844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_setitems(Unpicklerobject *self) 44884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_setitems(self, marker(self)); 44904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 44914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 44944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_build(Unpicklerobject *self) 44954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 44964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *state, *inst, *slotstate; 44974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *__setstate__; 44984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *d_key, *d_value; 44994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 45004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int res = -1; 45014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Stack is ... instance, state. We want to leave instance at 45034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the stack top, possibly mutated via instance.__setstate__(state). 45044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 45054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->stack->length < 2) 45064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stackUnderflow(); 45074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, state); 45084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (state == NULL) 45094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 45104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inst = self->stack->data[self->stack->length - 1]; 45114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __setstate__ = PyObject_GetAttr(inst, __setstate___str); 45134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (__setstate__ != NULL) { 45144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *junk = NULL; 45154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The explicit __setstate__ is responsible for everything. */ 45174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARG_TUP(self, state); 45184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->arg) { 45194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm junk = PyObject_Call(__setstate__, self->arg, NULL); 45204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FREE_ARG_TUP(self); 45214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(__setstate__); 45234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (junk == NULL) 45244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 45254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(junk); 45264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 45274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyErr_ExceptionMatches(PyExc_AttributeError)) 45294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 45304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 45314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* A default __setstate__. First see whether state embeds a 45334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * slot state dict too (a proto 2 addition). 45344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 45354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(state) && PyTuple_Size(state) == 2) { 45364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = state; 45374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm state = PyTuple_GET_ITEM(temp, 0); 45384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slotstate = PyTuple_GET_ITEM(temp, 1); 45394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(state); 45404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(slotstate); 45414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 45424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 45444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slotstate = NULL; 45454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Set inst.__dict__ from the state dict (if any). */ 45474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (state != Py_None) { 45484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict; 45494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyDict_Check(state)) { 45504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "state is not a " 45514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "dictionary"); 45524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 45534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict = PyObject_GetAttr(inst, __dict___str); 45554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict == NULL) 45564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 45574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 45594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (PyDict_Next(state, &i, &d_key, &d_value)) { 45604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* normally the keys for instance attributes are 45614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interned. we should try to do that here. */ 45624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(d_key); 45634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CheckExact(d_key)) 45644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&d_key); 45654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetItem(dict, d_key, d_value) < 0) { 45664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(d_key); 45674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 45684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(d_key); 45704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(dict); 45724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Also set instance attributes from the slotstate dict (if any). */ 45754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (slotstate != NULL) { 45764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyDict_Check(slotstate)) { 45774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(UnpicklingError, "slot state is not " 45784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "a dictionary"); 45794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 45804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 45824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { 45834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetAttr(inst, d_key, d_value) < 0) 45844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 45854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = 0; 45884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 45904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(state); 45914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(slotstate); 45924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 45934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 45944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 45964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 45974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_mark(Unpicklerobject *self) 45984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 45994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int s; 46004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Note that we split the (pickle.py) stack into two stacks, an 46024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm object stack and a mark stack. Here we push a mark onto the 46034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mark stack. 46044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 46054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((self->num_marks + 1) >= self->marks_size) { 46074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int *marks; 46084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s=self->marks_size+20; 46094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s <= self->num_marks) s=self->num_marks + 1; 46104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->marks == NULL) 46114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm marks=(int *)malloc(s * sizeof(int)); 46124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 46134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm marks=(int *)realloc(self->marks, 46144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s * sizeof(int)); 46154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!marks) { 46164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 46174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 46184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->marks = marks; 46204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->marks_size = s; 46214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->marks[self->num_marks++] = self->stack->length; 46244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 46264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 46274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 46294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_reduce(Unpicklerobject *self) 46304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 46314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *callable = 0, *arg_tup = 0, *ob = 0; 46324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, arg_tup); 46344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! arg_tup) return -1; 46354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, callable); 46364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (callable) { 46374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ob = Instance_New(callable, arg_tup); 46384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(callable); 46394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(arg_tup); 46414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! ob) return -1; 46434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_PUSH(self->stack, ob, -1); 46454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 46464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 46474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Just raises an error if we don't know the protocol specified. PROTO 46494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * is the first opcode for protocols >= 2. 46504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 46514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 46524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload_proto(Unpicklerobject *self) 46534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 46544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 46554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *protobyte; 46564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = self->read_func(self, &protobyte, 1); 46584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 46594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 46604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = calc_binint(protobyte, 1); 46624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* No point checking for < 0, since calc_binint returns an unsigned 46634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * int when chewing on 1 byte. 46644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 46654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(i >= 0); 46664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i <= HIGHEST_PROTOCOL) 46674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 46684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i); 46704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 46714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 46724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 46744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmload(Unpicklerobject *self) 46754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 46764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *err = 0, *val = 0; 46774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 46784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->num_marks = 0; 46804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->stack->length) Pdata_clear(self->stack, 0); 46814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (1) { 46834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) 46844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 46854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (s[0]) { 46874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NONE: 46884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_none(self) < 0) 46894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 46904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 46914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT: 46934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint(self) < 0) 46944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 46954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 46964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT1: 46984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint1(self) < 0) 46994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT2: 47034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint2(self) < 0) 47044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case INT: 47084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_int(self) < 0) 47094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG: 47134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long(self) < 0) 47144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG1: 47184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_long(self, 1) < 0) 47194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG4: 47234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_long(self, 4) < 0) 47244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case FLOAT: 47284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_float(self) < 0) 47294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINFLOAT: 47334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binfloat(self) < 0) 47344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINSTRING: 47384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binstring(self) < 0) 47394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SHORT_BINSTRING: 47434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_short_binstring(self) < 0) 47444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case STRING: 47484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_string(self) < 0) 47494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 47534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case UNICODE: 47544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_unicode(self) < 0) 47554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINUNICODE: 47594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binunicode(self) < 0) 47604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 47634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_TUPLE: 47654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 0) < 0) 47664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE1: 47704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 1) < 0) 47714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE2: 47754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 2) < 0) 47764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE3: 47804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 3) < 0) 47814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE: 47854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_tuple(self) < 0) 47864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_LIST: 47904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_empty_list(self) < 0) 47914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LIST: 47954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_list(self) < 0) 47964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 47974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 47984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_DICT: 48004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_empty_dict(self) < 0) 48014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case DICT: 48054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_dict(self) < 0) 48064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case OBJ: 48104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_obj(self) < 0) 48114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case INST: 48154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_inst(self) < 0) 48164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWOBJ: 48204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_newobj(self) < 0) 48214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case GLOBAL: 48254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_global(self) < 0) 48264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case APPEND: 48304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_append(self) < 0) 48314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case APPENDS: 48354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_appends(self) < 0) 48364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BUILD: 48404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_build(self) < 0) 48414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case DUP: 48454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_dup(self) < 0) 48464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINGET: 48504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binget(self) < 0) 48514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG_BINGET: 48554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long_binget(self) < 0) 48564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case GET: 48604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_get(self) < 0) 48614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT1: 48654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_extension(self, 1) < 0) 48664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT2: 48704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_extension(self, 2) < 0) 48714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT4: 48754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_extension(self, 4) < 0) 48764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case MARK: 48794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_mark(self) < 0) 48804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINPUT: 48844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binput(self) < 0) 48854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG_BINPUT: 48894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long_binput(self) < 0) 48904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PUT: 48944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_put(self) < 0) 48954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 48974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 48984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case POP: 48994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_pop(self) < 0) 49004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case POP_MARK: 49044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_pop_mark(self) < 0) 49054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SETITEM: 49094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_setitem(self) < 0) 49104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SETITEMS: 49144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_setitems(self) < 0) 49154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case STOP: 49194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PERSID: 49224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_persid(self) < 0) 49234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINPERSID: 49274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binpersid(self) < 0) 49284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case REDUCE: 49324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_reduce(self) < 0) 49334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PROTO: 49374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_proto(self) < 0) 49384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWTRUE: 49424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_bool(self, Py_True) < 0) 49434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWFALSE: 49474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_bool(self, Py_False) < 0) 49484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 49504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '\0': 49524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* end of file */ 49534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 49544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 49574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(UnpicklingError, 49584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "invalid load key, '%s'.", 49594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "c", s[0]); 49604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 49614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 49624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 49644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 49654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((err = PyErr_Occurred())) { 49674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == PyExc_EOFError) { 49684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 49694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 49704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 49714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 49724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, val); 49744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return val; 49754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 49764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* No-load functions to support noload, which is used to 49794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm find persistent references. */ 49804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 49824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_obj(Unpicklerobject *self) 49834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 49844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 49854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 49874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pdata_clear(self->stack, i+1); 49884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 49894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 49924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_inst(Unpicklerobject *self) 49934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 49944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 49954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 49964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 49974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 49984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, i); 49994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->readline_func(self, &s) < 0) return -1; 50004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->readline_func(self, &s) < 0) return -1; 50014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None, -1); 50024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_newobj(Unpicklerobject *self) 50074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj; 50094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, obj); /* pop argtuple */ 50114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) return -1; 50124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 50134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, obj); /* pop cls */ 50154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) return -1; 50164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 50174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None, -1); 50194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_global(Unpicklerobject *self) 50244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 50264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->readline_func(self, &s) < 0) return -1; 50284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->readline_func(self, &s) < 0) return -1; 50294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None,-1); 50304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_reduce(Unpicklerobject *self) 50354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->stack->length < 2) return stackUnderflow(); 50384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, self->stack->length-2); 50394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None,-1); 50404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_build(Unpicklerobject *self) { 50454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->stack->length < 1) return stackUnderflow(); 50474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, self->stack->length-1); 50484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_extension(Unpicklerobject *self, int nbytes) 50534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *codebytes; 50554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(nbytes == 1 || nbytes == 2 || nbytes == 4); 50574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &codebytes, nbytes) < 0) return -1; 50584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_APPEND(self->stack, Py_None, -1); 50594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 50604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_append(Unpicklerobject *self) 50644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pdata_clear(self->stack, self->stack->length - 1); 50664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_appends(Unpicklerobject *self) 50704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 50724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 50734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pdata_clear(self->stack, i); 50744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_setitem(Unpicklerobject *self) 50784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pdata_clear(self->stack, self->stack->length - 2); 50804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 50834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload_setitems(Unpicklerobject *self) 50844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 50864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((i = marker(self)) < 0) return -1; 50874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pdata_clear(self->stack, i); 50884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 50894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 50914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnoload(Unpicklerobject *self) 50924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 50934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *err = 0, *val = 0; 50944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 50954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->num_marks = 0; 50974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Pdata_clear(self->stack, 0); 50984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 50994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (1) { 51004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->read_func(self, &s, 1) < 0) 51014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (s[0]) { 51044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NONE: 51054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_none(self) < 0) 51064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT: 51104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint(self) < 0) 51114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT1: 51154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint1(self) < 0) 51164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BININT2: 51204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binint2(self) < 0) 51214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case INT: 51254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_int(self) < 0) 51264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG: 51304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long(self) < 0) 51314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG1: 51354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_long(self, 1) < 0) 51364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG4: 51404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_long(self, 4) < 0) 51414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case FLOAT: 51454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_float(self) < 0) 51464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINFLOAT: 51504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binfloat(self) < 0) 51514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINSTRING: 51554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binstring(self) < 0) 51564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SHORT_BINSTRING: 51604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_short_binstring(self) < 0) 51614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case STRING: 51654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_string(self) < 0) 51664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 51704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case UNICODE: 51714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_unicode(self) < 0) 51724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINUNICODE: 51764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binunicode(self) < 0) 51774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 51804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_TUPLE: 51824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 0) < 0) 51834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE1: 51874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 1) < 0) 51884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE2: 51924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 2) < 0) 51934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 51954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 51964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE3: 51974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_counted_tuple(self, 3) < 0) 51984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 51994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case TUPLE: 52024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_tuple(self) < 0) 52034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_LIST: 52074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_empty_list(self) < 0) 52084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LIST: 52124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_list(self) < 0) 52134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EMPTY_DICT: 52174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_empty_dict(self) < 0) 52184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case DICT: 52224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_dict(self) < 0) 52234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case OBJ: 52274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_obj(self) < 0) 52284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case INST: 52324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_inst(self) < 0) 52334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWOBJ: 52374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_newobj(self) < 0) 52384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case GLOBAL: 52424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_global(self) < 0) 52434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case APPEND: 52474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_append(self) < 0) 52484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case APPENDS: 52524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_appends(self) < 0) 52534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BUILD: 52574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_build(self) < 0) 52584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case DUP: 52624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_dup(self) < 0) 52634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINGET: 52674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binget(self) < 0) 52684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG_BINGET: 52724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long_binget(self) < 0) 52734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case GET: 52774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_get(self) < 0) 52784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT1: 52824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_extension(self, 1) < 0) 52834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT2: 52874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_extension(self, 2) < 0) 52884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case EXT4: 52924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_extension(self, 4) < 0) 52934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 52954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 52964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case MARK: 52974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_mark(self) < 0) 52984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 52994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINPUT: 53024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binput(self) < 0) 53034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case LONG_BINPUT: 53074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_long_binput(self) < 0) 53084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PUT: 53124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_put(self) < 0) 53134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case POP: 53174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_pop(self) < 0) 53184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case POP_MARK: 53224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_pop_mark(self) < 0) 53234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SETITEM: 53274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_setitem(self) < 0) 53284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SETITEMS: 53324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_setitems(self) < 0) 53334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case STOP: 53374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PERSID: 53404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_persid(self) < 0) 53414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case BINPERSID: 53454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_binpersid(self) < 0) 53464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case REDUCE: 53504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (noload_reduce(self) < 0) 53514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case PROTO: 53554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_proto(self) < 0) 53564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWTRUE: 53604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_bool(self, Py_True) < 0) 53614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case NEWFALSE: 53654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (load_bool(self, Py_False) < 0) 53664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 53684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 53694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_ErrFormat(UnpicklingError, 53704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "invalid load key, '%s'.", 53714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "c", s[0]); 53724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 53734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 53744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 53764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 53774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((err = PyErr_Occurred())) { 53794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == PyExc_EOFError) { 53804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_EOFError); 53814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 53824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 53834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 53844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PDATA_POP(self->stack, val); 53864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return val; 53874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 53884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 53914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_load(Unpicklerobject *self, PyObject *unused) 53924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 53934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return load(self); 53944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 53954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 53964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 53974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_noload(Unpicklerobject *self, PyObject *unused) 53984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 53994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return noload(self); 54004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 54014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMethodDef Unpickler_methods[] = { 54044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"load", (PyCFunction)Unpickler_load, METH_NOARGS, 54054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("load() -- Load a pickle") 54064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm }, 54074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS, 54084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR( 54094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "noload() -- not load a pickle, but go through most of the motions\n" 54104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 54114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "This function can be used to read past a pickle without instantiating\n" 54124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "any objects or importing any modules. It can also be used to find all\n" 54134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "persistent references without instantiating any objects or importing\n" 54144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "any modules.\n") 54154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm }, 54164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} /* sentinel */ 54174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 54184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Unpicklerobject * 54214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnewUnpicklerobject(PyObject *f) 54224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 54234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unpicklerobject *self; 54244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype))) 54264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 54274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->file = NULL; 54294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->arg = NULL; 54304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->stack = (Pdata*)Pdata_New(); 54314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->pers_func = NULL; 54324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->last_string = NULL; 54334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->marks = NULL; 54344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->num_marks = 0; 54354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->marks_size = 0; 54364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->buf_size = 0; 54374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->read = NULL; 54384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->readline = NULL; 54394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->find_class = NULL; 54404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( self->memo = PyDict_New())) 54424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 54434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->stack) 54454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 54464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(f); 54484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->file = f; 54494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Set read, readline based on type of f */ 54514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyFile_Check(f)) { 54524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fp = PyFile_AsFile(f); 54534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->fp == NULL) { 54544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 54554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "I/O operation on closed file"); 54564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 54574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 54584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->read_func = read_file; 54594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->readline_func = readline_file; 54604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 54614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PycStringIO_InputCheck(f)) { 54624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fp = NULL; 54634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->read_func = read_cStringIO; 54644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->readline_func = readline_cStringIO; 54654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 54664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 54674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->fp = NULL; 54694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->read_func = read_other; 54704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->readline_func = readline_other; 54714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( (self->readline = PyObject_GetAttr(f, readline_str)) && 54734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (self->read = PyObject_GetAttr(f, read_str)))) { 54744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 54754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString( PyExc_TypeError, 54764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "argument must have 'read' and " 54774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "'readline' attributes" ); 54784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto err; 54794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 54804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 54814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Track(self); 54824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self; 54844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err: 54864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF((PyObject *)self); 54874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 54884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 54894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 54924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_Unpickler(PyObject *self, PyObject *file) 54934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 54944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)newUnpicklerobject(file); 54954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 54964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 54994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_dealloc(Unpicklerobject *self) 55004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 55014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack((PyObject *)self); 55024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->readline); 55034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->read); 55044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->file); 55054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->memo); 55064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->stack); 55074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->pers_func); 55084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->arg); 55094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->last_string); 55104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->find_class); 55114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->marks) { 55134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(self->marks); 55144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (self->buf_size) { 55174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(self->buf); 55184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(self)->tp_free((PyObject *)self); 55214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 55224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 55244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg) 55254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 55264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->readline); 55274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->read); 55284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->file); 55294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->memo); 55304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->stack); 55314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->pers_func); 55324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->arg); 55334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->last_string); 55344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(self->find_class); 55354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 55364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 55374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 55394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_clear(Unpicklerobject *self) 55404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 55414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->readline); 55424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->read); 55434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->file); 55444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->memo); 55454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->stack); 55464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->pers_func); 55474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->arg); 55484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->last_string); 55494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(self->find_class); 55504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 55514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 55524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 55544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_getattr(Unpicklerobject *self, char *name) 55554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 55564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "persistent_load")) { 55574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->pers_func) { 55584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, name); 55594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 55604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self->pers_func); 55634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self->pers_func; 55644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "find_global")) { 55674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->find_class) { 55684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, name); 55694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 55704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self->find_class); 55734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self->find_class; 55744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "memo")) { 55774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!self->memo) { 55784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, name); 55794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 55804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self->memo); 55834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self->memo; 55844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "UnpicklingError")) { 55874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(UnpicklingError); 55884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UnpicklingError; 55894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 55904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_FindMethod(Unpickler_methods, (PyObject *)self, name); 55924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 55934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 55964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) 55974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 55984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 55994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "persistent_load")) { 56004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->pers_func); 56014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->pers_func = value; 56024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XINCREF(value); 56034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 56044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 56054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!strcmp(name, "find_global")) { 56074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->find_class); 56084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->find_class = value; 56094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XINCREF(value); 56104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 56114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 56124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! value) { 56144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 56154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute deletion is not supported"); 56164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 56174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 56184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (strcmp(name, "memo") == 0) { 56204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyDict_Check(value)) { 56214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 56224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "memo must be a dictionary"); 56234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 56244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 56254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(self->memo); 56264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self->memo = value; 56274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(value); 56284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 56294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 56304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_AttributeError, name); 56324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 56334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 56344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* --------------------------------------------------------------------------- 56364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Module-level functions. 56374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 56384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* dump(obj, file, protocol=0). */ 56404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 56414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcpm_dump(PyObject *self, PyObject *args, PyObject *kwds) 56424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 56434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"obj", "file", "protocol", NULL}; 56444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob, *file, *res = NULL; 56454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Picklerobject *pickler = 0; 56464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int proto = 0; 56474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist, 56494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &ob, &file, &proto))) 56504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( pickler = newPicklerobject(file, proto))) 56534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dump(pickler, ob) < 0) 56564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 56594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = Py_None; 56604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 56624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(pickler); 56634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 56654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 56664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* dumps(obj, protocol=0). */ 56694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 56704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcpm_dumps(PyObject *self, PyObject *args, PyObject *kwds) 56714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 56724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"obj", "protocol", NULL}; 56734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob, *file = 0, *res = NULL; 56744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Picklerobject *pickler = 0; 56754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int proto = 0; 56764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist, 56784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &ob, &proto))) 56794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( file = PycStringIO->NewOutput(128))) 56824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( pickler = newPicklerobject(file, proto))) 56854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dump(pickler, ob) < 0) 56884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 56894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PycStringIO->cgetvalue(file); 56914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 56934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(pickler); 56944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(file); 56954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 56974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 56984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 56994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* load(fileobj). */ 57014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 57024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcpm_load(PyObject *self, PyObject *ob) 57034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 57044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unpicklerobject *unpickler = 0; 57054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *res = NULL; 57064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( unpickler = newUnpicklerobject(ob))) 57084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 57094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = load(unpickler); 57114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 57134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(unpickler); 57144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 57164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 57174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* loads(string) */ 57204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 57214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcpm_loads(PyObject *self, PyObject *args) 57224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 57234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ob, *file = 0, *res = NULL; 57244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unpicklerobject *unpickler = 0; 57254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( PyArg_ParseTuple(args, "S:loads", &ob))) 57274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 57284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( file = PycStringIO->NewInput(ob))) 57304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 57314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( unpickler = newUnpicklerobject(file))) 57334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 57344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = load(unpickler); 57364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 57384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(file); 57394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(unpickler); 57404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 57424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 57434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(Unpicklertype__doc__, 57464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Objects that know how to unpickle"); 57474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject Unpicklertype = { 57494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) 57504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cPickle.Unpickler", /*tp_name*/ 57514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(Unpicklerobject), /*tp_basicsize*/ 57524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 57534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)Unpickler_dealloc, /* tp_dealloc */ 57544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 57554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (getattrfunc)Unpickler_getattr, /* tp_getattr */ 57564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (setattrfunc)Unpickler_setattr, /* tp_setattr */ 57574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 57584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 57594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 57604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 57614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 57624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 57634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_call */ 57644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 57654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattro */ 57664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 57674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 57684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 57694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unpicklertype__doc__, /* tp_doc */ 57704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (traverseproc)Unpickler_traverse, /* tp_traverse */ 57714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (inquiry)Unpickler_clear, /* tp_clear */ 57724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 57734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMethodDef cPickle_methods[] = { 57754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS, 57764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("dump(obj, file, protocol=0) -- " 57774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Write an object in pickle format to the given file.\n" 57784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 57794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "See the Pickler docstring for the meaning of optional argument proto.") 57804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm }, 57814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS, 57834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("dumps(obj, protocol=0) -- " 57844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Return a string containing an object in pickle format.\n" 57854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 57864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "See the Pickler docstring for the meaning of optional argument proto.") 57874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm }, 57884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"load", (PyCFunction)cpm_load, METH_O, 57904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("load(file) -- Load a pickle from the given file")}, 57914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"loads", (PyCFunction)cpm_loads, METH_VARARGS, 57934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("loads(string) -- Load a pickle from the given string")}, 57944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 57954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS, 57964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n" 57974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 57984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "This takes a file-like object for writing a pickle data stream.\n" 57994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "The optional proto argument tells the pickler to use the given\n" 58004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "protocol; supported protocols are 0, 1, 2. The default\n" 58014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "protocol is 0, to be backwards compatible. (Protocol 0 is the\n" 58024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "only protocol that can be written to a file opened in text\n" 58034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "mode and read back successfully. When using a protocol higher\n" 58044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "than 0, make sure the file is opened in binary mode, both when\n" 58054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "pickling and unpickling.)\n" 58064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 58074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Protocol 1 is more efficient than protocol 0; protocol 2 is\n" 58084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "more efficient than protocol 1.\n" 58094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 58104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Specifying a negative protocol version selects the highest\n" 58114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "protocol version supported. The higher the protocol used, the\n" 58124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "more recent the version of Python needed to read the pickle\n" 58134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "produced.\n" 58144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "\n" 58154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "The file parameter must have a write() method that accepts a single\n" 58164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "string argument. It can thus be an open file object, a StringIO\n" 58174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "object, or any other custom object that meets this interface.\n") 58184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm }, 58194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"Unpickler", (PyCFunction)get_Unpickler, METH_O, 58214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDoc_STR("Unpickler(file) -- Create an unpickler.")}, 58224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { NULL, NULL } 58244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 58254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 58274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminit_stuff(PyObject *module_dict) 58284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 58294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *copyreg, *t, *r; 58304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1; 58324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(&Unpicklertype) < 0) 58344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(&Picklertype) < 0) 58364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__class__); 58394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__getinitargs__); 58404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__dict__); 58414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__getstate__); 58424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__setstate__); 58434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__name__); 58444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__main__); 58454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__reduce__); 58464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(__reduce_ex__); 58474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(write); 58484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(append); 58494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(read); 58504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(readline); 58514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INIT_STR(dispatch_table); 58524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( copyreg = PyImport_ImportModule("copy_reg"))) 58544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* This is special because we want to use a different 58574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm one in restricted mode. */ 58584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str); 58594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!dispatch_table) return -1; 58604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm extension_registry = PyObject_GetAttrString(copyreg, 58624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "_extension_registry"); 58634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!extension_registry) return -1; 58644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inverted_registry = PyObject_GetAttrString(copyreg, 58664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "_inverted_registry"); 58674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!inverted_registry) return -1; 58684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm extension_cache = PyObject_GetAttrString(copyreg, 58704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "_extension_cache"); 58714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!extension_cache) return -1; 58724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(copyreg); 58744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(empty_tuple = PyTuple_New(0))) 58764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm two_tuple = PyTuple_New(2); 58794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (two_tuple == NULL) 58804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* We use this temp container with no regard to refcounts, or to 58824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * keeping containees alive. Exempt from GC, because we don't 58834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * want anything looking at two_tuple() by magic. 58844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 58854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack(two_tuple); 58864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Ugh */ 58884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( t=PyImport_ImportModule("__builtin__"))) return -1; 58894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0) 58904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 58914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 58924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( t=PyDict_New())) return -1; 58934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( r=PyRun_String( 58944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "def __str__(self):\n" 58954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " return self.args and ('%s' % self.args[0]) or '(what)'\n", 58964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_file_input, 58974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_dict, t) )) return -1; 58984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(r); 58994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PickleError = PyErr_NewException("cPickle.PickleError", NULL, t); 59014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PickleError) 59024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(t); 59054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PicklingError = PyErr_NewException("cPickle.PicklingError", 59074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PickleError, NULL); 59084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PicklingError) 59094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( t=PyDict_New())) return -1; 59124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( r=PyRun_String( 59134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "def __str__(self):\n" 59144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " a=self.args\n" 59154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " a=a and type(a[0]) or '(what)'\n" 59164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " return 'Cannot pickle %s objects' % a\n" 59174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm , Py_file_input, 59184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm module_dict, t) )) return -1; 59194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(r); 59204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( UnpickleableError = PyErr_NewException( 59224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cPickle.UnpickleableError", PicklingError, t))) 59234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(t); 59264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError", 59284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PickleError, NULL))) 59294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet", 59324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UnpicklingError, NULL))) 59334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "PickleError", 59364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PickleError) < 0) 59374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "PicklingError", 59404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PicklingError) < 0) 59414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "UnpicklingError", 59444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UnpicklingError) < 0) 59454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "UnpickleableError", 59484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UnpickleableError) < 0) 59494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(module_dict, "BadPickleGet", 59524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BadPickleGet) < 0) 59534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 59544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PycString_IMPORT; 59564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 59584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 59594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ 59614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyMODINIT_FUNC void 59624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 59634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC 59644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitcPickle(void) 59654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 59664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *d, *di, *v, *k; 59674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 59684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *rev = "1.71"; /* XXX when does this change? */ 59694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *format_version; 59704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *compatible_formats; 59714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(&Picklertype) = &PyType_Type; 59734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(&Unpicklertype) = &PyType_Type; 59744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(&PdataType) = &PyType_Type; 59754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Initialize some pieces. We need to do this before module creation, 59774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * so we're forced to use a temporary dictionary. :( 59784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 59794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm di = PyDict_New(); 59804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!di) return; 59814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (init_stuff(di) < 0) return; 59824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Create the module and add the functions */ 59844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = Py_InitModule4("cPickle", cPickle_methods, 59854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cPickle_module_documentation, 59864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject*)NULL,PYTHON_API_VERSION); 59874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 59884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 59894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Add some symbolic constants to the module */ 59914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyModule_GetDict(m); 59924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromString(rev); 59934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(d, "__version__", v); 59944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 59954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 59964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Copy data from di. Waaa. */ 59974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=0; PyDict_Next(di, &i, &k, &v); ) { 59984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetItem(d, k, v) < 0) { 59994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(di); 60004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 60014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 60024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 60034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(di); 60044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 60054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL); 60064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 60074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 60084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 60094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* These are purely informational; no code uses them. */ 60104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* File format version we write. */ 60114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm format_version = PyString_FromString("2.0"); 60124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Format versions we can read. */ 60134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm compatible_formats = Py_BuildValue("[sssss]", 60144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "1.0", /* Original protocol 0 */ 60154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "1.1", /* Protocol 0 + INST */ 60164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "1.2", /* Original protocol 1 */ 60174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "1.3", /* Protocol 1 + BINFLOAT */ 60184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "2.0"); /* Original protocol 2 */ 60194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(d, "format_version", format_version); 60204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(d, "compatible_formats", compatible_formats); 60214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(format_version); 60224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(compatible_formats); 60234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6024