Home | History | Annotate | Download | only in Modules
      1 #include "Python.h"
      2 #include "cStringIO.h"
      3 #include "structmember.h"
      4 
      5 PyDoc_STRVAR(cPickle_module_documentation,
      6 "C implementation and optimization of the Python pickle module.");
      7 
      8 #ifndef Py_eval_input
      9 #include <graminit.h>
     10 #define Py_eval_input eval_input
     11 #endif /* Py_eval_input */
     12 
     13 #define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
     14 
     15 #define WRITE_BUF_SIZE 256
     16 
     17 /* Bump this when new opcodes are added to the pickle protocol. */
     18 #define HIGHEST_PROTOCOL 2
     19 
     20 /*
     21  * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
     22  * all headers have already been included here, we can safely redefine it.
     23  */
     24 #ifdef UNICODE
     25 #  undef UNICODE
     26 #endif
     27 
     28 /*
     29  * Pickle opcodes.  These must be kept in synch with pickle.py.  Extensive
     30  * docs are in pickletools.py.
     31  */
     32 #define MARK        '('
     33 #define STOP        '.'
     34 #define POP         '0'
     35 #define POP_MARK    '1'
     36 #define DUP         '2'
     37 #define FLOAT       'F'
     38 #define BINFLOAT    'G'
     39 #define INT         'I'
     40 #define BININT      'J'
     41 #define BININT1     'K'
     42 #define LONG        'L'
     43 #define BININT2     'M'
     44 #define NONE        'N'
     45 #define PERSID      'P'
     46 #define BINPERSID   'Q'
     47 #define REDUCE      'R'
     48 #define STRING      'S'
     49 #define BINSTRING   'T'
     50 #define SHORT_BINSTRING 'U'
     51 #define UNICODE     'V'
     52 #define BINUNICODE  'X'
     53 #define APPEND      'a'
     54 #define BUILD       'b'
     55 #define GLOBAL      'c'
     56 #define DICT        'd'
     57 #define EMPTY_DICT  '}'
     58 #define APPENDS     'e'
     59 #define GET         'g'
     60 #define BINGET      'h'
     61 #define INST        'i'
     62 #define LONG_BINGET 'j'
     63 #define LIST        'l'
     64 #define EMPTY_LIST  ']'
     65 #define OBJ         'o'
     66 #define PUT         'p'
     67 #define BINPUT      'q'
     68 #define LONG_BINPUT 'r'
     69 #define SETITEM     's'
     70 #define TUPLE       't'
     71 #define EMPTY_TUPLE ')'
     72 #define SETITEMS    'u'
     73 
     74 /* Protocol 2. */
     75 #define PROTO    '\x80' /* identify pickle protocol */
     76 #define NEWOBJ   '\x81' /* build object by applying cls.__new__ to argtuple */
     77 #define EXT1     '\x82' /* push object from extension registry; 1-byte index */
     78 #define EXT2     '\x83' /* ditto, but 2-byte index */
     79 #define EXT4     '\x84' /* ditto, but 4-byte index */
     80 #define TUPLE1   '\x85' /* build 1-tuple from stack top */
     81 #define TUPLE2   '\x86' /* build 2-tuple from two topmost stack items */
     82 #define TUPLE3   '\x87' /* build 3-tuple from three topmost stack items */
     83 #define NEWTRUE  '\x88' /* push True */
     84 #define NEWFALSE '\x89' /* push False */
     85 #define LONG1    '\x8a' /* push long from < 256 bytes */
     86 #define LONG4    '\x8b' /* push really big long */
     87 
     88 /* There aren't opcodes -- they're ways to pickle bools before protocol 2,
     89  * so that unpicklers written before bools were introduced unpickle them
     90  * as ints, but unpicklers after can recognize that bools were intended.
     91  * Note that protocol 2 added direct ways to pickle bools.
     92  */
     93 #undef TRUE
     94 #define TRUE        "I01\n"
     95 #undef FALSE
     96 #define FALSE       "I00\n"
     97 
     98 /* Keep in synch with pickle.Pickler._BATCHSIZE.  This is how many elements
     99  * batch_list/dict() pumps out before doing APPENDS/SETITEMS.  Nothing will
    100  * break if this gets out of synch with pickle.py, but it's unclear that
    101  * would help anything either.
    102  */
    103 #define BATCHSIZE 1000
    104 
    105 static char MARKv = MARK;
    106 
    107 static PyObject *PickleError;
    108 static PyObject *PicklingError;
    109 static PyObject *UnpickleableError;
    110 static PyObject *UnpicklingError;
    111 static PyObject *BadPickleGet;
    112 
    113 /* As the name says, an empty tuple. */
    114 static PyObject *empty_tuple;
    115 
    116 /* copy_reg.dispatch_table, {type_object: pickling_function} */
    117 static PyObject *dispatch_table;
    118 
    119 /* For EXT[124] opcodes. */
    120 /* copy_reg._extension_registry, {(module_name, function_name): code} */
    121 static PyObject *extension_registry;
    122 /* copy_reg._inverted_registry, {code: (module_name, function_name)} */
    123 static PyObject *inverted_registry;
    124 /* copy_reg._extension_cache, {code: object} */
    125 static PyObject *extension_cache;
    126 
    127 /* For looking up name pairs in copy_reg._extension_registry. */
    128 static PyObject *two_tuple;
    129 
    130 static PyObject *__class___str, *__getinitargs___str, *__dict___str,
    131   *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
    132   *__reduce_ex___str,
    133   *write_str, *append_str,
    134   *read_str, *readline_str, *__main___str,
    135   *dispatch_table_str;
    136 
    137 /*************************************************************************
    138  Internal Data type for pickle data.                                     */
    139 
    140 typedef struct {
    141     PyObject_HEAD
    142     Py_ssize_t length;  /* number of initial slots in data currently used */
    143     Py_ssize_t size;    /* number of slots in data allocated */
    144     PyObject **data;
    145 } Pdata;
    146 
    147 static void
    148 Pdata_dealloc(Pdata *self)
    149 {
    150     Py_ssize_t i;
    151     PyObject **p;
    152 
    153     for (i = self->length, p = self->data; --i >= 0; p++) {
    154         Py_DECREF(*p);
    155     }
    156     if (self->data)
    157         free(self->data);
    158     PyObject_Del(self);
    159 }
    160 
    161 static PyTypeObject PdataType = {
    162     PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
    163     (destructor)Pdata_dealloc,
    164     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
    165 };
    166 
    167 #define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
    168 
    169 static PyObject *
    170 Pdata_New(void)
    171 {
    172     Pdata *self;
    173 
    174     if (!(self = PyObject_New(Pdata, &PdataType)))
    175         return NULL;
    176     self->size = 8;
    177     self->length = 0;
    178     self->data = malloc(self->size * sizeof(PyObject*));
    179     if (self->data)
    180         return (PyObject*)self;
    181     Py_DECREF(self);
    182     return PyErr_NoMemory();
    183 }
    184 
    185 static int
    186 stackUnderflow(void)
    187 {
    188     PyErr_SetString(UnpicklingError, "unpickling stack underflow");
    189     return -1;
    190 }
    191 
    192 /* Retain only the initial clearto items.  If clearto >= the current
    193  * number of items, this is a (non-erroneous) NOP.
    194  */
    195 static int
    196 Pdata_clear(Pdata *self, Py_ssize_t clearto)
    197 {
    198     Py_ssize_t i;
    199     PyObject **p;
    200 
    201     if (clearto < 0) return stackUnderflow();
    202     if (clearto >= self->length) return 0;
    203 
    204     for (i = self->length, p = self->data + clearto;
    205          --i >= clearto;
    206          p++) {
    207         Py_CLEAR(*p);
    208     }
    209     self->length = clearto;
    210 
    211     return 0;
    212 }
    213 
    214 static int
    215 Pdata_grow(Pdata *self)
    216 {
    217     Py_ssize_t bigger;
    218     Py_ssize_t nbytes;
    219 
    220     PyObject **tmp;
    221 
    222     if (self->size > (PY_SSIZE_T_MAX >> 1))
    223         goto nomemory;
    224     bigger = self->size << 1;
    225     if (bigger > (PY_SSIZE_T_MAX / sizeof(PyObject *)))
    226         goto nomemory;
    227     nbytes = bigger * sizeof(PyObject *);
    228     tmp = realloc(self->data, nbytes);
    229     if (tmp == NULL)
    230         goto nomemory;
    231     self->data = tmp;
    232     self->size = bigger;
    233     return 0;
    234 
    235   nomemory:
    236     PyErr_NoMemory();
    237     return -1;
    238 }
    239 
    240 /* D is a Pdata*.  Pop the topmost element and store it into V, which
    241  * must be an lvalue holding PyObject*.  On stack underflow, UnpicklingError
    242  * is raised and V is set to NULL.  D and V may be evaluated several times.
    243  */
    244 #define PDATA_POP(D, V) {                                       \
    245     if ((D)->length)                                            \
    246         (V) = (D)->data[--((D)->length)];                       \
    247     else {                                                      \
    248         PyErr_SetString(UnpicklingError, "bad pickle data");            \
    249         (V) = NULL;                                             \
    250     }                                                           \
    251 }
    252 
    253 /* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
    254  * D.  If the Pdata stack can't be grown to hold the new value, both
    255  * raise MemoryError and execute "return ER".  The difference is in ownership
    256  * of O after:  _PUSH transfers ownership of O from the caller to the stack
    257  * (no incref of O is done, and in case of error O is decrefed), while
    258  * _APPEND pushes a new reference.
    259  */
    260 
    261 /* Push O on stack D, giving ownership of O to the stack. */
    262 #define PDATA_PUSH(D, O, ER) {                                  \
    263     if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&         \
    264         Pdata_grow((Pdata*)(D)) < 0) {                          \
    265         Py_DECREF(O);                                           \
    266         return ER;                                              \
    267     }                                                           \
    268     ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);         \
    269 }
    270 
    271 /* Push O on stack D, pushing a new reference. */
    272 #define PDATA_APPEND(D, O, ER) {                                \
    273     if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&         \
    274         Pdata_grow((Pdata*)(D)) < 0)                            \
    275         return ER;                                              \
    276     Py_INCREF(O);                                               \
    277     ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);         \
    278 }
    279 
    280 
    281 static PyObject *
    282 Pdata_popTuple(Pdata *self, Py_ssize_t start)
    283 {
    284     PyObject *r;
    285     Py_ssize_t i, j, l;
    286 
    287     l = self->length-start;
    288     r = PyTuple_New(l);
    289     if (r == NULL)
    290         return NULL;
    291     for (i = start, j = 0 ; j < l; i++, j++)
    292         PyTuple_SET_ITEM(r, j, self->data[i]);
    293 
    294     self->length = start;
    295     return r;
    296 }
    297 
    298 static PyObject *
    299 Pdata_popList(Pdata *self, Py_ssize_t start)
    300 {
    301     PyObject *r;
    302     Py_ssize_t i, j, l;
    303 
    304     l=self->length-start;
    305     if (!( r=PyList_New(l)))  return NULL;
    306     for (i=start, j=0 ; j < l; i++, j++)
    307         PyList_SET_ITEM(r, j, self->data[i]);
    308 
    309     self->length=start;
    310     return r;
    311 }
    312 
    313 /*************************************************************************/
    314 
    315 #define ARG_TUP(self, o) {                          \
    316   if (self->arg || (self->arg=PyTuple_New(1))) {    \
    317       Py_XDECREF(PyTuple_GET_ITEM(self->arg,0));    \
    318       PyTuple_SET_ITEM(self->arg,0,o);              \
    319   }                                                 \
    320   else {                                            \
    321       Py_DECREF(o);                                 \
    322   }                                                 \
    323 }
    324 
    325 #define FREE_ARG_TUP(self) {                        \
    326     if (Py_REFCNT(self->arg) > 1) {                 \
    327       Py_CLEAR(self->arg);                          \
    328     }                                               \
    329   }
    330 
    331 typedef struct Picklerobject {
    332     PyObject_HEAD
    333     FILE *fp;
    334     PyObject *write;
    335     PyObject *file;
    336     PyObject *memo;
    337     PyObject *arg;
    338     PyObject *pers_func;
    339     PyObject *inst_pers_func;
    340 
    341     /* pickle protocol number, >= 0 */
    342     int proto;
    343 
    344     /* bool, true if proto > 0 */
    345     int bin;
    346 
    347     int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
    348     Py_ssize_t (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
    349     char *write_buf;
    350     Py_ssize_t buf_size;
    351     PyObject *dispatch_table;
    352     int fast_container; /* count nested container dumps */
    353     PyObject *fast_memo;
    354 } Picklerobject;
    355 
    356 #ifndef PY_CPICKLE_FAST_LIMIT
    357 #define PY_CPICKLE_FAST_LIMIT 50
    358 #endif
    359 
    360 static PyTypeObject Picklertype;
    361 
    362 typedef struct Unpicklerobject {
    363     PyObject_HEAD
    364     FILE *fp;
    365     PyObject *file;
    366     PyObject *readline;
    367     PyObject *read;
    368     PyObject *memo;
    369     PyObject *arg;
    370     Pdata *stack;
    371     PyObject *mark;
    372     PyObject *pers_func;
    373     PyObject *last_string;
    374     Py_ssize_t *marks;
    375     Py_ssize_t num_marks;
    376     Py_ssize_t marks_size;
    377     Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
    378     Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
    379     Py_ssize_t buf_size;
    380     char *buf;
    381     PyObject *find_class;
    382 } Unpicklerobject;
    383 
    384 static PyTypeObject Unpicklertype;
    385 
    386 /* Forward decls that need the above structs */
    387 static int save(Picklerobject *, PyObject *, int);
    388 static int put2(Picklerobject *, PyObject *);
    389 
    390 static
    391 PyObject *
    392 cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
    393 {
    394     va_list va;
    395     PyObject *args=0, *retval=0;
    396     va_start(va, format);
    397 
    398     if (format) args = Py_VaBuildValue(format, va);
    399     va_end(va);
    400     if (format && ! args) return NULL;
    401     if (stringformat && !(retval=PyString_FromString(stringformat)))
    402         return NULL;
    403 
    404     if (retval) {
    405         if (args) {
    406             PyObject *v;
    407             v=PyString_Format(retval, args);
    408             Py_DECREF(retval);
    409             Py_DECREF(args);
    410             if (! v) return NULL;
    411             retval=v;
    412         }
    413     }
    414     else
    415         if (args) retval=args;
    416         else {
    417             PyErr_SetObject(ErrType,Py_None);
    418             return NULL;
    419         }
    420     PyErr_SetObject(ErrType,retval);
    421     Py_DECREF(retval);
    422     return NULL;
    423 }
    424 
    425 static Py_ssize_t
    426 write_file(Picklerobject *self, const char *s, Py_ssize_t  n)
    427 {
    428     size_t nbyteswritten;
    429 
    430     if (s == NULL) {
    431         return 0;
    432     }
    433 
    434     PyFile_IncUseCount((PyFileObject *)self->file);
    435     Py_BEGIN_ALLOW_THREADS
    436     nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
    437     Py_END_ALLOW_THREADS
    438     PyFile_DecUseCount((PyFileObject *)self->file);
    439     if (nbyteswritten != (size_t)n) {
    440         PyErr_SetFromErrno(PyExc_IOError);
    441         return -1;
    442     }
    443 
    444     return n;
    445 }
    446 
    447 static Py_ssize_t
    448 write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t  n)
    449 {
    450     Py_ssize_t len = n;
    451 
    452     if (s == NULL) {
    453         return 0;
    454     }
    455 
    456     while (n > INT_MAX) {
    457         if (PycStringIO->cwrite((PyObject *)self->file, s, INT_MAX) != INT_MAX) {
    458             return -1;
    459         }
    460         n -= INT_MAX;
    461     }
    462 
    463     if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
    464         return -1;
    465     }
    466 
    467     return len;
    468 }
    469 
    470 static Py_ssize_t
    471 write_none(Picklerobject *self, const char *s, Py_ssize_t  n)
    472 {
    473     if (s == NULL) return 0;
    474     return n;
    475 }
    476 
    477 static Py_ssize_t
    478 write_other(Picklerobject *self, const char *s, Py_ssize_t  n)
    479 {
    480     PyObject *py_str = 0, *junk = 0;
    481 
    482     if (s == NULL) {
    483         if (!( self->buf_size ))  return 0;
    484         py_str = PyString_FromStringAndSize(self->write_buf,
    485                                             self->buf_size);
    486         if (!py_str)
    487             return -1;
    488     }
    489     else {
    490         if (self->buf_size && n > WRITE_BUF_SIZE - self->buf_size) {
    491             if (write_other(self, NULL, 0) < 0)
    492                 return -1;
    493         }
    494 
    495         if (n > WRITE_BUF_SIZE) {
    496             if (!( py_str =
    497                    PyString_FromStringAndSize(s, n)))
    498                 return -1;
    499         }
    500         else {
    501             memcpy(self->write_buf + self->buf_size, s, n);
    502             self->buf_size += n;
    503             return n;
    504         }
    505     }
    506 
    507     if (self->write) {
    508         /* object with write method */
    509         ARG_TUP(self, py_str);
    510         if (self->arg) {
    511             junk = PyObject_Call(self->write, self->arg, NULL);
    512             FREE_ARG_TUP(self);
    513         }
    514         if (junk) Py_DECREF(junk);
    515         else return -1;
    516     }
    517     else
    518         PDATA_PUSH(self->file, py_str, -1);
    519 
    520     self->buf_size = 0;
    521     return n;
    522 }
    523 
    524 
    525 static Py_ssize_t
    526 read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
    527 {
    528     size_t nbytesread;
    529 
    530     if (self->buf_size == 0) {
    531         Py_ssize_t size;
    532 
    533         size = ((n < 32) ? 32 : n);
    534         if (!( self->buf = (char *)malloc(size))) {
    535             PyErr_NoMemory();
    536             return -1;
    537         }
    538 
    539         self->buf_size = size;
    540     }
    541     else if (n > self->buf_size) {
    542         char *newbuf = (char *)realloc(self->buf, n);
    543         if (!newbuf)  {
    544             PyErr_NoMemory();
    545             return -1;
    546         }
    547         self->buf = newbuf;
    548         self->buf_size = n;
    549     }
    550 
    551     PyFile_IncUseCount((PyFileObject *)self->file);
    552     Py_BEGIN_ALLOW_THREADS
    553     nbytesread = fread(self->buf, sizeof(char), n, self->fp);
    554     Py_END_ALLOW_THREADS
    555     PyFile_DecUseCount((PyFileObject *)self->file);
    556     if (nbytesread != (size_t)n) {
    557         if (feof(self->fp)) {
    558             PyErr_SetNone(PyExc_EOFError);
    559             return -1;
    560         }
    561 
    562         PyErr_SetFromErrno(PyExc_IOError);
    563         return -1;
    564     }
    565 
    566     *s = self->buf;
    567 
    568     return n;
    569 }
    570 
    571 
    572 static Py_ssize_t
    573 readline_file(Unpicklerobject *self, char **s)
    574 {
    575     Py_ssize_t i;
    576 
    577     if (self->buf_size == 0) {
    578         if (!( self->buf = (char *)malloc(40))) {
    579             PyErr_NoMemory();
    580             return -1;
    581         }
    582         self->buf_size = 40;
    583     }
    584 
    585     i = 0;
    586     while (1) {
    587         Py_ssize_t bigger;
    588         char *newbuf;
    589         for (; i < (self->buf_size - 1); i++) {
    590             if (feof(self->fp) ||
    591                 (self->buf[i] = getc(self->fp)) == '\n') {
    592                 self->buf[i + 1] = '\0';
    593                 *s = self->buf;
    594                 return i + 1;
    595             }
    596         }
    597         if (self->buf_size > (PY_SSIZE_T_MAX >> 1)) {
    598             PyErr_NoMemory();
    599             return -1;
    600         }
    601         bigger = self->buf_size << 1;
    602         newbuf = (char *)realloc(self->buf, bigger);
    603         if (newbuf == NULL)  {
    604             PyErr_NoMemory();
    605             return -1;
    606         }
    607         self->buf = newbuf;
    608         self->buf_size = bigger;
    609     }
    610 }
    611 
    612 
    613 static Py_ssize_t
    614 read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t  n)
    615 {
    616     Py_ssize_t len = n;
    617     char *start, *end = NULL;
    618 
    619     while (1) {
    620         int k;
    621         char *ptr;
    622         if (n > INT_MAX)
    623             k = INT_MAX;
    624         else
    625             k = (int)n;
    626         if (PycStringIO->cread((PyObject *)self->file, &ptr, k) != k) {
    627             PyErr_SetNone(PyExc_EOFError);
    628             return -1;
    629         }
    630         if (end == NULL)
    631             start = ptr;
    632         else if (ptr != end) {
    633             /* non-continuous area */
    634             return -1;
    635         }
    636         if (n <= INT_MAX)
    637             break;
    638         end = ptr + INT_MAX;
    639         n -= INT_MAX;
    640     }
    641 
    642     *s = start;
    643 
    644     return len;
    645 }
    646 
    647 
    648 static Py_ssize_t
    649 readline_cStringIO(Unpicklerobject *self, char **s)
    650 {
    651     Py_ssize_t n = 0;
    652     char *start = NULL, *end = NULL;
    653 
    654     while (1) {
    655         int k;
    656         char *ptr;
    657         if ((k = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
    658             return -1;
    659         }
    660         n += k;
    661         if (end == NULL)
    662             start = ptr;
    663         else if (ptr != end) {
    664             /* non-continuous area */
    665             return -1;
    666         }
    667         if (k == 0 || ptr[k - 1] == '\n')
    668             break;
    669         end = ptr + k;
    670     }
    671 
    672     *s = start;
    673 
    674     return n;
    675 }
    676 
    677 
    678 static Py_ssize_t
    679 read_other(Unpicklerobject *self, char **s, Py_ssize_t  n)
    680 {
    681     PyObject *bytes, *str=0;
    682 
    683     if (!( bytes = PyInt_FromSsize_t(n)))  return -1;
    684 
    685     ARG_TUP(self, bytes);
    686     if (self->arg) {
    687         str = PyObject_Call(self->read, self->arg, NULL);
    688         FREE_ARG_TUP(self);
    689     }
    690     if (! str) return -1;
    691 
    692     Py_XDECREF(self->last_string);
    693     self->last_string = str;
    694 
    695     if (! (*s = PyString_AsString(str))) return -1;
    696 
    697     if (PyString_GET_SIZE(str) != n) {
    698         PyErr_SetNone(PyExc_EOFError);
    699         return -1;
    700     }
    701 
    702     return n;
    703 }
    704 
    705 
    706 static Py_ssize_t
    707 readline_other(Unpicklerobject *self, char **s)
    708 {
    709     PyObject *str;
    710     Py_ssize_t str_size;
    711 
    712     if (!( str = PyObject_CallObject(self->readline, empty_tuple)))  {
    713         return -1;
    714     }
    715 
    716     if ((str_size = PyString_Size(str)) < 0)
    717         return -1;
    718 
    719     Py_XDECREF(self->last_string);
    720     self->last_string = str;
    721 
    722     if (! (*s = PyString_AsString(str)))
    723         return -1;
    724 
    725     return str_size;
    726 }
    727 
    728 /* Copy the first n bytes from s into newly malloc'ed memory, plus a
    729  * trailing 0 byte.  Return a pointer to that, or NULL if out of memory.
    730  * The caller is responsible for free()'ing the return value.
    731  */
    732 static char *
    733 pystrndup(const char *s, Py_ssize_t n)
    734 {
    735     char *r = (char *)malloc(n+1);
    736     if (r == NULL)
    737         return (char*)PyErr_NoMemory();
    738     memcpy(r, s, n);
    739     r[n] = 0;
    740     return r;
    741 }
    742 
    743 
    744 static int
    745 get(Picklerobject *self, PyObject *id)
    746 {
    747     PyObject *value, *mv;
    748     Py_ssize_t c_value;
    749     char s[30];
    750     size_t len;
    751 
    752     if (!( mv = PyDict_GetItem(self->memo, id)))  {
    753         PyErr_SetObject(PyExc_KeyError, id);
    754         return -1;
    755     }
    756 
    757     if (!( value = PyTuple_GetItem(mv, 0)))
    758         return -1;
    759 
    760     if (!( PyInt_Check(value)))  {
    761         PyErr_SetString(PicklingError, "no int where int expected in memo");
    762         return -1;
    763     }
    764     c_value = PyInt_AS_LONG((PyIntObject*)value);
    765 
    766     if (!self->bin) {
    767         s[0] = GET;
    768         PyOS_snprintf(s + 1, sizeof(s) - 1,
    769                       "%" PY_FORMAT_SIZE_T "d\n", c_value);
    770         len = strlen(s);
    771     }
    772     else if (Pdata_Check(self->file)) {
    773         if (write_other(self, NULL, 0) < 0) return -1;
    774         PDATA_APPEND(self->file, mv, -1);
    775         return 0;
    776     }
    777     else {
    778         if (c_value < 256) {
    779             s[0] = BINGET;
    780             s[1] = (int)(c_value & 0xff);
    781             len = 2;
    782         }
    783         else {
    784             s[0] = LONG_BINGET;
    785             s[1] = (int)(c_value & 0xff);
    786             s[2] = (int)((c_value >> 8)  & 0xff);
    787             s[3] = (int)((c_value >> 16) & 0xff);
    788             s[4] = (int)((c_value >> 24) & 0xff);
    789             len = 5;
    790         }
    791     }
    792 
    793     if (self->write_func(self, s, len) < 0)
    794         return -1;
    795 
    796     return 0;
    797 }
    798 
    799 
    800 static int
    801 put(Picklerobject *self, PyObject *ob)
    802 {
    803     if (Py_REFCNT(ob) < 2 || self->fast)
    804         return 0;
    805 
    806     return put2(self, ob);
    807 }
    808 
    809 
    810 static int
    811 put2(Picklerobject *self, PyObject *ob)
    812 {
    813     char c_str[30];
    814     Py_ssize_t len, p;
    815     int res = -1;
    816     PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
    817 
    818     if (self->fast)
    819         return 0;
    820 
    821     if ((p = PyDict_Size(self->memo)) < 0)
    822         goto finally;
    823 
    824     /* Make sure memo keys are positive! */
    825     /* XXX Why?
    826      * XXX And does "positive" really mean non-negative?
    827      * XXX pickle.py starts with PUT index 0, not 1.  This makes for
    828      * XXX gratuitous differences between the pickling modules.
    829      */
    830     p++;
    831 
    832     if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
    833         goto finally;
    834 
    835     if (!( memo_len = PyInt_FromLong(p)))
    836         goto finally;
    837 
    838     if (!( t = PyTuple_New(2)))
    839         goto finally;
    840 
    841     PyTuple_SET_ITEM(t, 0, memo_len);
    842     Py_INCREF(memo_len);
    843     PyTuple_SET_ITEM(t, 1, ob);
    844     Py_INCREF(ob);
    845 
    846     if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
    847         goto finally;
    848 
    849     if (!self->bin) {
    850         c_str[0] = PUT;
    851         PyOS_snprintf(c_str + 1, sizeof(c_str) - 1,
    852                       "%" PY_FORMAT_SIZE_T "d\n", p);
    853         len = strlen(c_str);
    854     }
    855     else if (Pdata_Check(self->file)) {
    856         if (write_other(self, NULL, 0) < 0) return -1;
    857         PDATA_APPEND(self->file, memo_len, -1);
    858         res=0;          /* Job well done ;) */
    859         goto finally;
    860     }
    861     else {
    862         if (p >= 256) {
    863             c_str[0] = LONG_BINPUT;
    864             c_str[1] = (int)(p & 0xff);
    865             c_str[2] = (int)((p >> 8)  & 0xff);
    866             c_str[3] = (int)((p >> 16) & 0xff);
    867             c_str[4] = (int)((p >> 24) & 0xff);
    868             len = 5;
    869         }
    870         else {
    871             c_str[0] = BINPUT;
    872             c_str[1] = p;
    873             len = 2;
    874         }
    875     }
    876 
    877     if (self->write_func(self, c_str, len) < 0)
    878         goto finally;
    879 
    880     res = 0;
    881 
    882   finally:
    883     Py_XDECREF(py_ob_id);
    884     Py_XDECREF(memo_len);
    885     Py_XDECREF(t);
    886 
    887     return res;
    888 }
    889 
    890 static PyObject *
    891 whichmodule(PyObject *global, PyObject *global_name)
    892 {
    893     Py_ssize_t i, j;
    894     PyObject *module = 0, *modules_dict = 0,
    895         *global_name_attr = 0, *name = 0;
    896 
    897     module = PyObject_GetAttrString(global, "__module__");
    898     if (module)
    899         return module;
    900     if (PyErr_ExceptionMatches(PyExc_AttributeError))
    901         PyErr_Clear();
    902     else
    903         return NULL;
    904 
    905     if (!( modules_dict = PySys_GetObject("modules")))
    906         return NULL;
    907 
    908     i = 0;
    909     while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
    910 
    911         if (PyObject_Compare(name, __main___str)==0) continue;
    912 
    913         global_name_attr = PyObject_GetAttr(module, global_name);
    914         if (!global_name_attr)  {
    915             if (PyErr_ExceptionMatches(PyExc_AttributeError))
    916                 PyErr_Clear();
    917             else
    918                 return NULL;
    919             continue;
    920         }
    921 
    922         if (global_name_attr != global) {
    923             Py_DECREF(global_name_attr);
    924             continue;
    925         }
    926 
    927         Py_DECREF(global_name_attr);
    928 
    929         break;
    930     }
    931 
    932     /* The following implements the rule in pickle.py added in 1.5
    933        that used __main__ if no module is found.  I don't actually
    934        like this rule. jlf
    935     */
    936     if (!j) {
    937         name=__main___str;
    938     }
    939 
    940     Py_INCREF(name);
    941     return name;
    942 }
    943 
    944 
    945 static int
    946 fast_save_enter(Picklerobject *self, PyObject *obj)
    947 {
    948     /* if fast_container < 0, we're doing an error exit. */
    949     if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
    950         PyObject *key = NULL;
    951         if (self->fast_memo == NULL) {
    952             self->fast_memo = PyDict_New();
    953             if (self->fast_memo == NULL) {
    954                 self->fast_container = -1;
    955                 return 0;
    956             }
    957         }
    958         key = PyLong_FromVoidPtr(obj);
    959         if (key == NULL)
    960             return 0;
    961         if (PyDict_GetItem(self->fast_memo, key)) {
    962             Py_DECREF(key);
    963             PyErr_Format(PyExc_ValueError,
    964                          "fast mode: can't pickle cyclic objects "
    965                          "including object type %s at %p",
    966                          Py_TYPE(obj)->tp_name, obj);
    967             self->fast_container = -1;
    968             return 0;
    969         }
    970         if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
    971             Py_DECREF(key);
    972             self->fast_container = -1;
    973             return 0;
    974         }
    975         Py_DECREF(key);
    976     }
    977     return 1;
    978 }
    979 
    980 int
    981 fast_save_leave(Picklerobject *self, PyObject *obj)
    982 {
    983     if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
    984         PyObject *key = PyLong_FromVoidPtr(obj);
    985         if (key == NULL)
    986             return 0;
    987         if (PyDict_DelItem(self->fast_memo, key) < 0) {
    988             Py_DECREF(key);
    989             return 0;
    990         }
    991         Py_DECREF(key);
    992     }
    993     return 1;
    994 }
    995 
    996 static int
    997 save_none(Picklerobject *self, PyObject *args)
    998 {
    999     static char none = NONE;
   1000     if (self->write_func(self, &none, 1) < 0)
   1001         return -1;
   1002 
   1003     return 0;
   1004 }
   1005 
   1006 static int
   1007 save_bool(Picklerobject *self, PyObject *args)
   1008 {
   1009     static const char *buf[2] = {FALSE, TRUE};
   1010     static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
   1011     long l = PyInt_AS_LONG((PyIntObject *)args);
   1012 
   1013     if (self->proto >= 2) {
   1014         char opcode = l ? NEWTRUE : NEWFALSE;
   1015         if (self->write_func(self, &opcode, 1) < 0)
   1016             return -1;
   1017     }
   1018     else if (self->write_func(self, buf[l], len[l]) < 0)
   1019         return -1;
   1020     return 0;
   1021 }
   1022 
   1023 static int
   1024 save_int(Picklerobject *self, PyObject *args)
   1025 {
   1026     char c_str[32];
   1027     long l = PyInt_AS_LONG((PyIntObject *)args);
   1028     Py_ssize_t len = 0;
   1029 
   1030     if (!self->bin
   1031 #if SIZEOF_LONG > 4
   1032         || l >  0x7fffffffL
   1033         || l < -0x80000000L
   1034 #endif
   1035         ) {
   1036         /* Text-mode pickle, or long too big to fit in the 4-byte
   1037          * signed BININT format:  store as a string.
   1038          */
   1039         c_str[0] = INT;
   1040         PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
   1041         if (self->write_func(self, c_str, strlen(c_str)) < 0)
   1042             return -1;
   1043     }
   1044     else {
   1045         /* Binary pickle and l fits in a signed 4-byte int. */
   1046         c_str[1] = (int)( l        & 0xff);
   1047         c_str[2] = (int)((l >> 8)  & 0xff);
   1048         c_str[3] = (int)((l >> 16) & 0xff);
   1049         c_str[4] = (int)((l >> 24) & 0xff);
   1050 
   1051         if ((c_str[4] == 0) && (c_str[3] == 0)) {
   1052             if (c_str[2] == 0) {
   1053                 c_str[0] = BININT1;
   1054                 len = 2;
   1055             }
   1056             else {
   1057                 c_str[0] = BININT2;
   1058                 len = 3;
   1059             }
   1060         }
   1061         else {
   1062             c_str[0] = BININT;
   1063             len = 5;
   1064         }
   1065 
   1066         if (self->write_func(self, c_str, len) < 0)
   1067             return -1;
   1068     }
   1069 
   1070     return 0;
   1071 }
   1072 
   1073 
   1074 static int
   1075 save_long(Picklerobject *self, PyObject *args)
   1076 {
   1077     Py_ssize_t size;
   1078     int res = -1;
   1079     PyObject *repr = NULL;
   1080 
   1081     static char l = LONG;
   1082 
   1083     if (self->proto >= 2) {
   1084         /* Linear-time pickling. */
   1085         size_t nbits;
   1086         size_t nbytes;
   1087         unsigned char *pdata;
   1088         char c_str[5];
   1089         int i;
   1090         int sign = _PyLong_Sign(args);
   1091 
   1092         if (sign == 0) {
   1093             /* It's 0 -- an empty bytestring. */
   1094             c_str[0] = LONG1;
   1095             c_str[1] = 0;
   1096             i = self->write_func(self, c_str, 2);
   1097             if (i < 0) goto finally;
   1098             res = 0;
   1099             goto finally;
   1100         }
   1101         nbits = _PyLong_NumBits(args);
   1102         if (nbits == (size_t)-1 && PyErr_Occurred())
   1103             goto finally;
   1104         /* How many bytes do we need?  There are nbits >> 3 full
   1105          * bytes of data, and nbits & 7 leftover bits.  If there
   1106          * are any leftover bits, then we clearly need another
   1107          * byte.  Wnat's not so obvious is that we *probably*
   1108          * need another byte even if there aren't any leftovers:
   1109          * the most-significant bit of the most-significant byte
   1110          * acts like a sign bit, and it's usually got a sense
   1111          * opposite of the one we need.  The exception is longs
   1112          * of the form -(2**(8*j-1)) for j > 0.  Such a long is
   1113          * its own 256's-complement, so has the right sign bit
   1114          * even without the extra byte.  That's a pain to check
   1115          * for in advance, though, so we always grab an extra
   1116          * byte at the start, and cut it back later if possible.
   1117          */
   1118         nbytes = (nbits >> 3) + 1;
   1119         if (nbytes > INT_MAX) {
   1120             PyErr_SetString(PyExc_OverflowError, "long too large "
   1121                 "to pickle");
   1122             goto finally;
   1123         }
   1124         repr = PyString_FromStringAndSize(NULL, (int)nbytes);
   1125         if (repr == NULL) goto finally;
   1126         pdata = (unsigned char *)PyString_AS_STRING(repr);
   1127         i = _PyLong_AsByteArray((PyLongObject *)args,
   1128                         pdata, nbytes,
   1129                         1 /* little endian */, 1 /* signed */);
   1130         if (i < 0) goto finally;
   1131         /* If the long is negative, this may be a byte more than
   1132          * needed.  This is so iff the MSB is all redundant sign
   1133          * bits.
   1134          */
   1135         if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
   1136             (pdata[nbytes - 2] & 0x80) != 0)
   1137             --nbytes;
   1138 
   1139         if (nbytes < 256) {
   1140             c_str[0] = LONG1;
   1141             c_str[1] = (char)nbytes;
   1142             size = 2;
   1143         }
   1144         else {
   1145             c_str[0] = LONG4;
   1146             size = (int)nbytes;
   1147             for (i = 1; i < 5; i++) {
   1148                 c_str[i] = (char)(size & 0xff);
   1149                 size >>= 8;
   1150             }
   1151             size = 5;
   1152         }
   1153         i = self->write_func(self, c_str, size);
   1154         if (i < 0) goto finally;
   1155         i = self->write_func(self, (char *)pdata, (int)nbytes);
   1156         if (i < 0) goto finally;
   1157         res = 0;
   1158         goto finally;
   1159     }
   1160 
   1161     /* proto < 2:  write the repr and newline.  This is quadratic-time
   1162      * (in the number of digits), in both directions.
   1163      */
   1164     if (!( repr = PyObject_Repr(args)))
   1165         goto finally;
   1166 
   1167     if ((size = PyString_Size(repr)) < 0)
   1168         goto finally;
   1169 
   1170     if (self->write_func(self, &l, 1) < 0)
   1171         goto finally;
   1172 
   1173     if (self->write_func(self,
   1174                          PyString_AS_STRING((PyStringObject *)repr),
   1175                                             size) < 0)
   1176         goto finally;
   1177 
   1178     if (self->write_func(self, "\n", 1) < 0)
   1179         goto finally;
   1180 
   1181     res = 0;
   1182 
   1183   finally:
   1184     Py_XDECREF(repr);
   1185     return res;
   1186 }
   1187 
   1188 
   1189 static int
   1190 save_float(Picklerobject *self, PyObject *args)
   1191 {
   1192     double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
   1193 
   1194     if (self->bin) {
   1195         char str[9];
   1196         str[0] = BINFLOAT;
   1197         if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
   1198             return -1;
   1199         if (self->write_func(self, str, 9) < 0)
   1200             return -1;
   1201     }
   1202     else {
   1203         int result = -1;
   1204         char *buf = NULL;
   1205         char op = FLOAT;
   1206 
   1207         if (self->write_func(self, &op, 1) < 0)
   1208             goto done;
   1209 
   1210         buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
   1211         if (!buf) {
   1212             PyErr_NoMemory();
   1213             goto done;
   1214         }
   1215 
   1216         if (self->write_func(self, buf, strlen(buf)) < 0)
   1217             goto done;
   1218 
   1219         if (self->write_func(self, "\n", 1) < 0)
   1220             goto done;
   1221 
   1222         result = 0;
   1223 done:
   1224         PyMem_Free(buf);
   1225         return result;
   1226     }
   1227 
   1228     return 0;
   1229 }
   1230 
   1231 
   1232 static int
   1233 save_string(Picklerobject *self, PyObject *args, int doput)
   1234 {
   1235     Py_ssize_t size, len;
   1236     PyObject *repr=0;
   1237 
   1238     if ((size = PyString_Size(args)) < 0)
   1239         return -1;
   1240 
   1241     if (!self->bin) {
   1242         char *repr_str;
   1243 
   1244         static char string = STRING;
   1245 
   1246         if (!( repr = PyObject_Repr(args)))
   1247             return -1;
   1248 
   1249         if ((len = PyString_Size(repr)) < 0)
   1250             goto err;
   1251         repr_str = PyString_AS_STRING((PyStringObject *)repr);
   1252 
   1253         if (self->write_func(self, &string, 1) < 0)
   1254             goto err;
   1255 
   1256         if (self->write_func(self, repr_str, len) < 0)
   1257             goto err;
   1258 
   1259         if (self->write_func(self, "\n", 1) < 0)
   1260             goto err;
   1261 
   1262         Py_XDECREF(repr);
   1263     }
   1264     else {
   1265         int i;
   1266         char c_str[5];
   1267 
   1268         if (size < 256) {
   1269             c_str[0] = SHORT_BINSTRING;
   1270             c_str[1] = size;
   1271             len = 2;
   1272         }
   1273         else if (size <= INT_MAX) {
   1274             c_str[0] = BINSTRING;
   1275             for (i = 1; i < 5; i++)
   1276                 c_str[i] = (int)(size >> ((i - 1) * 8));
   1277             len = 5;
   1278         }
   1279         else
   1280             return -1;    /* string too large */
   1281 
   1282         if (self->write_func(self, c_str, len) < 0)
   1283             return -1;
   1284 
   1285         if (size > 128 && Pdata_Check(self->file)) {
   1286             if (write_other(self, NULL, 0) < 0) return -1;
   1287             PDATA_APPEND(self->file, args, -1);
   1288         }
   1289         else {
   1290             if (self->write_func(self,
   1291                                  PyString_AS_STRING(
   1292                                     (PyStringObject *)args),
   1293                                  size) < 0)
   1294                 return -1;
   1295         }
   1296     }
   1297 
   1298     if (doput)
   1299         if (put(self, args) < 0)
   1300             return -1;
   1301 
   1302     return 0;
   1303 
   1304   err:
   1305     Py_XDECREF(repr);
   1306     return -1;
   1307 }
   1308 
   1309 
   1310 #ifdef Py_USING_UNICODE
   1311 /* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
   1312    backslash and newline characters to \uXXXX escapes. */
   1313 static PyObject *
   1314 modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
   1315 {
   1316     PyObject *repr;
   1317     char *p;
   1318     char *q;
   1319 
   1320     static const char *hexdigit = "0123456789abcdef";
   1321 #ifdef Py_UNICODE_WIDE
   1322     const Py_ssize_t expandsize = 10;
   1323 #else
   1324     const Py_ssize_t expandsize = 6;
   1325 #endif
   1326 
   1327     if (size > PY_SSIZE_T_MAX / expandsize)
   1328     return PyErr_NoMemory();
   1329 
   1330     repr = PyString_FromStringAndSize(NULL, expandsize * size);
   1331     if (repr == NULL)
   1332     return NULL;
   1333     if (size == 0)
   1334     return repr;
   1335 
   1336     p = q = PyString_AS_STRING(repr);
   1337     while (size-- > 0) {
   1338     Py_UNICODE ch = *s++;
   1339 #ifdef Py_UNICODE_WIDE
   1340     /* Map 32-bit characters to '\Uxxxxxxxx' */
   1341     if (ch >= 0x10000) {
   1342         *p++ = '\\';
   1343         *p++ = 'U';
   1344         *p++ = hexdigit[(ch >> 28) & 0xf];
   1345         *p++ = hexdigit[(ch >> 24) & 0xf];
   1346         *p++ = hexdigit[(ch >> 20) & 0xf];
   1347         *p++ = hexdigit[(ch >> 16) & 0xf];
   1348         *p++ = hexdigit[(ch >> 12) & 0xf];
   1349         *p++ = hexdigit[(ch >> 8) & 0xf];
   1350         *p++ = hexdigit[(ch >> 4) & 0xf];
   1351         *p++ = hexdigit[ch & 15];
   1352     }
   1353     else
   1354 #else
   1355     /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
   1356     if (ch >= 0xD800 && ch < 0xDC00) {
   1357         Py_UNICODE ch2;
   1358         Py_UCS4 ucs;
   1359 
   1360         ch2 = *s++;
   1361         size--;
   1362         if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
   1363         ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
   1364         *p++ = '\\';
   1365         *p++ = 'U';
   1366         *p++ = hexdigit[(ucs >> 28) & 0xf];
   1367         *p++ = hexdigit[(ucs >> 24) & 0xf];
   1368         *p++ = hexdigit[(ucs >> 20) & 0xf];
   1369         *p++ = hexdigit[(ucs >> 16) & 0xf];
   1370         *p++ = hexdigit[(ucs >> 12) & 0xf];
   1371         *p++ = hexdigit[(ucs >> 8) & 0xf];
   1372         *p++ = hexdigit[(ucs >> 4) & 0xf];
   1373         *p++ = hexdigit[ucs & 0xf];
   1374         continue;
   1375         }
   1376         /* Fall through: isolated surrogates are copied as-is */
   1377         s--;
   1378         size++;
   1379     }
   1380 #endif
   1381     /* Map 16-bit characters to '\uxxxx' */
   1382     if (ch >= 256 || ch == '\\' || ch == '\n') {
   1383         *p++ = '\\';
   1384         *p++ = 'u';
   1385         *p++ = hexdigit[(ch >> 12) & 0xf];
   1386         *p++ = hexdigit[(ch >> 8) & 0xf];
   1387         *p++ = hexdigit[(ch >> 4) & 0xf];
   1388         *p++ = hexdigit[ch & 15];
   1389     }
   1390     /* Copy everything else as-is */
   1391     else
   1392         *p++ = (char) ch;
   1393     }
   1394     *p = '\0';
   1395     _PyString_Resize(&repr, p - q);
   1396     return repr;
   1397 }
   1398 
   1399 static int
   1400 save_unicode(Picklerobject *self, PyObject *args, int doput)
   1401 {
   1402     Py_ssize_t size, len;
   1403     PyObject *repr=0;
   1404 
   1405     if (!PyUnicode_Check(args))
   1406         return -1;
   1407 
   1408     if (!self->bin) {
   1409         char *repr_str;
   1410         static char string = UNICODE;
   1411 
   1412         repr = modified_EncodeRawUnicodeEscape(
   1413             PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
   1414         if (!repr)
   1415             return -1;
   1416 
   1417         if ((len = PyString_Size(repr)) < 0)
   1418             goto err;
   1419         repr_str = PyString_AS_STRING((PyStringObject *)repr);
   1420 
   1421         if (self->write_func(self, &string, 1) < 0)
   1422             goto err;
   1423 
   1424         if (self->write_func(self, repr_str, len) < 0)
   1425             goto err;
   1426 
   1427         if (self->write_func(self, "\n", 1) < 0)
   1428             goto err;
   1429 
   1430         Py_XDECREF(repr);
   1431     }
   1432     else {
   1433         int i;
   1434         char c_str[5];
   1435 
   1436         if (!( repr = PyUnicode_AsUTF8String(args)))
   1437             return -1;
   1438 
   1439         if ((size = PyString_Size(repr)) < 0)
   1440             goto err;
   1441         if (size > INT_MAX)
   1442             return -1;   /* string too large */
   1443 
   1444         c_str[0] = BINUNICODE;
   1445         for (i = 1; i < 5; i++)
   1446             c_str[i] = (int)(size >> ((i - 1) * 8));
   1447         len = 5;
   1448 
   1449         if (self->write_func(self, c_str, len) < 0)
   1450             goto err;
   1451 
   1452         if (size > 128 && Pdata_Check(self->file)) {
   1453             if (write_other(self, NULL, 0) < 0)
   1454                 goto err;
   1455             PDATA_APPEND(self->file, repr, -1);
   1456         }
   1457         else {
   1458             if (self->write_func(self, PyString_AS_STRING(repr),
   1459                                  size) < 0)
   1460                 goto err;
   1461         }
   1462 
   1463         Py_DECREF(repr);
   1464     }
   1465 
   1466     if (doput)
   1467         if (put(self, args) < 0)
   1468             return -1;
   1469 
   1470     return 0;
   1471 
   1472   err:
   1473     Py_XDECREF(repr);
   1474     return -1;
   1475 }
   1476 #endif
   1477 
   1478 /* A helper for save_tuple.  Push the len elements in tuple t on the stack. */
   1479 static int
   1480 store_tuple_elements(Picklerobject *self, PyObject *t, int len)
   1481 {
   1482     Py_ssize_t i;
   1483     int res = -1;       /* guilty until proved innocent */
   1484 
   1485     assert(PyTuple_Size(t) == len);
   1486 
   1487     for (i = 0; i < len; i++) {
   1488         PyObject *element = PyTuple_GET_ITEM(t, i);
   1489 
   1490         if (element == NULL)
   1491             goto finally;
   1492         if (save(self, element, 0) < 0)
   1493             goto finally;
   1494     }
   1495     res = 0;
   1496 
   1497   finally:
   1498     return res;
   1499 }
   1500 
   1501 /* Tuples are ubiquitous in the pickle protocols, so many techniques are
   1502  * used across protocols to minimize the space needed to pickle them.
   1503  * Tuples are also the only builtin immutable type that can be recursive
   1504  * (a tuple can be reached from itself), and that requires some subtle
   1505  * magic so that it works in all cases.  IOW, this is a long routine.
   1506  */
   1507 static int
   1508 save_tuple(Picklerobject *self, PyObject *args)
   1509 {
   1510     PyObject *py_tuple_id = NULL;
   1511     Py_ssize_t len, i;
   1512     int res = -1;
   1513 
   1514     static char tuple = TUPLE;
   1515     static char pop = POP;
   1516     static char pop_mark = POP_MARK;
   1517     static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
   1518 
   1519     if ((len = PyTuple_Size(args)) < 0)
   1520         goto finally;
   1521 
   1522     if (len == 0) {
   1523         char c_str[2];
   1524 
   1525         if (self->proto) {
   1526             c_str[0] = EMPTY_TUPLE;
   1527             len = 1;
   1528         }
   1529         else {
   1530             c_str[0] = MARK;
   1531             c_str[1] = TUPLE;
   1532             len = 2;
   1533         }
   1534         if (self->write_func(self, c_str, len) >= 0)
   1535             res = 0;
   1536         /* Don't memoize an empty tuple. */
   1537         goto finally;
   1538     }
   1539 
   1540     /* A non-empty tuple. */
   1541 
   1542     /* id(tuple) isn't in the memo now.  If it shows up there after
   1543      * saving the tuple elements, the tuple must be recursive, in
   1544      * which case we'll pop everything we put on the stack, and fetch
   1545      * its value from the memo.
   1546      */
   1547     py_tuple_id = PyLong_FromVoidPtr(args);
   1548     if (py_tuple_id == NULL)
   1549         goto finally;
   1550 
   1551     if (len <= 3 && self->proto >= 2) {
   1552         /* Use TUPLE{1,2,3} opcodes. */
   1553         if (store_tuple_elements(self, args, len) < 0)
   1554             goto finally;
   1555         if (PyDict_GetItem(self->memo, py_tuple_id)) {
   1556             /* pop the len elements */
   1557             for (i = 0; i < len; ++i)
   1558                 if (self->write_func(self, &pop, 1) < 0)
   1559                     goto finally;
   1560             /* fetch from memo */
   1561             if (get(self, py_tuple_id) < 0)
   1562                 goto finally;
   1563             res = 0;
   1564             goto finally;
   1565         }
   1566         /* Not recursive. */
   1567         if (self->write_func(self, len2opcode + len, 1) < 0)
   1568             goto finally;
   1569         goto memoize;
   1570     }
   1571 
   1572     /* proto < 2 and len > 0, or proto >= 2 and len > 3.
   1573      * Generate MARK elt1 elt2 ... TUPLE
   1574      */
   1575     if (self->write_func(self, &MARKv, 1) < 0)
   1576         goto finally;
   1577 
   1578     if (store_tuple_elements(self, args, len) < 0)
   1579         goto finally;
   1580 
   1581     if (PyDict_GetItem(self->memo, py_tuple_id)) {
   1582         /* pop the stack stuff we pushed */
   1583         if (self->bin) {
   1584             if (self->write_func(self, &pop_mark, 1) < 0)
   1585                 goto finally;
   1586         }
   1587         else {
   1588             /* Note that we pop one more than len, to remove
   1589              * the MARK too.
   1590              */
   1591             for (i = 0; i <= len; i++)
   1592                 if (self->write_func(self, &pop, 1) < 0)
   1593                     goto finally;
   1594         }
   1595         /* fetch from memo */
   1596         if (get(self, py_tuple_id) >= 0)
   1597             res = 0;
   1598         goto finally;
   1599     }
   1600 
   1601     /* Not recursive. */
   1602     if (self->write_func(self, &tuple, 1) < 0)
   1603         goto finally;
   1604 
   1605   memoize:
   1606     if (put(self, args) >= 0)
   1607         res = 0;
   1608 
   1609   finally:
   1610     Py_XDECREF(py_tuple_id);
   1611     return res;
   1612 }
   1613 
   1614 /* iter is an iterator giving items, and we batch up chunks of
   1615  *     MARK item item ... item APPENDS
   1616  * opcode sequences.  Calling code should have arranged to first create an
   1617  * empty list, or list-like object, for the APPENDS to operate on.
   1618  * Returns 0 on success, <0 on error.
   1619  */
   1620 static int
   1621 batch_list(Picklerobject *self, PyObject *iter)
   1622 {
   1623     PyObject *obj = NULL;
   1624     PyObject *firstitem = NULL;
   1625     int i, n;
   1626 
   1627     static char append = APPEND;
   1628     static char appends = APPENDS;
   1629 
   1630     assert(iter != NULL);
   1631 
   1632     if (self->proto == 0) {
   1633         /* APPENDS isn't available; do one at a time. */
   1634         for (;;) {
   1635             obj = PyIter_Next(iter);
   1636             if (obj == NULL) {
   1637                 if (PyErr_Occurred())
   1638                     return -1;
   1639                 break;
   1640             }
   1641             i = save(self, obj, 0);
   1642             Py_DECREF(obj);
   1643             if (i < 0)
   1644                 return -1;
   1645             if (self->write_func(self, &append, 1) < 0)
   1646                 return -1;
   1647         }
   1648         return 0;
   1649     }
   1650 
   1651     /* proto > 0:  write in batches of BATCHSIZE. */
   1652     do {
   1653         /* Get first item */
   1654         firstitem = PyIter_Next(iter);
   1655         if (firstitem == NULL) {
   1656             if (PyErr_Occurred())
   1657                 goto BatchFailed;
   1658 
   1659             /* nothing more to add */
   1660             break;
   1661         }
   1662 
   1663         /* Try to get a second item */
   1664         obj = PyIter_Next(iter);
   1665         if (obj == NULL) {
   1666             if (PyErr_Occurred())
   1667                 goto BatchFailed;
   1668 
   1669             /* Only one item to write */
   1670             if (save(self, firstitem, 0) < 0)
   1671                 goto BatchFailed;
   1672             if (self->write_func(self, &append, 1) < 0)
   1673                 goto BatchFailed;
   1674             Py_CLEAR(firstitem);
   1675             break;
   1676         }
   1677 
   1678         /* More than one item to write */
   1679 
   1680         /* Pump out MARK, items, APPENDS. */
   1681         if (self->write_func(self, &MARKv, 1) < 0)
   1682             goto BatchFailed;
   1683 
   1684         if (save(self, firstitem, 0) < 0)
   1685             goto BatchFailed;
   1686         Py_CLEAR(firstitem);
   1687         n = 1;
   1688 
   1689         /* Fetch and save up to BATCHSIZE items */
   1690         while (obj) {
   1691             if (save(self, obj, 0) < 0)
   1692                 goto BatchFailed;
   1693             Py_CLEAR(obj);
   1694             n += 1;
   1695 
   1696             if (n == BATCHSIZE)
   1697                 break;
   1698 
   1699             obj = PyIter_Next(iter);
   1700             if (obj == NULL) {
   1701                 if (PyErr_Occurred())
   1702                     goto BatchFailed;
   1703                 break;
   1704             }
   1705         }
   1706 
   1707         if (self->write_func(self, &appends, 1) < 0)
   1708             goto BatchFailed;
   1709 
   1710     } while (n == BATCHSIZE);
   1711     return 0;
   1712 
   1713 BatchFailed:
   1714     Py_XDECREF(firstitem);
   1715     Py_XDECREF(obj);
   1716     return -1;
   1717 }
   1718 
   1719 static int
   1720 save_list(Picklerobject *self, PyObject *args)
   1721 {
   1722     int res = -1;
   1723     char s[3];
   1724     Py_ssize_t len;
   1725     PyObject *iter;
   1726 
   1727     if (self->fast && !fast_save_enter(self, args))
   1728         goto finally;
   1729 
   1730     /* Create an empty list. */
   1731     if (self->bin) {
   1732         s[0] = EMPTY_LIST;
   1733         len = 1;
   1734     }
   1735     else {
   1736         s[0] = MARK;
   1737         s[1] = LIST;
   1738         len = 2;
   1739     }
   1740 
   1741     if (self->write_func(self, s, len) < 0)
   1742         goto finally;
   1743 
   1744     /* Get list length, and bow out early if empty. */
   1745     if ((len = PyList_Size(args)) < 0)
   1746         goto finally;
   1747 
   1748     /* Memoize. */
   1749     if (len == 0) {
   1750         if (put(self, args) >= 0)
   1751             res = 0;
   1752         goto finally;
   1753     }
   1754     if (put2(self, args) < 0)
   1755         goto finally;
   1756 
   1757     /* Materialize the list elements. */
   1758     iter = PyObject_GetIter(args);
   1759     if (iter == NULL)
   1760         goto finally;
   1761 
   1762     if (Py_EnterRecursiveCall(" while pickling an object") == 0)
   1763     {
   1764         res = batch_list(self, iter);
   1765         Py_LeaveRecursiveCall();
   1766     }
   1767     Py_DECREF(iter);
   1768 
   1769   finally:
   1770     if (self->fast && !fast_save_leave(self, args))
   1771         res = -1;
   1772 
   1773     return res;
   1774 }
   1775 
   1776 
   1777 /* iter is an iterator giving (key, value) pairs, and we batch up chunks of
   1778  *     MARK key value ... key value SETITEMS
   1779  * opcode sequences.  Calling code should have arranged to first create an
   1780  * empty dict, or dict-like object, for the SETITEMS to operate on.
   1781  * Returns 0 on success, <0 on error.
   1782  *
   1783  * This is very much like batch_list().  The difference between saving
   1784  * elements directly, and picking apart two-tuples, is so long-winded at
   1785  * the C level, though, that attempts to combine these routines were too
   1786  * ugly to bear.
   1787  */
   1788 static int
   1789 batch_dict(Picklerobject *self, PyObject *iter)
   1790 {
   1791     PyObject *p = NULL;
   1792     PyObject *firstitem = NULL;
   1793     int i, n;
   1794 
   1795     static char setitem = SETITEM;
   1796     static char setitems = SETITEMS;
   1797 
   1798     assert(iter != NULL);
   1799 
   1800     if (self->proto == 0) {
   1801         /* SETITEMS isn't available; do one at a time. */
   1802         for (;;) {
   1803             p = PyIter_Next(iter);
   1804             if (p == NULL) {
   1805                 if (PyErr_Occurred())
   1806                     return -1;
   1807                 break;
   1808             }
   1809             if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
   1810                 PyErr_SetString(PyExc_TypeError, "dict items "
   1811                     "iterator must return 2-tuples");
   1812                 return -1;
   1813             }
   1814             i = save(self, PyTuple_GET_ITEM(p, 0), 0);
   1815             if (i >= 0)
   1816                 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
   1817             Py_DECREF(p);
   1818             if (i < 0)
   1819                 return -1;
   1820             if (self->write_func(self, &setitem, 1) < 0)
   1821                 return -1;
   1822         }
   1823         return 0;
   1824     }
   1825 
   1826     /* proto > 0:  write in batches of BATCHSIZE. */
   1827     do {
   1828         /* Get first item */
   1829         firstitem = PyIter_Next(iter);
   1830         if (firstitem == NULL) {
   1831             if (PyErr_Occurred())
   1832                 goto BatchFailed;
   1833 
   1834             /* nothing more to add */
   1835             break;
   1836         }
   1837         if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
   1838             PyErr_SetString(PyExc_TypeError, "dict items "
   1839                             "iterator must return 2-tuples");
   1840             goto BatchFailed;
   1841         }
   1842 
   1843         /* Try to get a second item */
   1844         p = PyIter_Next(iter);
   1845         if (p == NULL) {
   1846             if (PyErr_Occurred())
   1847                 goto BatchFailed;
   1848 
   1849             /* Only one item to write */
   1850             if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
   1851                 goto BatchFailed;
   1852             if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
   1853                 goto BatchFailed;
   1854             if (self->write_func(self, &setitem, 1) < 0)
   1855                 goto BatchFailed;
   1856             Py_CLEAR(firstitem);
   1857             break;
   1858         }
   1859 
   1860         /* More than one item to write */
   1861 
   1862         /* Pump out MARK, items, SETITEMS. */
   1863         if (self->write_func(self, &MARKv, 1) < 0)
   1864             goto BatchFailed;
   1865 
   1866         if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
   1867             goto BatchFailed;
   1868         if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
   1869             goto BatchFailed;
   1870         Py_CLEAR(firstitem);
   1871         n = 1;
   1872 
   1873         /* Fetch and save up to BATCHSIZE items */
   1874         while (p) {
   1875             if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
   1876                 PyErr_SetString(PyExc_TypeError, "dict items "
   1877                     "iterator must return 2-tuples");
   1878                 goto BatchFailed;
   1879             }
   1880             if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
   1881                 goto BatchFailed;
   1882             if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
   1883                 goto BatchFailed;
   1884             Py_CLEAR(p);
   1885             n += 1;
   1886 
   1887             if (n == BATCHSIZE)
   1888                 break;
   1889 
   1890             p = PyIter_Next(iter);
   1891             if (p == NULL) {
   1892                 if (PyErr_Occurred())
   1893                     goto BatchFailed;
   1894                 break;
   1895             }
   1896         }
   1897 
   1898         if (self->write_func(self, &setitems, 1) < 0)
   1899             goto BatchFailed;
   1900 
   1901     } while (n == BATCHSIZE);
   1902     return 0;
   1903 
   1904 BatchFailed:
   1905     Py_XDECREF(firstitem);
   1906     Py_XDECREF(p);
   1907     return -1;
   1908 }
   1909 
   1910 /* This is a variant of batch_dict() above that specializes for dicts, with no
   1911  * support for dict subclasses. Like batch_dict(), we batch up chunks of
   1912  *     MARK key value ... key value SETITEMS
   1913  * opcode sequences.  Calling code should have arranged to first create an
   1914  * empty dict, or dict-like object, for the SETITEMS to operate on.
   1915  * Returns 0 on success, -1 on error.
   1916  *
   1917  * Note that this currently doesn't work for protocol 0.
   1918  */
   1919 static int
   1920 batch_dict_exact(Picklerobject *self, PyObject *obj)
   1921 {
   1922     PyObject *key = NULL, *value = NULL;
   1923     int i;
   1924     Py_ssize_t dict_size, ppos = 0;
   1925 
   1926     static char setitem = SETITEM;
   1927     static char setitems = SETITEMS;
   1928 
   1929     assert(obj != NULL);
   1930     assert(self->proto > 0);
   1931 
   1932     dict_size = PyDict_Size(obj);
   1933 
   1934     /* Special-case len(d) == 1 to save space. */
   1935     if (dict_size == 1) {
   1936         PyDict_Next(obj, &ppos, &key, &value);
   1937         if (save(self, key, 0) < 0)
   1938             return -1;
   1939         if (save(self, value, 0) < 0)
   1940             return -1;
   1941         if (self->write_func(self, &setitem, 1) < 0)
   1942             return -1;
   1943         return 0;
   1944     }
   1945 
   1946     /* Write in batches of BATCHSIZE. */
   1947     do {
   1948         i = 0;
   1949         if (self->write_func(self, &MARKv, 1) < 0)
   1950             return -1;
   1951         while (PyDict_Next(obj, &ppos, &key, &value)) {
   1952             if (save(self, key, 0) < 0)
   1953                 return -1;
   1954             if (save(self, value, 0) < 0)
   1955                 return -1;
   1956             if (++i == BATCHSIZE)
   1957                 break;
   1958         }
   1959         if (self->write_func(self, &setitems, 1) < 0)
   1960             return -1;
   1961         if (PyDict_Size(obj) != dict_size) {
   1962             PyErr_Format(
   1963                 PyExc_RuntimeError,
   1964                 "dictionary changed size during iteration");
   1965             return -1;
   1966         }
   1967 
   1968     } while (i == BATCHSIZE);
   1969     return 0;
   1970 }
   1971 
   1972 static int
   1973 save_dict(Picklerobject *self, PyObject *args)
   1974 {
   1975     int res = -1;
   1976     char s[3];
   1977     Py_ssize_t len;
   1978 
   1979     if (self->fast && !fast_save_enter(self, args))
   1980         goto finally;
   1981 
   1982     /* Create an empty dict. */
   1983     if (self->bin) {
   1984         s[0] = EMPTY_DICT;
   1985         len = 1;
   1986     }
   1987     else {
   1988         s[0] = MARK;
   1989         s[1] = DICT;
   1990         len = 2;
   1991     }
   1992 
   1993     if (self->write_func(self, s, len) < 0)
   1994         goto finally;
   1995 
   1996     /* Get dict size, and bow out early if empty. */
   1997     if ((len = PyDict_Size(args)) < 0)
   1998         goto finally;
   1999 
   2000     if (len == 0) {
   2001         if (put(self, args) >= 0)
   2002             res = 0;
   2003         goto finally;
   2004     }
   2005     if (put2(self, args) < 0)
   2006         goto finally;
   2007 
   2008     /* Materialize the dict items. */
   2009     if (PyDict_CheckExact(args) && self->proto > 0) {
   2010         /* We can take certain shortcuts if we know this is a dict and
   2011            not a dict subclass. */
   2012         if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
   2013             res = batch_dict_exact(self, args);
   2014             Py_LeaveRecursiveCall();
   2015         }
   2016     } else {
   2017         PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
   2018         if (iter == NULL)
   2019             goto finally;
   2020         if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
   2021             res = batch_dict(self, iter);
   2022             Py_LeaveRecursiveCall();
   2023         }
   2024         Py_DECREF(iter);
   2025     }
   2026 
   2027   finally:
   2028     if (self->fast && !fast_save_leave(self, args))
   2029         res = -1;
   2030 
   2031     return res;
   2032 }
   2033 
   2034 
   2035 static int
   2036 save_inst(Picklerobject *self, PyObject *args)
   2037 {
   2038     PyObject *class = 0, *module = 0, *name = 0, *state = 0,
   2039         *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
   2040     char *module_str, *name_str;
   2041     int module_size, name_size, res = -1;
   2042 
   2043     static char inst = INST, obj = OBJ, build = BUILD;
   2044 
   2045     if (self->fast && !fast_save_enter(self, args))
   2046         goto finally;
   2047 
   2048     if (self->write_func(self, &MARKv, 1) < 0)
   2049         goto finally;
   2050 
   2051     if (!( class = PyObject_GetAttr(args, __class___str)))
   2052         goto finally;
   2053 
   2054     if (self->bin) {
   2055         if (save(self, class, 0) < 0)
   2056             goto finally;
   2057     }
   2058 
   2059     if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
   2060         PyObject *element = 0;
   2061         Py_ssize_t i, len;
   2062 
   2063         if (!( class_args =
   2064                PyObject_Call(getinitargs_func, empty_tuple, NULL)))
   2065             goto finally;
   2066 
   2067         if ((len = PyObject_Size(class_args)) < 0)
   2068             goto finally;
   2069 
   2070         for (i = 0; i < len; i++) {
   2071             if (!( element = PySequence_GetItem(class_args, i)))
   2072                 goto finally;
   2073 
   2074             if (save(self, element, 0) < 0) {
   2075                 Py_DECREF(element);
   2076                 goto finally;
   2077             }
   2078 
   2079             Py_DECREF(element);
   2080         }
   2081     }
   2082     else {
   2083         if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2084             PyErr_Clear();
   2085         else
   2086             goto finally;
   2087     }
   2088 
   2089     if (!self->bin) {
   2090         if (!( name = ((PyClassObject *)class)->cl_name ))  {
   2091             PyErr_SetString(PicklingError, "class has no name");
   2092             goto finally;
   2093         }
   2094 
   2095         if (!( module = whichmodule(class, name)))
   2096             goto finally;
   2097 
   2098 
   2099         if ((module_size = PyString_Size(module)) < 0 ||
   2100             (name_size = PyString_Size(name)) < 0)
   2101             goto finally;
   2102 
   2103         module_str = PyString_AS_STRING((PyStringObject *)module);
   2104         name_str   = PyString_AS_STRING((PyStringObject *)name);
   2105 
   2106         if (self->write_func(self, &inst, 1) < 0)
   2107             goto finally;
   2108 
   2109         if (self->write_func(self, module_str, module_size) < 0)
   2110             goto finally;
   2111 
   2112         if (self->write_func(self, "\n", 1) < 0)
   2113             goto finally;
   2114 
   2115         if (self->write_func(self, name_str, name_size) < 0)
   2116             goto finally;
   2117 
   2118         if (self->write_func(self, "\n", 1) < 0)
   2119             goto finally;
   2120     }
   2121     else if (self->write_func(self, &obj, 1) < 0) {
   2122         goto finally;
   2123     }
   2124 
   2125     if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
   2126         state = PyObject_Call(getstate_func, empty_tuple, NULL);
   2127         if (!state)
   2128             goto finally;
   2129     }
   2130     else {
   2131         if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2132             PyErr_Clear();
   2133         else
   2134             goto finally;
   2135 
   2136         if (!( state = PyObject_GetAttr(args, __dict___str)))  {
   2137             if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2138                 PyErr_Clear();
   2139             else
   2140                 goto finally;
   2141             res = 0;
   2142             goto finally;
   2143         }
   2144     }
   2145 
   2146     if (!PyDict_Check(state)) {
   2147         if (put2(self, args) < 0)
   2148             goto finally;
   2149     }
   2150     else {
   2151         if (put(self, args) < 0)
   2152             goto finally;
   2153     }
   2154 
   2155     if (save(self, state, 0) < 0)
   2156         goto finally;
   2157 
   2158     if (self->write_func(self, &build, 1) < 0)
   2159         goto finally;
   2160 
   2161     res = 0;
   2162 
   2163   finally:
   2164     if (self->fast && !fast_save_leave(self, args))
   2165         res = -1;
   2166 
   2167     Py_XDECREF(module);
   2168     Py_XDECREF(class);
   2169     Py_XDECREF(state);
   2170     Py_XDECREF(getinitargs_func);
   2171     Py_XDECREF(getstate_func);
   2172     Py_XDECREF(class_args);
   2173 
   2174     return res;
   2175 }
   2176 
   2177 
   2178 static int
   2179 save_global(Picklerobject *self, PyObject *args, PyObject *name)
   2180 {
   2181     PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
   2182     char *name_str, *module_str;
   2183     int module_size, name_size, res = -1;
   2184 
   2185     static char global = GLOBAL;
   2186 
   2187     if (name) {
   2188         global_name = name;
   2189         Py_INCREF(global_name);
   2190     }
   2191     else {
   2192         if (!( global_name = PyObject_GetAttr(args, __name___str)))
   2193             goto finally;
   2194     }
   2195 
   2196     if (!( module = whichmodule(args, global_name)))
   2197         goto finally;
   2198 
   2199     if ((module_size = PyString_Size(module)) < 0 ||
   2200         (name_size = PyString_Size(global_name)) < 0)
   2201         goto finally;
   2202 
   2203     module_str = PyString_AS_STRING((PyStringObject *)module);
   2204     name_str   = PyString_AS_STRING((PyStringObject *)global_name);
   2205 
   2206     /* XXX This can be doing a relative import.  Clearly it shouldn't,
   2207        but I don't know how to stop it. :-( */
   2208     mod = PyImport_ImportModule(module_str);
   2209     if (mod == NULL) {
   2210         cPickle_ErrFormat(PicklingError,
   2211                           "Can't pickle %s: import of module %s "
   2212                           "failed",
   2213                           "OS", args, module);
   2214         goto finally;
   2215     }
   2216     klass = PyObject_GetAttrString(mod, name_str);
   2217     if (klass == NULL) {
   2218         cPickle_ErrFormat(PicklingError,
   2219                           "Can't pickle %s: attribute lookup %s.%s "
   2220                           "failed",
   2221                           "OSS", args, module, global_name);
   2222         goto finally;
   2223     }
   2224     if (klass != args) {
   2225         Py_DECREF(klass);
   2226         cPickle_ErrFormat(PicklingError,
   2227                           "Can't pickle %s: it's not the same object "
   2228                                 "as %s.%s",
   2229                           "OSS", args, module, global_name);
   2230         goto finally;
   2231     }
   2232     Py_DECREF(klass);
   2233 
   2234     if (self->proto >= 2) {
   2235         /* See whether this is in the extension registry, and if
   2236          * so generate an EXT opcode.
   2237          */
   2238         PyObject *py_code;              /* extension code as Python object */
   2239         long code;                      /* extension code as C value */
   2240         char c_str[5];
   2241         int n;
   2242 
   2243         PyTuple_SET_ITEM(two_tuple, 0, module);
   2244         PyTuple_SET_ITEM(two_tuple, 1, global_name);
   2245         py_code = PyDict_GetItem(extension_registry, two_tuple);
   2246         if (py_code == NULL)
   2247             goto gen_global;                    /* not registered */
   2248 
   2249         /* Verify py_code has the right type and value. */
   2250         if (!PyInt_Check(py_code)) {
   2251             cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
   2252                 "extension code %s isn't an integer",
   2253                 "OO", args, py_code);
   2254             goto finally;
   2255         }
   2256         code = PyInt_AS_LONG(py_code);
   2257         if (code <= 0 ||  code > 0x7fffffffL) {
   2258             cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
   2259                 "extension code %ld is out of range",
   2260                 "Ol", args, code);
   2261             goto finally;
   2262         }
   2263 
   2264         /* Generate an EXT opcode. */
   2265         if (code <= 0xff) {
   2266             c_str[0] = EXT1;
   2267             c_str[1] = (char)code;
   2268             n = 2;
   2269         }
   2270         else if (code <= 0xffff) {
   2271             c_str[0] = EXT2;
   2272             c_str[1] = (char)(code & 0xff);
   2273             c_str[2] = (char)((code >> 8) & 0xff);
   2274             n = 3;
   2275         }
   2276         else {
   2277             c_str[0] = EXT4;
   2278             c_str[1] = (char)(code & 0xff);
   2279             c_str[2] = (char)((code >> 8) & 0xff);
   2280             c_str[3] = (char)((code >> 16) & 0xff);
   2281             c_str[4] = (char)((code >> 24) & 0xff);
   2282             n = 5;
   2283         }
   2284 
   2285         if (self->write_func(self, c_str, n) >= 0)
   2286             res = 0;
   2287         goto finally;           /* and don't memoize */
   2288     }
   2289 
   2290   gen_global:
   2291     if (self->write_func(self, &global, 1) < 0)
   2292         goto finally;
   2293 
   2294     if (self->write_func(self, module_str, module_size) < 0)
   2295         goto finally;
   2296 
   2297     if (self->write_func(self, "\n", 1) < 0)
   2298         goto finally;
   2299 
   2300     if (self->write_func(self, name_str, name_size) < 0)
   2301         goto finally;
   2302 
   2303     if (self->write_func(self, "\n", 1) < 0)
   2304         goto finally;
   2305 
   2306     if (put(self, args) < 0)
   2307         goto finally;
   2308 
   2309     res = 0;
   2310 
   2311   finally:
   2312     Py_XDECREF(module);
   2313     Py_XDECREF(global_name);
   2314     Py_XDECREF(mod);
   2315 
   2316     return res;
   2317 }
   2318 
   2319 static int
   2320 save_pers(Picklerobject *self, PyObject *args, PyObject *f)
   2321 {
   2322     PyObject *pid = 0;
   2323     Py_ssize_t size;
   2324     int res = -1;
   2325 
   2326     static char persid = PERSID, binpersid = BINPERSID;
   2327 
   2328     Py_INCREF(args);
   2329     ARG_TUP(self, args);
   2330     if (self->arg) {
   2331         pid = PyObject_Call(f, self->arg, NULL);
   2332         FREE_ARG_TUP(self);
   2333     }
   2334     if (! pid) return -1;
   2335 
   2336     if (pid != Py_None) {
   2337         if (!self->bin) {
   2338             if (!PyString_Check(pid)) {
   2339                 PyErr_SetString(PicklingError,
   2340                                 "persistent id must be string");
   2341                 goto finally;
   2342             }
   2343 
   2344             if (self->write_func(self, &persid, 1) < 0)
   2345                 goto finally;
   2346 
   2347             if ((size = PyString_Size(pid)) < 0)
   2348                 goto finally;
   2349 
   2350             if (self->write_func(self,
   2351                                  PyString_AS_STRING(
   2352                                     (PyStringObject *)pid),
   2353                                  size) < 0)
   2354                 goto finally;
   2355 
   2356             if (self->write_func(self, "\n", 1) < 0)
   2357                 goto finally;
   2358 
   2359             res = 1;
   2360             goto finally;
   2361         }
   2362         else if (save(self, pid, 1) >= 0) {
   2363             if (self->write_func(self, &binpersid, 1) < 0)
   2364                 res = -1;
   2365             else
   2366                 res = 1;
   2367         }
   2368 
   2369         goto finally;
   2370     }
   2371 
   2372     res = 0;
   2373 
   2374   finally:
   2375     Py_XDECREF(pid);
   2376 
   2377     return res;
   2378 }
   2379 
   2380 /* We're saving ob, and args is the 2-thru-5 tuple returned by the
   2381  * appropriate __reduce__ method for ob.
   2382  */
   2383 static int
   2384 save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
   2385 {
   2386     PyObject *callable;
   2387     PyObject *argtup;
   2388     PyObject *state = NULL;
   2389     PyObject *listitems = Py_None;
   2390     PyObject *dictitems = Py_None;
   2391     Py_ssize_t size;
   2392 
   2393     int use_newobj = self->proto >= 2;
   2394 
   2395     static char reduce = REDUCE;
   2396     static char build = BUILD;
   2397     static char newobj = NEWOBJ;
   2398 
   2399     size = PyTuple_Size(args);
   2400     if (size < 2 || size > 5) {
   2401         cPickle_ErrFormat(PicklingError, "tuple returned by "
   2402             "%s must contain 2 through 5 elements",
   2403             "O", fn);
   2404         return -1;
   2405     }
   2406 
   2407     if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
   2408                             &callable,
   2409                             &argtup,
   2410                             &state,
   2411                             &listitems,
   2412                             &dictitems))
   2413         return -1;
   2414 
   2415     if (!PyTuple_Check(argtup)) {
   2416         cPickle_ErrFormat(PicklingError, "Second element of "
   2417             "tuple returned by %s must be a tuple",
   2418             "O", fn);
   2419         return -1;
   2420     }
   2421 
   2422     if (state == Py_None)
   2423         state = NULL;
   2424 
   2425     if (listitems == Py_None)
   2426         listitems = NULL;
   2427     else if (!PyIter_Check(listitems)) {
   2428         cPickle_ErrFormat(PicklingError, "Fourth element of "
   2429             "tuple returned by %s must be an iterator, not %s",
   2430             "Os", fn, Py_TYPE(listitems)->tp_name);
   2431         return -1;
   2432     }
   2433 
   2434     if (dictitems == Py_None)
   2435         dictitems = NULL;
   2436     else if (!PyIter_Check(dictitems)) {
   2437         cPickle_ErrFormat(PicklingError, "Fifth element of "
   2438             "tuple returned by %s must be an iterator, not %s",
   2439             "Os", fn, Py_TYPE(dictitems)->tp_name);
   2440         return -1;
   2441     }
   2442 
   2443     /* Protocol 2 special case: if callable's name is __newobj__, use
   2444      * NEWOBJ.  This consumes a lot of code.
   2445      */
   2446     if (use_newobj) {
   2447         PyObject *temp = PyObject_GetAttr(callable, __name___str);
   2448 
   2449         if (temp == NULL) {
   2450             if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2451                 PyErr_Clear();
   2452             else
   2453                 return -1;
   2454             use_newobj = 0;
   2455         }
   2456         else {
   2457             use_newobj = PyString_Check(temp) &&
   2458                          strcmp(PyString_AS_STRING(temp),
   2459                                 "__newobj__") == 0;
   2460             Py_DECREF(temp);
   2461         }
   2462     }
   2463     if (use_newobj) {
   2464         PyObject *cls;
   2465         PyObject *newargtup;
   2466         Py_ssize_t n, i;
   2467 
   2468         /* Sanity checks. */
   2469         n = PyTuple_Size(argtup);
   2470         if (n < 1) {
   2471             PyErr_SetString(PicklingError, "__newobj__ arglist "
   2472                 "is empty");
   2473             return -1;
   2474         }
   2475 
   2476         cls = PyTuple_GET_ITEM(argtup, 0);
   2477         if (! PyObject_HasAttrString(cls, "__new__")) {
   2478             PyErr_SetString(PicklingError, "args[0] from "
   2479                 "__newobj__ args has no __new__");
   2480             return -1;
   2481         }
   2482 
   2483         /* XXX How could ob be NULL? */
   2484         if (ob != NULL) {
   2485             PyObject *ob_dot_class;
   2486 
   2487             ob_dot_class = PyObject_GetAttr(ob, __class___str);
   2488             if (ob_dot_class == NULL) {
   2489                 if (PyErr_ExceptionMatches(
   2490                             PyExc_AttributeError))
   2491                     PyErr_Clear();
   2492                 else
   2493                     return -1;
   2494             }
   2495             i = ob_dot_class != cls; /* true iff a problem */
   2496             Py_XDECREF(ob_dot_class);
   2497             if (i) {
   2498                 PyErr_SetString(PicklingError, "args[0] from "
   2499                     "__newobj__ args has the wrong class");
   2500                 return -1;
   2501             }
   2502         }
   2503 
   2504         /* Save the class and its __new__ arguments. */
   2505         if (save(self, cls, 0) < 0)
   2506             return -1;
   2507 
   2508         newargtup = PyTuple_New(n-1);  /* argtup[1:] */
   2509         if (newargtup == NULL)
   2510             return -1;
   2511         for (i = 1; i < n; ++i) {
   2512             PyObject *temp = PyTuple_GET_ITEM(argtup, i);
   2513             Py_INCREF(temp);
   2514             PyTuple_SET_ITEM(newargtup, i-1, temp);
   2515         }
   2516         i = save(self, newargtup, 0);
   2517         Py_DECREF(newargtup);
   2518         if (i < 0)
   2519             return -1;
   2520 
   2521         /* Add NEWOBJ opcode. */
   2522         if (self->write_func(self, &newobj, 1) < 0)
   2523             return -1;
   2524     }
   2525     else {
   2526         /* Not using NEWOBJ. */
   2527         if (save(self, callable, 0) < 0 ||
   2528             save(self, argtup, 0) < 0 ||
   2529             self->write_func(self, &reduce, 1) < 0)
   2530             return -1;
   2531     }
   2532 
   2533     /* Memoize. */
   2534     /* XXX How can ob be NULL? */
   2535     if (ob != NULL) {
   2536         if (state && !PyDict_Check(state)) {
   2537             if (put2(self, ob) < 0)
   2538                 return -1;
   2539         }
   2540         else if (put(self, ob) < 0)
   2541                         return -1;
   2542     }
   2543 
   2544 
   2545     if (listitems && batch_list(self, listitems) < 0)
   2546         return -1;
   2547 
   2548     if (dictitems && batch_dict(self, dictitems) < 0)
   2549         return -1;
   2550 
   2551     if (state) {
   2552         if (save(self, state, 0) < 0 ||
   2553             self->write_func(self, &build, 1) < 0)
   2554             return -1;
   2555     }
   2556 
   2557     return 0;
   2558 }
   2559 
   2560 static int
   2561 save(Picklerobject *self, PyObject *args, int pers_save)
   2562 {
   2563     PyTypeObject *type;
   2564     PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
   2565     int res = -1;
   2566     int tmp;
   2567 
   2568     if (Py_EnterRecursiveCall(" while pickling an object"))
   2569         return -1;
   2570 
   2571     if (!pers_save && self->pers_func) {
   2572         if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
   2573             res = tmp;
   2574             goto finally;
   2575         }
   2576     }
   2577 
   2578     if (args == Py_None) {
   2579         res = save_none(self, args);
   2580         goto finally;
   2581     }
   2582 
   2583     type = Py_TYPE(args);
   2584 
   2585     switch (type->tp_name[0]) {
   2586     case 'b':
   2587         if (args == Py_False || args == Py_True) {
   2588             res = save_bool(self, args);
   2589             goto finally;
   2590         }
   2591         break;
   2592     case 'i':
   2593         if (type == &PyInt_Type) {
   2594             res = save_int(self, args);
   2595             goto finally;
   2596         }
   2597         break;
   2598 
   2599     case 'l':
   2600         if (type == &PyLong_Type) {
   2601             res = save_long(self, args);
   2602             goto finally;
   2603         }
   2604         break;
   2605 
   2606     case 'f':
   2607         if (type == &PyFloat_Type) {
   2608             res = save_float(self, args);
   2609             goto finally;
   2610         }
   2611         break;
   2612 
   2613     case 't':
   2614         if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
   2615             res = save_tuple(self, args);
   2616             goto finally;
   2617         }
   2618         break;
   2619 
   2620     case 's':
   2621         if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
   2622             res = save_string(self, args, 0);
   2623             goto finally;
   2624         }
   2625         break;
   2626 
   2627 #ifdef Py_USING_UNICODE
   2628     case 'u':
   2629         if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
   2630             res = save_unicode(self, args, 0);
   2631             goto finally;
   2632         }
   2633         break;
   2634 #endif
   2635     }
   2636 
   2637     if (Py_REFCNT(args) > 1) {
   2638         if (!( py_ob_id = PyLong_FromVoidPtr(args)))
   2639             goto finally;
   2640 
   2641         if (PyDict_GetItem(self->memo, py_ob_id)) {
   2642             if (get(self, py_ob_id) < 0)
   2643                 goto finally;
   2644 
   2645             res = 0;
   2646             goto finally;
   2647         }
   2648     }
   2649 
   2650     switch (type->tp_name[0]) {
   2651     case 's':
   2652         if (type == &PyString_Type) {
   2653             res = save_string(self, args, 1);
   2654             goto finally;
   2655         }
   2656         break;
   2657 
   2658 #ifdef Py_USING_UNICODE
   2659     case 'u':
   2660         if (type == &PyUnicode_Type) {
   2661             res = save_unicode(self, args, 1);
   2662             goto finally;
   2663         }
   2664         break;
   2665 #endif
   2666 
   2667     case 't':
   2668         if (type == &PyTuple_Type) {
   2669             res = save_tuple(self, args);
   2670             goto finally;
   2671         }
   2672         if (type == &PyType_Type) {
   2673             res = save_global(self, args, NULL);
   2674             goto finally;
   2675         }
   2676         break;
   2677 
   2678     case 'l':
   2679         if (type == &PyList_Type) {
   2680             res = save_list(self, args);
   2681             goto finally;
   2682         }
   2683         break;
   2684 
   2685     case 'd':
   2686         if (type == &PyDict_Type) {
   2687             res = save_dict(self, args);
   2688             goto finally;
   2689         }
   2690         break;
   2691 
   2692     case 'i':
   2693         if (type == &PyInstance_Type) {
   2694             res = save_inst(self, args);
   2695             goto finally;
   2696         }
   2697         break;
   2698 
   2699     case 'c':
   2700         if (type == &PyClass_Type) {
   2701             res = save_global(self, args, NULL);
   2702             goto finally;
   2703         }
   2704         break;
   2705 
   2706     case 'f':
   2707         if (type == &PyFunction_Type) {
   2708             res = save_global(self, args, NULL);
   2709             if (res && PyErr_ExceptionMatches(PickleError)) {
   2710                 /* fall back to reduce */
   2711                 PyErr_Clear();
   2712                 break;
   2713             }
   2714             goto finally;
   2715         }
   2716         break;
   2717 
   2718     case 'b':
   2719         if (type == &PyCFunction_Type) {
   2720             res = save_global(self, args, NULL);
   2721             goto finally;
   2722         }
   2723     }
   2724 
   2725     if (!pers_save && self->inst_pers_func) {
   2726         if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
   2727             res = tmp;
   2728             goto finally;
   2729         }
   2730     }
   2731 
   2732     /* Get a reduction callable, and call it.  This may come from
   2733      * copy_reg.dispatch_table, the object's __reduce_ex__ method,
   2734      * or the object's __reduce__ method.
   2735      */
   2736     __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
   2737     if (__reduce__ != NULL) {
   2738         Py_INCREF(__reduce__);
   2739         Py_INCREF(args);
   2740         ARG_TUP(self, args);
   2741         if (self->arg) {
   2742             t = PyObject_Call(__reduce__, self->arg, NULL);
   2743             FREE_ARG_TUP(self);
   2744         }
   2745     }
   2746     else {
   2747         if (PyType_IsSubtype(type, &PyType_Type)) {
   2748             res = save_global(self, args, NULL);
   2749             goto finally;
   2750         }
   2751 
   2752         /* Check for a __reduce_ex__ method. */
   2753         __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
   2754         if (__reduce__ != NULL) {
   2755             t = PyInt_FromLong(self->proto);
   2756             if (t != NULL) {
   2757                 ARG_TUP(self, t);
   2758                 t = NULL;
   2759                 if (self->arg) {
   2760                     t = PyObject_Call(__reduce__,
   2761                                       self->arg, NULL);
   2762                     FREE_ARG_TUP(self);
   2763                 }
   2764             }
   2765         }
   2766         else {
   2767             if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2768                 PyErr_Clear();
   2769             else
   2770                 goto finally;
   2771             /* Check for a __reduce__ method. */
   2772             __reduce__ = PyObject_GetAttr(args, __reduce___str);
   2773             if (__reduce__ != NULL) {
   2774                 t = PyObject_Call(__reduce__,
   2775                                   empty_tuple, NULL);
   2776             }
   2777             else {
   2778                 PyErr_SetObject(UnpickleableError, args);
   2779                 goto finally;
   2780             }
   2781         }
   2782     }
   2783 
   2784     if (t == NULL)
   2785         goto finally;
   2786 
   2787     if (PyString_Check(t)) {
   2788         res = save_global(self, args, t);
   2789         goto finally;
   2790     }
   2791 
   2792     if (!PyTuple_Check(t)) {
   2793         cPickle_ErrFormat(PicklingError, "Value returned by "
   2794                         "%s must be string or tuple",
   2795                         "O", __reduce__);
   2796         goto finally;
   2797     }
   2798 
   2799     res = save_reduce(self, t, __reduce__, args);
   2800 
   2801   finally:
   2802     Py_LeaveRecursiveCall();
   2803     Py_XDECREF(py_ob_id);
   2804     Py_XDECREF(__reduce__);
   2805     Py_XDECREF(t);
   2806 
   2807     return res;
   2808 }
   2809 
   2810 
   2811 static int
   2812 dump(Picklerobject *self, PyObject *args)
   2813 {
   2814     static char stop = STOP;
   2815 
   2816     if (self->proto >= 2) {
   2817         char bytes[2];
   2818 
   2819         bytes[0] = PROTO;
   2820         assert(self->proto >= 0 && self->proto < 256);
   2821         bytes[1] = (char)self->proto;
   2822         if (self->write_func(self, bytes, 2) < 0)
   2823             return -1;
   2824     }
   2825 
   2826     if (save(self, args, 0) < 0)
   2827         return -1;
   2828 
   2829     if (self->write_func(self, &stop, 1) < 0)
   2830         return -1;
   2831 
   2832     if (self->write_func(self, NULL, 0) < 0)
   2833         return -1;
   2834 
   2835     return 0;
   2836 }
   2837 
   2838 static PyObject *
   2839 Pickle_clear_memo(Picklerobject *self, PyObject *args)
   2840 {
   2841     if (self->memo)
   2842         PyDict_Clear(self->memo);
   2843     Py_INCREF(Py_None);
   2844     return Py_None;
   2845 }
   2846 
   2847 static PyObject *
   2848 Pickle_getvalue(Picklerobject *self, PyObject *args)
   2849 {
   2850     Py_ssize_t l, i, rsize, ssize, clear=1, lm;
   2851     long ik;
   2852     PyObject *k, *r;
   2853     char *s, *p, *have_get;
   2854     Pdata *data;
   2855 
   2856     /* Can be called by Python code or C code */
   2857     if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
   2858         return NULL;
   2859 
   2860     /* Check to make sure we are based on a list */
   2861     if (! Pdata_Check(self->file)) {
   2862         PyErr_SetString(PicklingError,
   2863                         "Attempt to getvalue() a non-list-based pickler");
   2864         return NULL;
   2865     }
   2866 
   2867     /* flush write buffer */
   2868     if (write_other(self, NULL, 0) < 0) return NULL;
   2869 
   2870     data=(Pdata*)self->file;
   2871     l=data->length;
   2872 
   2873     /* set up an array to hold get/put status */
   2874     lm = PyDict_Size(self->memo);
   2875     if (lm < 0) return NULL;
   2876     lm++;
   2877     have_get = malloc(lm);
   2878     if (have_get == NULL) return PyErr_NoMemory();
   2879     memset(have_get, 0, lm);
   2880 
   2881     /* Scan for gets. */
   2882     for (rsize = 0, i = l; --i >= 0; ) {
   2883         k = data->data[i];
   2884 
   2885         if (PyString_Check(k))
   2886             rsize += PyString_GET_SIZE(k);
   2887 
   2888         else if (PyInt_Check(k)) { /* put */
   2889             ik = PyInt_AS_LONG((PyIntObject*)k);
   2890             if (ik >= lm || ik == 0) {
   2891                 PyErr_SetString(PicklingError,
   2892                                 "Invalid get data");
   2893                 goto err;
   2894             }
   2895             if (have_get[ik]) /* with matching get */
   2896                 rsize += ik < 256 ? 2 : 5;
   2897         }
   2898 
   2899         else if (! (PyTuple_Check(k) &&
   2900                     PyTuple_GET_SIZE(k) == 2 &&
   2901                     PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
   2902             ) {
   2903             PyErr_SetString(PicklingError,
   2904                             "Unexpected data in internal list");
   2905             goto err;
   2906         }
   2907 
   2908         else { /* put */
   2909             ik = PyInt_AS_LONG((PyIntObject *)k);
   2910             if (ik >= lm || ik == 0) {
   2911                 PyErr_SetString(PicklingError,
   2912                                 "Invalid get data");
   2913                 return NULL;
   2914             }
   2915             have_get[ik] = 1;
   2916             rsize += ik < 256 ? 2 : 5;
   2917         }
   2918     }
   2919 
   2920     /* Now generate the result */
   2921     r = PyString_FromStringAndSize(NULL, rsize);
   2922     if (r == NULL) goto err;
   2923     s = PyString_AS_STRING((PyStringObject *)r);
   2924 
   2925     for (i = 0; i < l; i++) {
   2926         k = data->data[i];
   2927 
   2928         if (PyString_Check(k)) {
   2929             ssize = PyString_GET_SIZE(k);
   2930             if (ssize) {
   2931                 p=PyString_AS_STRING((PyStringObject *)k);
   2932                 while (--ssize >= 0)
   2933                     *s++ = *p++;
   2934             }
   2935         }
   2936 
   2937         else if (PyTuple_Check(k)) { /* get */
   2938             ik = PyInt_AS_LONG((PyIntObject *)
   2939                                 PyTuple_GET_ITEM(k, 0));
   2940             if (ik < 256) {
   2941                 *s++ = BINGET;
   2942                 *s++ = (int)(ik & 0xff);
   2943             }
   2944             else {
   2945                 *s++ = LONG_BINGET;
   2946                 *s++ = (int)(ik & 0xff);
   2947                 *s++ = (int)((ik >> 8)  & 0xff);
   2948                 *s++ = (int)((ik >> 16) & 0xff);
   2949                 *s++ = (int)((ik >> 24) & 0xff);
   2950             }
   2951         }
   2952 
   2953         else { /* put */
   2954             ik = PyInt_AS_LONG((PyIntObject*)k);
   2955 
   2956             if (have_get[ik]) { /* with matching get */
   2957                 if (ik < 256) {
   2958                     *s++ = BINPUT;
   2959                     *s++ = (int)(ik & 0xff);
   2960                 }
   2961                 else {
   2962                     *s++ = LONG_BINPUT;
   2963                     *s++ = (int)(ik & 0xff);
   2964                     *s++ = (int)((ik >> 8)  & 0xff);
   2965                     *s++ = (int)((ik >> 16) & 0xff);
   2966                     *s++ = (int)((ik >> 24) & 0xff);
   2967                 }
   2968             }
   2969         }
   2970     }
   2971 
   2972     if (clear) {
   2973         PyDict_Clear(self->memo);
   2974         Pdata_clear(data, 0);
   2975     }
   2976 
   2977     free(have_get);
   2978     return r;
   2979   err:
   2980     free(have_get);
   2981     return NULL;
   2982 }
   2983 
   2984 static PyObject *
   2985 Pickler_dump(Picklerobject *self, PyObject *args)
   2986 {
   2987     PyObject *ob;
   2988     int get=0;
   2989 
   2990     if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
   2991         return NULL;
   2992 
   2993     if (dump(self, ob) < 0)
   2994         return NULL;
   2995 
   2996     if (get) return Pickle_getvalue(self, NULL);
   2997 
   2998     /* XXX Why does dump() return self? */
   2999     Py_INCREF(self);
   3000     return (PyObject*)self;
   3001 }
   3002 
   3003 
   3004 static struct PyMethodDef Pickler_methods[] =
   3005 {
   3006   {"dump",          (PyCFunction)Pickler_dump,  METH_VARARGS,
   3007    PyDoc_STR("dump(object) -- "
   3008    "Write an object in pickle format to the object's pickle stream")},
   3009   {"clear_memo",  (PyCFunction)Pickle_clear_memo,  METH_NOARGS,
   3010    PyDoc_STR("clear_memo() -- Clear the picklers memo")},
   3011   {"getvalue",  (PyCFunction)Pickle_getvalue,  METH_VARARGS,
   3012    PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
   3013   {NULL,                NULL}           /* sentinel */
   3014 };
   3015 
   3016 
   3017 static Picklerobject *
   3018 newPicklerobject(PyObject *file, int proto)
   3019 {
   3020     Picklerobject *self;
   3021 
   3022     if (proto < 0)
   3023         proto = HIGHEST_PROTOCOL;
   3024     if (proto > HIGHEST_PROTOCOL) {
   3025         PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
   3026                      "the highest available protocol is %d",
   3027                      proto, HIGHEST_PROTOCOL);
   3028         return NULL;
   3029     }
   3030 
   3031     self = PyObject_GC_New(Picklerobject, &Picklertype);
   3032     if (self == NULL)
   3033         return NULL;
   3034     self->proto = proto;
   3035     self->bin = proto > 0;
   3036     self->fp = NULL;
   3037     self->write = NULL;
   3038     self->memo = NULL;
   3039     self->arg = NULL;
   3040     self->pers_func = NULL;
   3041     self->inst_pers_func = NULL;
   3042     self->write_buf = NULL;
   3043     self->fast = 0;
   3044     self->fast_container = 0;
   3045     self->fast_memo = NULL;
   3046     self->buf_size = 0;
   3047     self->dispatch_table = NULL;
   3048 
   3049     self->file = NULL;
   3050     if (file)
   3051         Py_INCREF(file);
   3052     else {
   3053         file = Pdata_New();
   3054         if (file == NULL)
   3055             goto err;
   3056     }
   3057     self->file = file;
   3058 
   3059     if (!( self->memo = PyDict_New()))
   3060         goto err;
   3061 
   3062     if (PyFile_Check(file)) {
   3063         self->fp = PyFile_AsFile(file);
   3064         if (self->fp == NULL) {
   3065             PyErr_SetString(PyExc_ValueError,
   3066                             "I/O operation on closed file");
   3067             goto err;
   3068         }
   3069         self->write_func = write_file;
   3070     }
   3071     else if (PycStringIO_OutputCheck(file)) {
   3072         self->write_func = write_cStringIO;
   3073     }
   3074     else if (file == Py_None) {
   3075         self->write_func = write_none;
   3076     }
   3077     else {
   3078         self->write_func = write_other;
   3079 
   3080         if (! Pdata_Check(file)) {
   3081             self->write = PyObject_GetAttr(file, write_str);
   3082             if (!self->write)  {
   3083                 PyErr_Clear();
   3084                 PyErr_SetString(PyExc_TypeError,
   3085                                 "argument must have 'write' "
   3086                                 "attribute");
   3087                 goto err;
   3088             }
   3089         }
   3090 
   3091         self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
   3092         if (self->write_buf == NULL) {
   3093             PyErr_NoMemory();
   3094             goto err;
   3095         }
   3096     }
   3097 
   3098     if (PyEval_GetRestricted()) {
   3099         /* Restricted execution, get private tables */
   3100         PyObject *m = PyImport_ImportModule("copy_reg");
   3101 
   3102         if (m == NULL)
   3103             goto err;
   3104         self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
   3105         Py_DECREF(m);
   3106         if (self->dispatch_table == NULL)
   3107             goto err;
   3108     }
   3109     else {
   3110         self->dispatch_table = dispatch_table;
   3111         Py_INCREF(dispatch_table);
   3112     }
   3113     PyObject_GC_Track(self);
   3114 
   3115     return self;
   3116 
   3117   err:
   3118     Py_DECREF(self);
   3119     return NULL;
   3120 }
   3121 
   3122 
   3123 static PyObject *
   3124 get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
   3125 {
   3126     static char *kwlist[] = {"file", "protocol", NULL};
   3127     PyObject *file = NULL;
   3128     int proto = 0;
   3129 
   3130     /* XXX
   3131      * The documented signature is Pickler(file, protocol=0), but this
   3132      * accepts Pickler() and Pickler(integer) too.  The meaning then
   3133      * is clear as mud, undocumented, and not supported by pickle.py.
   3134      * I'm told Zope uses this, but I haven't traced into this code
   3135      * far enough to figure out what it means.
   3136      */
   3137     if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
   3138         PyErr_Clear();
   3139         proto = 0;
   3140         if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
   3141                     kwlist, &file, &proto))
   3142             return NULL;
   3143     }
   3144     return (PyObject *)newPicklerobject(file, proto);
   3145 }
   3146 
   3147 
   3148 static void
   3149 Pickler_dealloc(Picklerobject *self)
   3150 {
   3151     PyObject_GC_UnTrack(self);
   3152     Py_XDECREF(self->write);
   3153     Py_XDECREF(self->memo);
   3154     Py_XDECREF(self->fast_memo);
   3155     Py_XDECREF(self->arg);
   3156     Py_XDECREF(self->file);
   3157     Py_XDECREF(self->pers_func);
   3158     Py_XDECREF(self->inst_pers_func);
   3159     Py_XDECREF(self->dispatch_table);
   3160     PyMem_Free(self->write_buf);
   3161     Py_TYPE(self)->tp_free((PyObject *)self);
   3162 }
   3163 
   3164 static int
   3165 Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
   3166 {
   3167     Py_VISIT(self->write);
   3168     Py_VISIT(self->memo);
   3169     Py_VISIT(self->fast_memo);
   3170     Py_VISIT(self->arg);
   3171     Py_VISIT(self->file);
   3172     Py_VISIT(self->pers_func);
   3173     Py_VISIT(self->inst_pers_func);
   3174     Py_VISIT(self->dispatch_table);
   3175     return 0;
   3176 }
   3177 
   3178 static int
   3179 Pickler_clear(Picklerobject *self)
   3180 {
   3181     Py_CLEAR(self->write);
   3182     Py_CLEAR(self->memo);
   3183     Py_CLEAR(self->fast_memo);
   3184     Py_CLEAR(self->arg);
   3185     Py_CLEAR(self->file);
   3186     Py_CLEAR(self->pers_func);
   3187     Py_CLEAR(self->inst_pers_func);
   3188     Py_CLEAR(self->dispatch_table);
   3189     return 0;
   3190 }
   3191 
   3192 static PyObject *
   3193 Pickler_get_pers_func(Picklerobject *p)
   3194 {
   3195     if (p->pers_func == NULL)
   3196         PyErr_SetString(PyExc_AttributeError, "persistent_id");
   3197     else
   3198         Py_INCREF(p->pers_func);
   3199     return p->pers_func;
   3200 }
   3201 
   3202 static int
   3203 Pickler_set_pers_func(Picklerobject *p, PyObject *v)
   3204 {
   3205     if (v == NULL) {
   3206         PyErr_SetString(PyExc_TypeError,
   3207                         "attribute deletion is not supported");
   3208         return -1;
   3209     }
   3210     Py_XDECREF(p->pers_func);
   3211     Py_INCREF(v);
   3212     p->pers_func = v;
   3213     return 0;
   3214 }
   3215 
   3216 static int
   3217 Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
   3218 {
   3219     if (v == NULL) {
   3220         PyErr_SetString(PyExc_TypeError,
   3221                         "attribute deletion is not supported");
   3222         return -1;
   3223     }
   3224     Py_XDECREF(p->inst_pers_func);
   3225     Py_INCREF(v);
   3226     p->inst_pers_func = v;
   3227     return 0;
   3228 }
   3229 
   3230 static PyObject *
   3231 Pickler_get_memo(Picklerobject *p)
   3232 {
   3233     if (p->memo == NULL)
   3234         PyErr_SetString(PyExc_AttributeError, "memo");
   3235     else
   3236         Py_INCREF(p->memo);
   3237     return p->memo;
   3238 }
   3239 
   3240 static int
   3241 Pickler_set_memo(Picklerobject *p, PyObject *v)
   3242 {
   3243     if (v == NULL) {
   3244         PyErr_SetString(PyExc_TypeError,
   3245                         "attribute deletion is not supported");
   3246         return -1;
   3247     }
   3248     if (!PyDict_Check(v)) {
   3249         PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
   3250         return -1;
   3251     }
   3252     Py_XDECREF(p->memo);
   3253     Py_INCREF(v);
   3254     p->memo = v;
   3255     return 0;
   3256 }
   3257 
   3258 static PyObject *
   3259 Pickler_get_error(Picklerobject *p)
   3260 {
   3261     /* why is this an attribute on the Pickler? */
   3262     Py_INCREF(PicklingError);
   3263     return PicklingError;
   3264 }
   3265 
   3266 static PyMemberDef Pickler_members[] = {
   3267     {"binary", T_INT, offsetof(Picklerobject, bin)},
   3268     {"fast", T_INT, offsetof(Picklerobject, fast)},
   3269     {NULL}
   3270 };
   3271 
   3272 static PyGetSetDef Pickler_getsets[] = {
   3273     {"persistent_id", (getter)Pickler_get_pers_func,
   3274                      (setter)Pickler_set_pers_func},
   3275     {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
   3276     {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
   3277     {"PicklingError", (getter)Pickler_get_error, NULL},
   3278     {NULL}
   3279 };
   3280 
   3281 PyDoc_STRVAR(Picklertype__doc__,
   3282 "Objects that know how to pickle objects\n");
   3283 
   3284 static PyTypeObject Picklertype = {
   3285     PyVarObject_HEAD_INIT(NULL, 0)
   3286     "cPickle.Pickler",            /*tp_name*/
   3287     sizeof(Picklerobject),              /*tp_basicsize*/
   3288     0,
   3289     (destructor)Pickler_dealloc,        /* tp_dealloc */
   3290     0,                                  /* tp_print */
   3291     0,                                  /* tp_getattr */
   3292     0,                                  /* tp_setattr */
   3293     0,                                  /* tp_compare */
   3294     0,                                  /* tp_repr */
   3295     0,                                  /* tp_as_number */
   3296     0,                                  /* tp_as_sequence */
   3297     0,                                  /* tp_as_mapping */
   3298     0,                                  /* tp_hash */
   3299     0,                                  /* tp_call */
   3300     0,                                  /* tp_str */
   3301     PyObject_GenericGetAttr,            /* tp_getattro */
   3302     PyObject_GenericSetAttr,            /* tp_setattro */
   3303     0,                                  /* tp_as_buffer */
   3304     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
   3305     Picklertype__doc__,                 /* tp_doc */
   3306     (traverseproc)Pickler_traverse,     /* tp_traverse */
   3307     (inquiry)Pickler_clear,             /* tp_clear */
   3308     0,                                  /* tp_richcompare */
   3309     0,                                  /* tp_weaklistoffset */
   3310     0,                                  /* tp_iter */
   3311     0,                                  /* tp_iternext */
   3312     Pickler_methods,                    /* tp_methods */
   3313     Pickler_members,                    /* tp_members */
   3314     Pickler_getsets,                    /* tp_getset */
   3315 };
   3316 
   3317 static PyObject *
   3318 find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
   3319 {
   3320     PyObject *global = 0, *module;
   3321 
   3322     if (fc) {
   3323         if (fc==Py_None) {
   3324             PyErr_SetString(UnpicklingError, "Global and instance "
   3325                             "pickles are not supported.");
   3326             return NULL;
   3327         }
   3328         return PyObject_CallFunctionObjArgs(fc, py_module_name,
   3329                                             py_global_name, NULL);
   3330     }
   3331 
   3332     module = PySys_GetObject("modules");
   3333     if (module == NULL)
   3334         return NULL;
   3335 
   3336     module = PyDict_GetItem(module, py_module_name);
   3337     if (module == NULL) {
   3338         module = PyImport_Import(py_module_name);
   3339         if (!module)
   3340             return NULL;
   3341         global = PyObject_GetAttr(module, py_global_name);
   3342         Py_DECREF(module);
   3343     }
   3344     else
   3345         global = PyObject_GetAttr(module, py_global_name);
   3346     return global;
   3347 }
   3348 
   3349 static Py_ssize_t
   3350 marker(Unpicklerobject *self)
   3351 {
   3352     if (self->num_marks < 1) {
   3353         PyErr_SetString(UnpicklingError, "could not find MARK");
   3354         return -1;
   3355     }
   3356 
   3357     return self->marks[--self->num_marks];
   3358 }
   3359 
   3360 
   3361 static int
   3362 load_none(Unpicklerobject *self)
   3363 {
   3364     PDATA_APPEND(self->stack, Py_None, -1);
   3365     return 0;
   3366 }
   3367 
   3368 static int
   3369 bad_readline(void)
   3370 {
   3371     PyErr_SetString(UnpicklingError, "pickle data was truncated");
   3372     return -1;
   3373 }
   3374 
   3375 static int
   3376 load_int(Unpicklerobject *self)
   3377 {
   3378     PyObject *py_int = 0;
   3379     char *endptr, *s;
   3380     Py_ssize_t len;
   3381     int res = -1;
   3382     long l;
   3383 
   3384     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3385     if (len < 2) return bad_readline();
   3386     if (!( s=pystrndup(s,len)))  return -1;
   3387 
   3388     errno = 0;
   3389     l = strtol(s, &endptr, 0);
   3390 
   3391     if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
   3392         /* Hm, maybe we've got something long.  Let's try reading
   3393            it as a Python long object. */
   3394         errno = 0;
   3395         py_int = PyLong_FromString(s, NULL, 0);
   3396         if (py_int == NULL) {
   3397             PyErr_SetString(PyExc_ValueError,
   3398                             "could not convert string to int");
   3399             goto finally;
   3400         }
   3401     }
   3402     else {
   3403         if (len == 3 && (l == 0 || l == 1)) {
   3404             if (!( py_int = PyBool_FromLong(l)))  goto finally;
   3405         }
   3406         else {
   3407             if (!( py_int = PyInt_FromLong(l)))  goto finally;
   3408         }
   3409     }
   3410 
   3411     free(s);
   3412     PDATA_PUSH(self->stack, py_int, -1);
   3413     return 0;
   3414 
   3415   finally:
   3416     free(s);
   3417 
   3418     return res;
   3419 }
   3420 
   3421 static int
   3422 load_bool(Unpicklerobject *self, PyObject *boolean)
   3423 {
   3424     assert(boolean == Py_True || boolean == Py_False);
   3425     PDATA_APPEND(self->stack, boolean, -1);
   3426     return 0;
   3427 }
   3428 
   3429 /* s contains x bytes of a little-endian integer.  Return its value as a
   3430  * C int.  Obscure:  when x is 1 or 2, this is an unsigned little-endian
   3431  * int, but when x is 4 it's a signed one.  This is an historical source
   3432  * of x-platform bugs.
   3433  */
   3434 static long
   3435 calc_binint(char *s, int x)
   3436 {
   3437     unsigned char c;
   3438     int i;
   3439     long l;
   3440 
   3441     for (i = 0, l = 0L; i < x; i++) {
   3442         c = (unsigned char)s[i];
   3443         l |= (long)c << (i * 8);
   3444     }
   3445 #if SIZEOF_LONG > 4
   3446     /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
   3447      * is signed, so on a box with longs bigger than 4 bytes we need
   3448      * to extend a BININT's sign bit to the full width.
   3449      */
   3450     if (x == 4 && l & (1L << 31))
   3451         l |= (~0L) << 32;
   3452 #endif
   3453     return l;
   3454 }
   3455 
   3456 
   3457 static int
   3458 load_binintx(Unpicklerobject *self, char *s, int  x)
   3459 {
   3460     PyObject *py_int = 0;
   3461     long l;
   3462 
   3463     l = calc_binint(s, x);
   3464 
   3465     if (!( py_int = PyInt_FromLong(l)))
   3466         return -1;
   3467 
   3468     PDATA_PUSH(self->stack, py_int, -1);
   3469     return 0;
   3470 }
   3471 
   3472 
   3473 static int
   3474 load_binint(Unpicklerobject *self)
   3475 {
   3476     char *s;
   3477 
   3478     if (self->read_func(self, &s, 4) < 0)
   3479         return -1;
   3480 
   3481     return load_binintx(self, s, 4);
   3482 }
   3483 
   3484 
   3485 static int
   3486 load_binint1(Unpicklerobject *self)
   3487 {
   3488     char *s;
   3489 
   3490     if (self->read_func(self, &s, 1) < 0)
   3491         return -1;
   3492 
   3493     return load_binintx(self, s, 1);
   3494 }
   3495 
   3496 
   3497 static int
   3498 load_binint2(Unpicklerobject *self)
   3499 {
   3500     char *s;
   3501 
   3502     if (self->read_func(self, &s, 2) < 0)
   3503         return -1;
   3504 
   3505     return load_binintx(self, s, 2);
   3506 }
   3507 
   3508 static int
   3509 load_long(Unpicklerobject *self)
   3510 {
   3511     PyObject *l = 0;
   3512     char *end, *s;
   3513     Py_ssize_t len;
   3514     int res = -1;
   3515 
   3516     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3517     if (len < 2) return bad_readline();
   3518     if (!( s=pystrndup(s,len)))  return -1;
   3519 
   3520     if (!( l = PyLong_FromString(s, &end, 0)))
   3521         goto finally;
   3522 
   3523     free(s);
   3524     PDATA_PUSH(self->stack, l, -1);
   3525     return 0;
   3526 
   3527   finally:
   3528     free(s);
   3529 
   3530     return res;
   3531 }
   3532 
   3533 /* 'size' bytes contain the # of bytes of little-endian 256's-complement
   3534  * data following.
   3535  */
   3536 static int
   3537 load_counted_long(Unpicklerobject *self, int size)
   3538 {
   3539     Py_ssize_t i;
   3540     char *nbytes;
   3541     unsigned char *pdata;
   3542     PyObject *along;
   3543 
   3544     assert(size == 1 || size == 4);
   3545     i = self->read_func(self, &nbytes, size);
   3546     if (i < 0) return -1;
   3547 
   3548     size = calc_binint(nbytes, size);
   3549     if (size < 0) {
   3550         /* Corrupt or hostile pickle -- we never write one like
   3551          * this.
   3552          */
   3553         PyErr_SetString(UnpicklingError, "LONG pickle has negative "
   3554                         "byte count");
   3555         return -1;
   3556     }
   3557 
   3558     if (size == 0)
   3559         along = PyLong_FromLong(0L);
   3560     else {
   3561         /* Read the raw little-endian bytes & convert. */
   3562         i = self->read_func(self, (char **)&pdata, size);
   3563         if (i < 0) return -1;
   3564         along = _PyLong_FromByteArray(pdata, (size_t)size,
   3565                         1 /* little endian */, 1 /* signed */);
   3566     }
   3567     if (along == NULL)
   3568         return -1;
   3569     PDATA_PUSH(self->stack, along, -1);
   3570     return 0;
   3571 }
   3572 
   3573 static int
   3574 load_float(Unpicklerobject *self)
   3575 {
   3576     PyObject *py_float = 0;
   3577     char *endptr, *s;
   3578     Py_ssize_t len;
   3579     int res = -1;
   3580     double d;
   3581 
   3582     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3583     if (len < 2) return bad_readline();
   3584     if (!( s=pystrndup(s,len)))  return -1;
   3585 
   3586     d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
   3587 
   3588     if (d == -1.0 && PyErr_Occurred()) {
   3589         goto finally;
   3590     } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) {
   3591         PyErr_SetString(PyExc_ValueError,
   3592                         "could not convert string to float");
   3593         goto finally;
   3594     }
   3595 
   3596     if (!( py_float = PyFloat_FromDouble(d)))
   3597         goto finally;
   3598 
   3599     free(s);
   3600     PDATA_PUSH(self->stack, py_float, -1);
   3601     return 0;
   3602 
   3603   finally:
   3604     free(s);
   3605 
   3606     return res;
   3607 }
   3608 
   3609 static int
   3610 load_binfloat(Unpicklerobject *self)
   3611 {
   3612     PyObject *py_float;
   3613     double x;
   3614     char *p;
   3615 
   3616     if (self->read_func(self, &p, 8) < 0)
   3617         return -1;
   3618 
   3619     x = _PyFloat_Unpack8((unsigned char *)p, 0);
   3620     if (x == -1.0 && PyErr_Occurred())
   3621         return -1;
   3622 
   3623     py_float = PyFloat_FromDouble(x);
   3624     if (py_float == NULL)
   3625         return -1;
   3626 
   3627     PDATA_PUSH(self->stack, py_float, -1);
   3628     return 0;
   3629 }
   3630 
   3631 static int
   3632 load_string(Unpicklerobject *self)
   3633 {
   3634     PyObject *str = 0;
   3635     Py_ssize_t len;
   3636     int res = -1;
   3637     char *s, *p;
   3638 
   3639     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3640     if (len < 2) return bad_readline();
   3641     if (!( s=pystrndup(s,len)))  return -1;
   3642 
   3643 
   3644     /* Strip outermost quotes */
   3645     while (len > 0 && s[len-1] <= ' ')
   3646         len--;
   3647     if (len > 1 && s[0]=='"' && s[len-1]=='"') {
   3648         s[len-1] = '\0';
   3649         p = s + 1 ;
   3650         len -= 2;
   3651     }
   3652     else if (len > 1 && s[0]=='\'' && s[len-1]=='\'') {
   3653         s[len-1] = '\0';
   3654         p = s + 1 ;
   3655         len -= 2;
   3656     }
   3657     else
   3658         goto insecure;
   3659     /********************************************/
   3660 
   3661     str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
   3662     free(s);
   3663     if (str) {
   3664         PDATA_PUSH(self->stack, str, -1);
   3665         res = 0;
   3666     }
   3667     return res;
   3668 
   3669   insecure:
   3670     free(s);
   3671     PyErr_SetString(PyExc_ValueError,"insecure string pickle");
   3672     return -1;
   3673 }
   3674 
   3675 
   3676 static int
   3677 load_binstring(Unpicklerobject *self)
   3678 {
   3679     PyObject *py_string = 0;
   3680     Py_ssize_t l;
   3681     char *s;
   3682 
   3683     if (self->read_func(self, &s, 4) < 0) return -1;
   3684 
   3685     l = calc_binint(s, 4);
   3686     if (l < 0) {
   3687         /* Corrupt or hostile pickle -- we never write one like
   3688          * this.
   3689          */
   3690         PyErr_SetString(UnpicklingError,
   3691                         "BINSTRING pickle has negative byte count");
   3692         return -1;
   3693     }
   3694 
   3695     if (self->read_func(self, &s, l) < 0)
   3696         return -1;
   3697 
   3698     if (!( py_string = PyString_FromStringAndSize(s, l)))
   3699         return -1;
   3700 
   3701     PDATA_PUSH(self->stack, py_string, -1);
   3702     return 0;
   3703 }
   3704 
   3705 
   3706 static int
   3707 load_short_binstring(Unpicklerobject *self)
   3708 {
   3709     PyObject *py_string = 0;
   3710     unsigned char l;
   3711     char *s;
   3712 
   3713     if (self->read_func(self, &s, 1) < 0)
   3714         return -1;
   3715 
   3716     l = (unsigned char)s[0];
   3717 
   3718     if (self->read_func(self, &s, l) < 0) return -1;
   3719 
   3720     if (!( py_string = PyString_FromStringAndSize(s, l)))  return -1;
   3721 
   3722     PDATA_PUSH(self->stack, py_string, -1);
   3723     return 0;
   3724 }
   3725 
   3726 
   3727 #ifdef Py_USING_UNICODE
   3728 static int
   3729 load_unicode(Unpicklerobject *self)
   3730 {
   3731     PyObject *str = 0;
   3732     Py_ssize_t len;
   3733     char *s;
   3734 
   3735     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3736     if (len < 1) return bad_readline();
   3737 
   3738     if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
   3739         return -1;
   3740 
   3741     PDATA_PUSH(self->stack, str, -1);
   3742     return 0;
   3743 }
   3744 #endif
   3745 
   3746 
   3747 #ifdef Py_USING_UNICODE
   3748 static int
   3749 load_binunicode(Unpicklerobject *self)
   3750 {
   3751     PyObject *unicode;
   3752     Py_ssize_t l;
   3753     char *s;
   3754 
   3755     if (self->read_func(self, &s, 4) < 0) return -1;
   3756 
   3757     l = calc_binint(s, 4);
   3758     if (l < 0) {
   3759         /* Corrupt or hostile pickle -- we never write one like
   3760          * this.
   3761          */
   3762         PyErr_SetString(UnpicklingError,
   3763                         "BINUNICODE pickle has negative byte count");
   3764         return -1;
   3765     }
   3766 
   3767     if (self->read_func(self, &s, l) < 0)
   3768         return -1;
   3769 
   3770     if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
   3771         return -1;
   3772 
   3773     PDATA_PUSH(self->stack, unicode, -1);
   3774     return 0;
   3775 }
   3776 #endif
   3777 
   3778 
   3779 static int
   3780 load_tuple(Unpicklerobject *self)
   3781 {
   3782     PyObject *tup;
   3783     Py_ssize_t i;
   3784 
   3785     if ((i = marker(self)) < 0) return -1;
   3786     if (!( tup=Pdata_popTuple(self->stack, i)))  return -1;
   3787     PDATA_PUSH(self->stack, tup, -1);
   3788     return 0;
   3789 }
   3790 
   3791 static int
   3792 load_counted_tuple(Unpicklerobject *self, int len)
   3793 {
   3794     PyObject *tup = PyTuple_New(len);
   3795 
   3796     if (tup == NULL)
   3797         return -1;
   3798 
   3799     while (--len >= 0) {
   3800         PyObject *element;
   3801 
   3802         PDATA_POP(self->stack, element);
   3803         if (element == NULL)
   3804             return -1;
   3805         PyTuple_SET_ITEM(tup, len, element);
   3806     }
   3807     PDATA_PUSH(self->stack, tup, -1);
   3808     return 0;
   3809 }
   3810 
   3811 static int
   3812 load_empty_list(Unpicklerobject *self)
   3813 {
   3814     PyObject *list;
   3815 
   3816     if (!( list=PyList_New(0)))  return -1;
   3817     PDATA_PUSH(self->stack, list, -1);
   3818     return 0;
   3819 }
   3820 
   3821 static int
   3822 load_empty_dict(Unpicklerobject *self)
   3823 {
   3824     PyObject *dict;
   3825 
   3826     if (!( dict=PyDict_New()))  return -1;
   3827     PDATA_PUSH(self->stack, dict, -1);
   3828     return 0;
   3829 }
   3830 
   3831 
   3832 static int
   3833 load_list(Unpicklerobject *self)
   3834 {
   3835     PyObject *list = 0;
   3836     Py_ssize_t i;
   3837 
   3838     if ((i = marker(self)) < 0) return -1;
   3839     if (!( list=Pdata_popList(self->stack, i)))  return -1;
   3840     PDATA_PUSH(self->stack, list, -1);
   3841     return 0;
   3842 }
   3843 
   3844 static int
   3845 load_dict(Unpicklerobject *self)
   3846 {
   3847     PyObject *dict, *key, *value;
   3848     Py_ssize_t i, j, k;
   3849 
   3850     if ((i = marker(self)) < 0) return -1;
   3851     j=self->stack->length;
   3852 
   3853     if (!( dict = PyDict_New()))  return -1;
   3854 
   3855     for (k = i+1; k < j; k += 2) {
   3856         key  =self->stack->data[k-1];
   3857         value=self->stack->data[k  ];
   3858         if (PyDict_SetItem(dict, key, value) < 0) {
   3859             Py_DECREF(dict);
   3860             return -1;
   3861         }
   3862     }
   3863     Pdata_clear(self->stack, i);
   3864     PDATA_PUSH(self->stack, dict, -1);
   3865     return 0;
   3866 }
   3867 
   3868 static PyObject *
   3869 Instance_New(PyObject *cls, PyObject *args)
   3870 {
   3871     PyObject *r = 0;
   3872 
   3873     if (PyClass_Check(cls)) {
   3874         int l;
   3875 
   3876         if ((l=PyObject_Size(args)) < 0) goto err;
   3877         if (!( l ))  {
   3878             PyObject *__getinitargs__;
   3879 
   3880             __getinitargs__ = PyObject_GetAttr(cls,
   3881                                        __getinitargs___str);
   3882             if (!__getinitargs__)  {
   3883                 /* We have a class with no __getinitargs__,
   3884                    so bypass usual construction  */
   3885                 PyObject *inst;
   3886 
   3887                 PyErr_Clear();
   3888                 if (!( inst=PyInstance_NewRaw(cls, NULL)))
   3889                     goto err;
   3890                 return inst;
   3891             }
   3892             Py_DECREF(__getinitargs__);
   3893         }
   3894 
   3895         if ((r=PyInstance_New(cls, args, NULL))) return r;
   3896         else goto err;
   3897     }
   3898 
   3899     if ((r=PyObject_CallObject(cls, args))) return r;
   3900 
   3901   err:
   3902     {
   3903         PyObject *tp, *v, *tb, *tmp_value;
   3904 
   3905         PyErr_Fetch(&tp, &v, &tb);
   3906         tmp_value = v;
   3907         /* NULL occurs when there was a KeyboardInterrupt */
   3908         if (tmp_value == NULL)
   3909             tmp_value = Py_None;
   3910         if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
   3911             Py_XDECREF(v);
   3912             v=r;
   3913         }
   3914         PyErr_Restore(tp,v,tb);
   3915     }
   3916     return NULL;
   3917 }
   3918 
   3919 
   3920 static int
   3921 load_obj(Unpicklerobject *self)
   3922 {
   3923     PyObject *class, *tup, *obj=0;
   3924     Py_ssize_t i;
   3925 
   3926     if ((i = marker(self)) < 0) return -1;
   3927     if (!( tup=Pdata_popTuple(self->stack, i+1)))  return -1;
   3928     PDATA_POP(self->stack, class);
   3929     if (class) {
   3930         obj = Instance_New(class, tup);
   3931         Py_DECREF(class);
   3932     }
   3933     Py_DECREF(tup);
   3934 
   3935     if (! obj) return -1;
   3936     PDATA_PUSH(self->stack, obj, -1);
   3937     return 0;
   3938 }
   3939 
   3940 
   3941 static int
   3942 load_inst(Unpicklerobject *self)
   3943 {
   3944     PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
   3945     Py_ssize_t i, len;
   3946     char *s;
   3947 
   3948     if ((i = marker(self)) < 0) return -1;
   3949 
   3950     if ((len = self->readline_func(self, &s)) < 0) return -1;
   3951     if (len < 2) return bad_readline();
   3952     module_name = PyString_FromStringAndSize(s, len - 1);
   3953     if (!module_name)  return -1;
   3954 
   3955     if ((len = self->readline_func(self, &s)) >= 0) {
   3956         if (len < 2) return bad_readline();
   3957         if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
   3958             class = find_class(module_name, class_name,
   3959                                self->find_class);
   3960             Py_DECREF(class_name);
   3961         }
   3962     }
   3963     Py_DECREF(module_name);
   3964 
   3965     if (! class) return -1;
   3966 
   3967     if ((tup=Pdata_popTuple(self->stack, i))) {
   3968         obj = Instance_New(class, tup);
   3969         Py_DECREF(tup);
   3970     }
   3971     Py_DECREF(class);
   3972 
   3973     if (! obj) return -1;
   3974 
   3975     PDATA_PUSH(self->stack, obj, -1);
   3976     return 0;
   3977 }
   3978 
   3979 static int
   3980 load_newobj(Unpicklerobject *self)
   3981 {
   3982     PyObject *args = NULL;
   3983     PyObject *clsraw = NULL;
   3984     PyTypeObject *cls;          /* clsraw cast to its true type */
   3985     PyObject *obj;
   3986 
   3987     /* Stack is ... cls argtuple, and we want to call
   3988      * cls.__new__(cls, *argtuple).
   3989      */
   3990     PDATA_POP(self->stack, args);
   3991     if (args == NULL) goto Fail;
   3992     if (! PyTuple_Check(args)) {
   3993         PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
   3994                                          "tuple.");
   3995         goto Fail;
   3996     }
   3997 
   3998     PDATA_POP(self->stack, clsraw);
   3999     cls = (PyTypeObject *)clsraw;
   4000     if (cls == NULL) goto Fail;
   4001     if (! PyType_Check(cls)) {
   4002         PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
   4003                                          "isn't a type object");
   4004         goto Fail;
   4005     }
   4006     if (cls->tp_new == NULL) {
   4007         PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
   4008                                          "has NULL tp_new");
   4009         goto Fail;
   4010     }
   4011 
   4012     /* Call __new__. */
   4013     obj = cls->tp_new(cls, args, NULL);
   4014     if (obj == NULL) goto Fail;
   4015 
   4016     Py_DECREF(args);
   4017     Py_DECREF(clsraw);
   4018     PDATA_PUSH(self->stack, obj, -1);
   4019     return 0;
   4020 
   4021  Fail:
   4022     Py_XDECREF(args);
   4023     Py_XDECREF(clsraw);
   4024     return -1;
   4025 }
   4026 
   4027 static int
   4028 load_global(Unpicklerobject *self)
   4029 {
   4030     PyObject *class = 0, *module_name = 0, *class_name = 0;
   4031     Py_ssize_t len;
   4032     char *s;
   4033 
   4034     if ((len = self->readline_func(self, &s)) < 0) return -1;
   4035     if (len < 2) return bad_readline();
   4036     module_name = PyString_FromStringAndSize(s, len - 1);
   4037     if (!module_name)  return -1;
   4038 
   4039     if ((len = self->readline_func(self, &s)) >= 0) {
   4040         if (len < 2) {
   4041             Py_DECREF(module_name);
   4042             return bad_readline();
   4043         }
   4044         if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
   4045             class = find_class(module_name, class_name,
   4046                                self->find_class);
   4047             Py_DECREF(class_name);
   4048         }
   4049     }
   4050     Py_DECREF(module_name);
   4051 
   4052     if (! class) return -1;
   4053     PDATA_PUSH(self->stack, class, -1);
   4054     return 0;
   4055 }
   4056 
   4057 
   4058 static int
   4059 load_persid(Unpicklerobject *self)
   4060 {
   4061     PyObject *pid = 0;
   4062     Py_ssize_t len;
   4063     char *s;
   4064 
   4065     if (self->pers_func) {
   4066         if ((len = self->readline_func(self, &s)) < 0) return -1;
   4067         if (len < 2) return bad_readline();
   4068 
   4069         pid = PyString_FromStringAndSize(s, len - 1);
   4070         if (!pid)  return -1;
   4071 
   4072         if (PyList_Check(self->pers_func)) {
   4073             if (PyList_Append(self->pers_func, pid) < 0) {
   4074                 Py_DECREF(pid);
   4075                 return -1;
   4076             }
   4077         }
   4078         else {
   4079             ARG_TUP(self, pid);
   4080             if (self->arg) {
   4081                 pid = PyObject_Call(self->pers_func, self->arg,
   4082                                     NULL);
   4083                 FREE_ARG_TUP(self);
   4084             }
   4085         }
   4086 
   4087         if (! pid) return -1;
   4088 
   4089         PDATA_PUSH(self->stack, pid, -1);
   4090         return 0;
   4091     }
   4092     else {
   4093         PyErr_SetString(UnpicklingError,
   4094                         "A load persistent id instruction was encountered,\n"
   4095                         "but no persistent_load function was specified.");
   4096         return -1;
   4097     }
   4098 }
   4099 
   4100 static int
   4101 load_binpersid(Unpicklerobject *self)
   4102 {
   4103     PyObject *pid = 0;
   4104 
   4105     if (self->pers_func) {
   4106         PDATA_POP(self->stack, pid);
   4107         if (! pid) return -1;
   4108 
   4109         if (PyList_Check(self->pers_func)) {
   4110             if (PyList_Append(self->pers_func, pid) < 0) {
   4111                 Py_DECREF(pid);
   4112                 return -1;
   4113             }
   4114         }
   4115         else {
   4116             ARG_TUP(self, pid);
   4117             if (self->arg) {
   4118                 pid = PyObject_Call(self->pers_func, self->arg,
   4119                                     NULL);
   4120                 FREE_ARG_TUP(self);
   4121             }
   4122             if (! pid) return -1;
   4123         }
   4124 
   4125         PDATA_PUSH(self->stack, pid, -1);
   4126         return 0;
   4127     }
   4128     else {
   4129         PyErr_SetString(UnpicklingError,
   4130                         "A load persistent id instruction was encountered,\n"
   4131                         "but no persistent_load function was specified.");
   4132         return -1;
   4133     }
   4134 }
   4135 
   4136 
   4137 static int
   4138 load_pop(Unpicklerobject *self)
   4139 {
   4140     Py_ssize_t len = self->stack->length;
   4141 
   4142     /* Note that we split the (pickle.py) stack into two stacks,
   4143        an object stack and a mark stack. We have to be clever and
   4144        pop the right one. We do this by looking at the top of the
   4145        mark stack first, and only signalling a stack underflow if
   4146        the object stack is empty and the mark stack doesn't match
   4147        our expectations.
   4148     */
   4149     if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
   4150         self->num_marks--;
   4151     } else if (len > 0) {
   4152         len--;
   4153         Py_DECREF(self->stack->data[len]);
   4154         self->stack->length = len;
   4155     } else {
   4156         return stackUnderflow();
   4157     }
   4158     return 0;
   4159 }
   4160 
   4161 
   4162 static int
   4163 load_pop_mark(Unpicklerobject *self)
   4164 {
   4165     Py_ssize_t i;
   4166 
   4167     if ((i = marker(self)) < 0)
   4168         return -1;
   4169 
   4170     Pdata_clear(self->stack, i);
   4171 
   4172     return 0;
   4173 }
   4174 
   4175 
   4176 static int
   4177 load_dup(Unpicklerobject *self)
   4178 {
   4179     PyObject *last;
   4180     Py_ssize_t len;
   4181 
   4182     if ((len = self->stack->length) <= 0) return stackUnderflow();
   4183     last=self->stack->data[len-1];
   4184     Py_INCREF(last);
   4185     PDATA_PUSH(self->stack, last, -1);
   4186     return 0;
   4187 }
   4188 
   4189 
   4190 static int
   4191 load_get(Unpicklerobject *self)
   4192 {
   4193     PyObject *py_str = 0, *value = 0;
   4194     Py_ssize_t len;
   4195     char *s;
   4196     int rc;
   4197 
   4198     if ((len = self->readline_func(self, &s)) < 0) return -1;
   4199     if (len < 2) return bad_readline();
   4200 
   4201     if (!( py_str = PyString_FromStringAndSize(s, len - 1)))  return -1;
   4202 
   4203     value = PyDict_GetItem(self->memo, py_str);
   4204     if (! value) {
   4205         PyErr_SetObject(BadPickleGet, py_str);
   4206         rc = -1;
   4207     }
   4208     else {
   4209         PDATA_APPEND(self->stack, value, -1);
   4210         rc = 0;
   4211     }
   4212 
   4213     Py_DECREF(py_str);
   4214     return rc;
   4215 }
   4216 
   4217 
   4218 static int
   4219 load_binget(Unpicklerobject *self)
   4220 {
   4221     PyObject *py_key = 0, *value = 0;
   4222     unsigned char key;
   4223     char *s;
   4224     int rc;
   4225 
   4226     if (self->read_func(self, &s, 1) < 0) return -1;
   4227 
   4228     key = (unsigned char)s[0];
   4229     if (!( py_key = PyInt_FromLong((long)key)))  return -1;
   4230 
   4231     value = PyDict_GetItem(self->memo, py_key);
   4232     if (! value) {
   4233         PyErr_SetObject(BadPickleGet, py_key);
   4234         rc = -1;
   4235     }
   4236     else {
   4237         PDATA_APPEND(self->stack, value, -1);
   4238         rc = 0;
   4239     }
   4240 
   4241     Py_DECREF(py_key);
   4242     return rc;
   4243 }
   4244 
   4245 
   4246 static int
   4247 load_long_binget(Unpicklerobject *self)
   4248 {
   4249     PyObject *py_key = 0, *value = 0;
   4250     unsigned char c;
   4251     char *s;
   4252     Py_ssize_t key;
   4253     int rc;
   4254 
   4255     if (self->read_func(self, &s, 4) < 0) return -1;
   4256 
   4257     c = (unsigned char)s[0];
   4258     key = (long)c;
   4259     c = (unsigned char)s[1];
   4260     key |= (long)c << 8;
   4261     c = (unsigned char)s[2];
   4262     key |= (long)c << 16;
   4263     c = (unsigned char)s[3];
   4264     key |= (long)c << 24;
   4265 
   4266     if (!( py_key = PyInt_FromLong((long)key)))  return -1;
   4267 
   4268     value = PyDict_GetItem(self->memo, py_key);
   4269     if (! value) {
   4270         PyErr_SetObject(BadPickleGet, py_key);
   4271         rc = -1;
   4272     }
   4273     else {
   4274         PDATA_APPEND(self->stack, value, -1);
   4275         rc = 0;
   4276     }
   4277 
   4278     Py_DECREF(py_key);
   4279     return rc;
   4280 }
   4281 
   4282 /* Push an object from the extension registry (EXT[124]).  nbytes is
   4283  * the number of bytes following the opcode, holding the index (code) value.
   4284  */
   4285 static int
   4286 load_extension(Unpicklerobject *self, int nbytes)
   4287 {
   4288     char *codebytes;            /* the nbytes bytes after the opcode */
   4289     long code;                  /* calc_binint returns long */
   4290     PyObject *py_code;          /* code as a Python int */
   4291     PyObject *obj;              /* the object to push */
   4292     PyObject *pair;             /* (module_name, class_name) */
   4293     PyObject *module_name, *class_name;
   4294 
   4295     assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
   4296     if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
   4297     code = calc_binint(codebytes,  nbytes);
   4298     if (code <= 0) {                    /* note that 0 is forbidden */
   4299         /* Corrupt or hostile pickle. */
   4300         PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
   4301         return -1;
   4302     }
   4303 
   4304     /* Look for the code in the cache. */
   4305     py_code = PyInt_FromLong(code);
   4306     if (py_code == NULL) return -1;
   4307     obj = PyDict_GetItem(extension_cache, py_code);
   4308     if (obj != NULL) {
   4309         /* Bingo. */
   4310         Py_DECREF(py_code);
   4311         PDATA_APPEND(self->stack, obj, -1);
   4312         return 0;
   4313     }
   4314 
   4315     /* Look up the (module_name, class_name) pair. */
   4316     pair = PyDict_GetItem(inverted_registry, py_code);
   4317     if (pair == NULL) {
   4318         Py_DECREF(py_code);
   4319         PyErr_Format(PyExc_ValueError, "unregistered extension "
   4320                      "code %ld", code);
   4321         return -1;
   4322     }
   4323     /* Since the extension registry is manipulable via Python code,
   4324      * confirm that pair is really a 2-tuple of strings.
   4325      */
   4326     if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
   4327         !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
   4328         !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
   4329         Py_DECREF(py_code);
   4330         PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
   4331                      "isn't a 2-tuple of strings", code);
   4332         return -1;
   4333     }
   4334     /* Load the object. */
   4335     obj = find_class(module_name, class_name, self->find_class);
   4336     if (obj == NULL) {
   4337         Py_DECREF(py_code);
   4338         return -1;
   4339     }
   4340     /* Cache code -> obj. */
   4341     code = PyDict_SetItem(extension_cache, py_code, obj);
   4342     Py_DECREF(py_code);
   4343     if (code < 0) {
   4344         Py_DECREF(obj);
   4345         return -1;
   4346     }
   4347     PDATA_PUSH(self->stack, obj, -1);
   4348     return 0;
   4349 }
   4350 
   4351 static int
   4352 load_put(Unpicklerobject *self)
   4353 {
   4354     PyObject *py_str = 0, *value = 0;
   4355     Py_ssize_t len, l;
   4356     char *s;
   4357 
   4358     if ((l = self->readline_func(self, &s)) < 0) return -1;
   4359     if (l < 2) return bad_readline();
   4360     if (!( len=self->stack->length ))  return stackUnderflow();
   4361     if (!( py_str = PyString_FromStringAndSize(s, l - 1)))  return -1;
   4362     value=self->stack->data[len-1];
   4363     l=PyDict_SetItem(self->memo, py_str, value);
   4364     Py_DECREF(py_str);
   4365     return l;
   4366 }
   4367 
   4368 
   4369 static int
   4370 load_binput(Unpicklerobject *self)
   4371 {
   4372     PyObject *py_key = 0, *value = 0;
   4373     unsigned char key;
   4374     char *s;
   4375     Py_ssize_t len;
   4376 
   4377     if (self->read_func(self, &s, 1) < 0) return -1;
   4378     if (!( (len=self->stack->length) > 0 ))  return stackUnderflow();
   4379 
   4380     key = (unsigned char)s[0];
   4381 
   4382     if (!( py_key = PyInt_FromLong((long)key)))  return -1;
   4383     value=self->stack->data[len-1];
   4384     len=PyDict_SetItem(self->memo, py_key, value);
   4385     Py_DECREF(py_key);
   4386     return len;
   4387 }
   4388 
   4389 
   4390 static int
   4391 load_long_binput(Unpicklerobject *self)
   4392 {
   4393     PyObject *py_key = 0, *value = 0;
   4394     Py_ssize_t key;
   4395     unsigned char c;
   4396     char *s;
   4397     Py_ssize_t len;
   4398 
   4399     if (self->read_func(self, &s, 4) < 0) return -1;
   4400     if (!( len=self->stack->length ))  return stackUnderflow();
   4401 
   4402     c = (unsigned char)s[0];
   4403     key = (long)c;
   4404     c = (unsigned char)s[1];
   4405     key |= (long)c << 8;
   4406     c = (unsigned char)s[2];
   4407     key |= (long)c << 16;
   4408     c = (unsigned char)s[3];
   4409     key |= (long)c << 24;
   4410 
   4411     if (!( py_key = PyInt_FromLong(key)))  return -1;
   4412     value=self->stack->data[len-1];
   4413     len=PyDict_SetItem(self->memo, py_key, value);
   4414     Py_DECREF(py_key);
   4415     return len;
   4416 }
   4417 
   4418 
   4419 static int
   4420 do_append(Unpicklerobject *self, Py_ssize_t  x)
   4421 {
   4422     PyObject *value = 0, *list = 0, *append_method = 0;
   4423     Py_ssize_t len, i;
   4424 
   4425     len=self->stack->length;
   4426     if (!( len >= x && x > 0 ))  return stackUnderflow();
   4427     /* nothing to do */
   4428     if (len==x) return 0;
   4429 
   4430     list=self->stack->data[x-1];
   4431 
   4432     if (PyList_Check(list)) {
   4433         PyObject *slice;
   4434         int list_len;
   4435 
   4436         slice=Pdata_popList(self->stack, x);
   4437         if (! slice) return -1;
   4438         list_len = PyList_GET_SIZE(list);
   4439         i=PyList_SetSlice(list, list_len, list_len, slice);
   4440         Py_DECREF(slice);
   4441         return i;
   4442     }
   4443     else {
   4444 
   4445         if (!( append_method = PyObject_GetAttr(list, append_str)))
   4446             return -1;
   4447 
   4448         for (i = x; i < len; i++) {
   4449             PyObject *junk;
   4450 
   4451             value=self->stack->data[i];
   4452             junk=0;
   4453             ARG_TUP(self, value);
   4454             if (self->arg) {
   4455                 junk = PyObject_Call(append_method, self->arg,
   4456                                      NULL);
   4457                 FREE_ARG_TUP(self);
   4458             }
   4459             if (! junk) {
   4460                 Pdata_clear(self->stack, i+1);
   4461                 self->stack->length=x;
   4462                 Py_DECREF(append_method);
   4463                 return -1;
   4464             }
   4465             Py_DECREF(junk);
   4466         }
   4467         self->stack->length=x;
   4468         Py_DECREF(append_method);
   4469     }
   4470 
   4471     return 0;
   4472 }
   4473 
   4474 
   4475 static int
   4476 load_append(Unpicklerobject *self)
   4477 {
   4478     return do_append(self, self->stack->length - 1);
   4479 }
   4480 
   4481 
   4482 static int
   4483 load_appends(Unpicklerobject *self)
   4484 {
   4485     return do_append(self, marker(self));
   4486 }
   4487 
   4488 
   4489 static Py_ssize_t
   4490 do_setitems(Unpicklerobject *self, Py_ssize_t x)
   4491 {
   4492     PyObject *value = 0, *key = 0, *dict = 0;
   4493     Py_ssize_t len, i, r=0;
   4494 
   4495     if (!( (len=self->stack->length) >= x
   4496            && x > 0 ))  return stackUnderflow();
   4497 
   4498     dict=self->stack->data[x-1];
   4499 
   4500     for (i = x+1; i < len; i += 2) {
   4501         key  =self->stack->data[i-1];
   4502         value=self->stack->data[i  ];
   4503         if (PyObject_SetItem(dict, key, value) < 0) {
   4504             r=-1;
   4505             break;
   4506         }
   4507     }
   4508 
   4509     Pdata_clear(self->stack, x);
   4510 
   4511     return r;
   4512 }
   4513 
   4514 
   4515 static int
   4516 load_setitem(Unpicklerobject *self)
   4517 {
   4518     return do_setitems(self, self->stack->length - 2);
   4519 }
   4520 
   4521 static int
   4522 load_setitems(Unpicklerobject *self)
   4523 {
   4524     return do_setitems(self, marker(self));
   4525 }
   4526 
   4527 
   4528 static int
   4529 load_build(Unpicklerobject *self)
   4530 {
   4531     PyObject *state, *inst, *slotstate;
   4532     PyObject *__setstate__;
   4533     PyObject *d_key, *d_value;
   4534     int res = -1;
   4535     Py_ssize_t i;
   4536 
   4537     /* Stack is ... instance, state.  We want to leave instance at
   4538      * the stack top, possibly mutated via instance.__setstate__(state).
   4539      */
   4540     if (self->stack->length < 2)
   4541         return stackUnderflow();
   4542     PDATA_POP(self->stack, state);
   4543     if (state == NULL)
   4544         return -1;
   4545     inst = self->stack->data[self->stack->length - 1];
   4546 
   4547     __setstate__ = PyObject_GetAttr(inst, __setstate___str);
   4548     if (__setstate__ != NULL) {
   4549         PyObject *junk = NULL;
   4550 
   4551         /* The explicit __setstate__ is responsible for everything. */
   4552         ARG_TUP(self, state);
   4553         if (self->arg) {
   4554             junk = PyObject_Call(__setstate__, self->arg, NULL);
   4555             FREE_ARG_TUP(self);
   4556         }
   4557         Py_DECREF(__setstate__);
   4558         if (junk == NULL)
   4559             return -1;
   4560         Py_DECREF(junk);
   4561         return 0;
   4562     }
   4563     if (!PyErr_ExceptionMatches(PyExc_AttributeError))
   4564         return -1;
   4565     PyErr_Clear();
   4566 
   4567     /* A default __setstate__.  First see whether state embeds a
   4568      * slot state dict too (a proto 2 addition).
   4569      */
   4570     if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
   4571         PyObject *temp = state;
   4572         state = PyTuple_GET_ITEM(temp, 0);
   4573         slotstate = PyTuple_GET_ITEM(temp, 1);
   4574         Py_INCREF(state);
   4575         Py_INCREF(slotstate);
   4576         Py_DECREF(temp);
   4577     }
   4578     else
   4579         slotstate = NULL;
   4580 
   4581     /* Set inst.__dict__ from the state dict (if any). */
   4582     if (state != Py_None) {
   4583         PyObject *dict;
   4584         if (! PyDict_Check(state)) {
   4585             PyErr_SetString(UnpicklingError, "state is not a "
   4586                             "dictionary");
   4587             goto finally;
   4588         }
   4589         dict = PyObject_GetAttr(inst, __dict___str);
   4590         if (dict == NULL)
   4591             goto finally;
   4592 
   4593         i = 0;
   4594         while (PyDict_Next(state, &i, &d_key, &d_value)) {
   4595             /* normally the keys for instance attributes are
   4596                interned.  we should try to do that here. */
   4597             Py_INCREF(d_key);
   4598             if (PyString_CheckExact(d_key))
   4599                 PyString_InternInPlace(&d_key);
   4600             if (PyObject_SetItem(dict, d_key, d_value) < 0) {
   4601                 Py_DECREF(d_key);
   4602                 goto finally;
   4603             }
   4604             Py_DECREF(d_key);
   4605         }
   4606         Py_DECREF(dict);
   4607     }
   4608 
   4609     /* Also set instance attributes from the slotstate dict (if any). */
   4610     if (slotstate != NULL) {
   4611         if (! PyDict_Check(slotstate)) {
   4612             PyErr_SetString(UnpicklingError, "slot state is not "
   4613                             "a dictionary");
   4614             goto finally;
   4615         }
   4616         i = 0;
   4617         while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
   4618             if (PyObject_SetAttr(inst, d_key, d_value) < 0)
   4619                 goto finally;
   4620         }
   4621     }
   4622     res = 0;
   4623 
   4624   finally:
   4625     Py_DECREF(state);
   4626     Py_XDECREF(slotstate);
   4627     return res;
   4628 }
   4629 
   4630 
   4631 static int
   4632 load_mark(Unpicklerobject *self)
   4633 {
   4634     Py_ssize_t s;
   4635 
   4636     /* Note that we split the (pickle.py) stack into two stacks, an
   4637        object stack and a mark stack. Here we push a mark onto the
   4638        mark stack.
   4639     */
   4640 
   4641     if ((self->num_marks + 1) >= self->marks_size) {
   4642         Py_ssize_t *marks;
   4643         s=self->marks_size+20;
   4644         if (s <= self->num_marks) s=self->num_marks + 1;
   4645         if (self->marks == NULL)
   4646             marks=(Py_ssize_t *)malloc(s * sizeof(Py_ssize_t));
   4647         else
   4648             marks=(Py_ssize_t *)realloc(self->marks,
   4649                                         s * sizeof(Py_ssize_t));
   4650         if (!marks) {
   4651             PyErr_NoMemory();
   4652             return -1;
   4653         }
   4654         self->marks = marks;
   4655         self->marks_size = s;
   4656     }
   4657 
   4658     self->marks[self->num_marks++] = self->stack->length;
   4659 
   4660     return 0;
   4661 }
   4662 
   4663 static int
   4664 load_reduce(Unpicklerobject *self)
   4665 {
   4666     PyObject *callable = 0, *arg_tup = 0, *ob = 0;
   4667 
   4668     PDATA_POP(self->stack, arg_tup);
   4669     if (! arg_tup) return -1;
   4670     PDATA_POP(self->stack, callable);
   4671     if (callable) {
   4672         ob = Instance_New(callable, arg_tup);
   4673         Py_DECREF(callable);
   4674     }
   4675     Py_DECREF(arg_tup);
   4676 
   4677     if (! ob) return -1;
   4678 
   4679     PDATA_PUSH(self->stack, ob, -1);
   4680     return 0;
   4681 }
   4682 
   4683 /* Just raises an error if we don't know the protocol specified.  PROTO
   4684  * is the first opcode for protocols >= 2.
   4685  */
   4686 static int
   4687 load_proto(Unpicklerobject *self)
   4688 {
   4689     int i;
   4690     char *protobyte;
   4691 
   4692     i = self->read_func(self, &protobyte, 1);
   4693     if (i < 0)
   4694         return -1;
   4695 
   4696     i = calc_binint(protobyte, 1);
   4697     /* No point checking for < 0, since calc_binint returns an unsigned
   4698      * int when chewing on 1 byte.
   4699      */
   4700     assert(i >= 0);
   4701     if (i <= HIGHEST_PROTOCOL)
   4702         return 0;
   4703 
   4704     PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
   4705     return -1;
   4706 }
   4707 
   4708 static PyObject *
   4709 load(Unpicklerobject *self)
   4710 {
   4711     PyObject *err = 0, *val = 0;
   4712     char *s;
   4713 
   4714     self->num_marks = 0;
   4715     if (self->stack->length) Pdata_clear(self->stack, 0);
   4716 
   4717     while (1) {
   4718         if (self->read_func(self, &s, 1) < 0)
   4719             break;
   4720 
   4721         switch (s[0]) {
   4722         case NONE:
   4723             if (load_none(self) < 0)
   4724                 break;
   4725             continue;
   4726 
   4727         case BININT:
   4728             if (load_binint(self) < 0)
   4729                 break;
   4730             continue;
   4731 
   4732         case BININT1:
   4733             if (load_binint1(self) < 0)
   4734                 break;
   4735             continue;
   4736 
   4737         case BININT2:
   4738             if (load_binint2(self) < 0)
   4739                 break;
   4740             continue;
   4741 
   4742         case INT:
   4743             if (load_int(self) < 0)
   4744                 break;
   4745             continue;
   4746 
   4747         case LONG:
   4748             if (load_long(self) < 0)
   4749                 break;
   4750             continue;
   4751 
   4752         case LONG1:
   4753             if (load_counted_long(self, 1) < 0)
   4754                 break;
   4755             continue;
   4756 
   4757         case LONG4:
   4758             if (load_counted_long(self, 4) < 0)
   4759                 break;
   4760             continue;
   4761 
   4762         case FLOAT:
   4763             if (load_float(self) < 0)
   4764                 break;
   4765             continue;
   4766 
   4767         case BINFLOAT:
   4768             if (load_binfloat(self) < 0)
   4769                 break;
   4770             continue;
   4771 
   4772         case BINSTRING:
   4773             if (load_binstring(self) < 0)
   4774                 break;
   4775             continue;
   4776 
   4777         case SHORT_BINSTRING:
   4778             if (load_short_binstring(self) < 0)
   4779                 break;
   4780             continue;
   4781 
   4782         case STRING:
   4783             if (load_string(self) < 0)
   4784                 break;
   4785             continue;
   4786 
   4787 #ifdef Py_USING_UNICODE
   4788         case UNICODE:
   4789             if (load_unicode(self) < 0)
   4790                 break;
   4791             continue;
   4792 
   4793         case BINUNICODE:
   4794             if (load_binunicode(self) < 0)
   4795                 break;
   4796             continue;
   4797 #endif
   4798 
   4799         case EMPTY_TUPLE:
   4800             if (load_counted_tuple(self, 0) < 0)
   4801                 break;
   4802             continue;
   4803 
   4804         case TUPLE1:
   4805             if (load_counted_tuple(self, 1) < 0)
   4806                 break;
   4807             continue;
   4808 
   4809         case TUPLE2:
   4810             if (load_counted_tuple(self, 2) < 0)
   4811                 break;
   4812             continue;
   4813 
   4814         case TUPLE3:
   4815             if (load_counted_tuple(self, 3) < 0)
   4816                 break;
   4817             continue;
   4818 
   4819         case TUPLE:
   4820             if (load_tuple(self) < 0)
   4821                 break;
   4822             continue;
   4823 
   4824         case EMPTY_LIST:
   4825             if (load_empty_list(self) < 0)
   4826                 break;
   4827             continue;
   4828 
   4829         case LIST:
   4830             if (load_list(self) < 0)
   4831                 break;
   4832             continue;
   4833 
   4834         case EMPTY_DICT:
   4835             if (load_empty_dict(self) < 0)
   4836                 break;
   4837             continue;
   4838 
   4839         case DICT:
   4840             if (load_dict(self) < 0)
   4841                 break;
   4842             continue;
   4843 
   4844         case OBJ:
   4845             if (load_obj(self) < 0)
   4846                 break;
   4847             continue;
   4848 
   4849         case INST:
   4850             if (load_inst(self) < 0)
   4851                 break;
   4852             continue;
   4853 
   4854         case NEWOBJ:
   4855             if (load_newobj(self) < 0)
   4856                 break;
   4857             continue;
   4858 
   4859         case GLOBAL:
   4860             if (load_global(self) < 0)
   4861                 break;
   4862             continue;
   4863 
   4864         case APPEND:
   4865             if (load_append(self) < 0)
   4866                 break;
   4867             continue;
   4868 
   4869         case APPENDS:
   4870             if (load_appends(self) < 0)
   4871                 break;
   4872             continue;
   4873 
   4874         case BUILD:
   4875             if (load_build(self) < 0)
   4876                 break;
   4877             continue;
   4878 
   4879         case DUP:
   4880             if (load_dup(self) < 0)
   4881                 break;
   4882             continue;
   4883 
   4884         case BINGET:
   4885             if (load_binget(self) < 0)
   4886                 break;
   4887             continue;
   4888 
   4889         case LONG_BINGET:
   4890             if (load_long_binget(self) < 0)
   4891                 break;
   4892             continue;
   4893 
   4894         case GET:
   4895             if (load_get(self) < 0)
   4896                 break;
   4897             continue;
   4898 
   4899         case EXT1:
   4900             if (load_extension(self, 1) < 0)
   4901                 break;
   4902             continue;
   4903 
   4904         case EXT2:
   4905             if (load_extension(self, 2) < 0)
   4906                 break;
   4907             continue;
   4908 
   4909         case EXT4:
   4910             if (load_extension(self, 4) < 0)
   4911                 break;
   4912             continue;
   4913         case MARK:
   4914             if (load_mark(self) < 0)
   4915                 break;
   4916             continue;
   4917 
   4918         case BINPUT:
   4919             if (load_binput(self) < 0)
   4920                 break;
   4921             continue;
   4922 
   4923         case LONG_BINPUT:
   4924             if (load_long_binput(self) < 0)
   4925                 break;
   4926             continue;
   4927 
   4928         case PUT:
   4929             if (load_put(self) < 0)
   4930                 break;
   4931             continue;
   4932 
   4933         case POP:
   4934             if (load_pop(self) < 0)
   4935                 break;
   4936             continue;
   4937 
   4938         case POP_MARK:
   4939             if (load_pop_mark(self) < 0)
   4940                 break;
   4941             continue;
   4942 
   4943         case SETITEM:
   4944             if (load_setitem(self) < 0)
   4945                 break;
   4946             continue;
   4947 
   4948         case SETITEMS:
   4949             if (load_setitems(self) < 0)
   4950                 break;
   4951             continue;
   4952 
   4953         case STOP:
   4954             break;
   4955 
   4956         case PERSID:
   4957             if (load_persid(self) < 0)
   4958                 break;
   4959             continue;
   4960 
   4961         case BINPERSID:
   4962             if (load_binpersid(self) < 0)
   4963                 break;
   4964             continue;
   4965 
   4966         case REDUCE:
   4967             if (load_reduce(self) < 0)
   4968                 break;
   4969             continue;
   4970 
   4971         case PROTO:
   4972             if (load_proto(self) < 0)
   4973                 break;
   4974             continue;
   4975 
   4976         case NEWTRUE:
   4977             if (load_bool(self, Py_True) < 0)
   4978                 break;
   4979             continue;
   4980 
   4981         case NEWFALSE:
   4982             if (load_bool(self, Py_False) < 0)
   4983                 break;
   4984             continue;
   4985 
   4986         case '\0':
   4987             /* end of file */
   4988             PyErr_SetNone(PyExc_EOFError);
   4989             break;
   4990 
   4991         default:
   4992             cPickle_ErrFormat(UnpicklingError,
   4993                               "invalid load key, '%s'.",
   4994                               "c", s[0]);
   4995             return NULL;
   4996         }
   4997 
   4998         break;
   4999     }
   5000 
   5001     if ((err = PyErr_Occurred())) {
   5002         if (err == PyExc_EOFError) {
   5003             PyErr_SetNone(PyExc_EOFError);
   5004         }
   5005         return NULL;
   5006     }
   5007 
   5008     PDATA_POP(self->stack, val);
   5009     return val;
   5010 }
   5011 
   5012 
   5013 /* No-load functions to support noload, which is used to
   5014    find persistent references. */
   5015 
   5016 static int
   5017 noload_obj(Unpicklerobject *self)
   5018 {
   5019     Py_ssize_t i;
   5020 
   5021     if ((i = marker(self)) < 0) return -1;
   5022     return Pdata_clear(self->stack, i+1);
   5023 }
   5024 
   5025 
   5026 static int
   5027 noload_inst(Unpicklerobject *self)
   5028 {
   5029     Py_ssize_t i;
   5030     char *s;
   5031 
   5032     if ((i = marker(self)) < 0) return -1;
   5033     Pdata_clear(self->stack, i);
   5034     if (self->readline_func(self, &s) < 0) return -1;
   5035     if (self->readline_func(self, &s) < 0) return -1;
   5036     PDATA_APPEND(self->stack, Py_None, -1);
   5037     return 0;
   5038 }
   5039 
   5040 static int
   5041 noload_newobj(Unpicklerobject *self)
   5042 {
   5043     PyObject *obj;
   5044 
   5045     PDATA_POP(self->stack, obj);        /* pop argtuple */
   5046     if (obj == NULL) return -1;
   5047     Py_DECREF(obj);
   5048 
   5049     PDATA_POP(self->stack, obj);        /* pop cls */
   5050     if (obj == NULL) return -1;
   5051     Py_DECREF(obj);
   5052 
   5053     PDATA_APPEND(self->stack, Py_None, -1);
   5054     return 0;
   5055 }
   5056 
   5057 static int
   5058 noload_global(Unpicklerobject *self)
   5059 {
   5060     char *s;
   5061 
   5062     if (self->readline_func(self, &s) < 0) return -1;
   5063     if (self->readline_func(self, &s) < 0) return -1;
   5064     PDATA_APPEND(self->stack, Py_None,-1);
   5065     return 0;
   5066 }
   5067 
   5068 static int
   5069 noload_reduce(Unpicklerobject *self)
   5070 {
   5071 
   5072     if (self->stack->length < 2) return stackUnderflow();
   5073     Pdata_clear(self->stack, self->stack->length-2);
   5074     PDATA_APPEND(self->stack, Py_None,-1);
   5075     return 0;
   5076 }
   5077 
   5078 static int
   5079 noload_build(Unpicklerobject *self) {
   5080 
   5081   if (self->stack->length < 1) return stackUnderflow();
   5082   Pdata_clear(self->stack, self->stack->length-1);
   5083   return 0;
   5084 }
   5085 
   5086 static int
   5087 noload_extension(Unpicklerobject *self, int nbytes)
   5088 {
   5089     char *codebytes;
   5090 
   5091     assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
   5092     if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
   5093     PDATA_APPEND(self->stack, Py_None, -1);
   5094     return 0;
   5095 }
   5096 
   5097 static int
   5098 noload_append(Unpicklerobject *self)
   5099 {
   5100     return Pdata_clear(self->stack, self->stack->length - 1);
   5101 }
   5102 
   5103 static int
   5104 noload_appends(Unpicklerobject *self)
   5105 {
   5106     Py_ssize_t i;
   5107     if ((i = marker(self)) < 0) return -1;
   5108     return Pdata_clear(self->stack, i);
   5109 }
   5110 
   5111 static int
   5112 noload_setitem(Unpicklerobject *self)
   5113 {
   5114     return Pdata_clear(self->stack, self->stack->length - 2);
   5115 }
   5116 
   5117 static int
   5118 noload_setitems(Unpicklerobject *self)
   5119 {
   5120     Py_ssize_t i;
   5121     if ((i = marker(self)) < 0) return -1;
   5122     return Pdata_clear(self->stack, i);
   5123 }
   5124 
   5125 static PyObject *
   5126 noload(Unpicklerobject *self)
   5127 {
   5128     PyObject *err = 0, *val = 0;
   5129     char *s;
   5130 
   5131     self->num_marks = 0;
   5132     Pdata_clear(self->stack, 0);
   5133 
   5134     while (1) {
   5135         if (self->read_func(self, &s, 1) < 0)
   5136             break;
   5137 
   5138         switch (s[0]) {
   5139         case NONE:
   5140             if (load_none(self) < 0)
   5141                 break;
   5142             continue;
   5143 
   5144         case BININT:
   5145             if (load_binint(self) < 0)
   5146                 break;
   5147             continue;
   5148 
   5149         case BININT1:
   5150             if (load_binint1(self) < 0)
   5151                 break;
   5152             continue;
   5153 
   5154         case BININT2:
   5155             if (load_binint2(self) < 0)
   5156                 break;
   5157             continue;
   5158 
   5159         case INT:
   5160             if (load_int(self) < 0)
   5161                 break;
   5162             continue;
   5163 
   5164         case LONG:
   5165             if (load_long(self) < 0)
   5166                 break;
   5167             continue;
   5168 
   5169         case LONG1:
   5170             if (load_counted_long(self, 1) < 0)
   5171                 break;
   5172             continue;
   5173 
   5174         case LONG4:
   5175             if (load_counted_long(self, 4) < 0)
   5176                 break;
   5177             continue;
   5178 
   5179         case FLOAT:
   5180             if (load_float(self) < 0)
   5181                 break;
   5182             continue;
   5183 
   5184         case BINFLOAT:
   5185             if (load_binfloat(self) < 0)
   5186                 break;
   5187             continue;
   5188 
   5189         case BINSTRING:
   5190             if (load_binstring(self) < 0)
   5191                 break;
   5192             continue;
   5193 
   5194         case SHORT_BINSTRING:
   5195             if (load_short_binstring(self) < 0)
   5196                 break;
   5197             continue;
   5198 
   5199         case STRING:
   5200             if (load_string(self) < 0)
   5201                 break;
   5202             continue;
   5203 
   5204 #ifdef Py_USING_UNICODE
   5205         case UNICODE:
   5206             if (load_unicode(self) < 0)
   5207                 break;
   5208             continue;
   5209 
   5210         case BINUNICODE:
   5211             if (load_binunicode(self) < 0)
   5212                 break;
   5213             continue;
   5214 #endif
   5215 
   5216         case EMPTY_TUPLE:
   5217             if (load_counted_tuple(self, 0) < 0)
   5218                 break;
   5219             continue;
   5220 
   5221         case TUPLE1:
   5222             if (load_counted_tuple(self, 1) < 0)
   5223                 break;
   5224             continue;
   5225 
   5226         case TUPLE2:
   5227             if (load_counted_tuple(self, 2) < 0)
   5228                 break;
   5229             continue;
   5230 
   5231         case TUPLE3:
   5232             if (load_counted_tuple(self, 3) < 0)
   5233                 break;
   5234             continue;
   5235 
   5236         case TUPLE:
   5237             if (load_tuple(self) < 0)
   5238                 break;
   5239             continue;
   5240 
   5241         case EMPTY_LIST:
   5242             if (load_empty_list(self) < 0)
   5243                 break;
   5244             continue;
   5245 
   5246         case LIST:
   5247             if (load_list(self) < 0)
   5248                 break;
   5249             continue;
   5250 
   5251         case EMPTY_DICT:
   5252             if (load_empty_dict(self) < 0)
   5253                 break;
   5254             continue;
   5255 
   5256         case DICT:
   5257             if (load_dict(self) < 0)
   5258                 break;
   5259             continue;
   5260 
   5261         case OBJ:
   5262             if (noload_obj(self) < 0)
   5263                 break;
   5264             continue;
   5265 
   5266         case INST:
   5267             if (noload_inst(self) < 0)
   5268                 break;
   5269             continue;
   5270 
   5271         case NEWOBJ:
   5272             if (noload_newobj(self) < 0)
   5273                 break;
   5274             continue;
   5275 
   5276         case GLOBAL:
   5277             if (noload_global(self) < 0)
   5278                 break;
   5279             continue;
   5280 
   5281         case APPEND:
   5282             if (noload_append(self) < 0)
   5283                 break;
   5284             continue;
   5285 
   5286         case APPENDS:
   5287             if (noload_appends(self) < 0)
   5288                 break;
   5289             continue;
   5290 
   5291         case BUILD:
   5292             if (noload_build(self) < 0)
   5293                 break;
   5294             continue;
   5295 
   5296         case DUP:
   5297             if (load_dup(self) < 0)
   5298                 break;
   5299             continue;
   5300 
   5301         case BINGET:
   5302             if (load_binget(self) < 0)
   5303                 break;
   5304             continue;
   5305 
   5306         case LONG_BINGET:
   5307             if (load_long_binget(self) < 0)
   5308                 break;
   5309             continue;
   5310 
   5311         case GET:
   5312             if (load_get(self) < 0)
   5313                 break;
   5314             continue;
   5315 
   5316         case EXT1:
   5317             if (noload_extension(self, 1) < 0)
   5318                 break;
   5319             continue;
   5320 
   5321         case EXT2:
   5322             if (noload_extension(self, 2) < 0)
   5323                 break;
   5324             continue;
   5325 
   5326         case EXT4:
   5327             if (noload_extension(self, 4) < 0)
   5328                 break;
   5329             continue;
   5330 
   5331         case MARK:
   5332             if (load_mark(self) < 0)
   5333                 break;
   5334             continue;
   5335 
   5336         case BINPUT:
   5337             if (load_binput(self) < 0)
   5338                 break;
   5339             continue;
   5340 
   5341         case LONG_BINPUT:
   5342             if (load_long_binput(self) < 0)
   5343                 break;
   5344             continue;
   5345 
   5346         case PUT:
   5347             if (load_put(self) < 0)
   5348                 break;
   5349             continue;
   5350 
   5351         case POP:
   5352             if (load_pop(self) < 0)
   5353                 break;
   5354             continue;
   5355 
   5356         case POP_MARK:
   5357             if (load_pop_mark(self) < 0)
   5358                 break;
   5359             continue;
   5360 
   5361         case SETITEM:
   5362             if (noload_setitem(self) < 0)
   5363                 break;
   5364             continue;
   5365 
   5366         case SETITEMS:
   5367             if (noload_setitems(self) < 0)
   5368                 break;
   5369             continue;
   5370 
   5371         case STOP:
   5372             break;
   5373 
   5374         case PERSID:
   5375             if (load_persid(self) < 0)
   5376                 break;
   5377             continue;
   5378 
   5379         case BINPERSID:
   5380             if (load_binpersid(self) < 0)
   5381                 break;
   5382             continue;
   5383 
   5384         case REDUCE:
   5385             if (noload_reduce(self) < 0)
   5386                 break;
   5387             continue;
   5388 
   5389         case PROTO:
   5390             if (load_proto(self) < 0)
   5391                 break;
   5392             continue;
   5393 
   5394         case NEWTRUE:
   5395             if (load_bool(self, Py_True) < 0)
   5396                 break;
   5397             continue;
   5398 
   5399         case NEWFALSE:
   5400             if (load_bool(self, Py_False) < 0)
   5401                 break;
   5402             continue;
   5403         default:
   5404             cPickle_ErrFormat(UnpicklingError,
   5405                               "invalid load key, '%s'.",
   5406                               "c", s[0]);
   5407             return NULL;
   5408         }
   5409 
   5410         break;
   5411     }
   5412 
   5413     if ((err = PyErr_Occurred())) {
   5414         if (err == PyExc_EOFError) {
   5415             PyErr_SetNone(PyExc_EOFError);
   5416         }
   5417         return NULL;
   5418     }
   5419 
   5420     PDATA_POP(self->stack, val);
   5421     return val;
   5422 }
   5423 
   5424 
   5425 static PyObject *
   5426 Unpickler_load(Unpicklerobject *self, PyObject *unused)
   5427 {
   5428     return load(self);
   5429 }
   5430 
   5431 static PyObject *
   5432 Unpickler_noload(Unpicklerobject *self, PyObject *unused)
   5433 {
   5434     return noload(self);
   5435 }
   5436 
   5437 
   5438 static struct PyMethodDef Unpickler_methods[] = {
   5439   {"load",         (PyCFunction)Unpickler_load,   METH_NOARGS,
   5440    PyDoc_STR("load() -- Load a pickle")
   5441   },
   5442   {"noload",         (PyCFunction)Unpickler_noload,   METH_NOARGS,
   5443    PyDoc_STR(
   5444    "noload() -- not load a pickle, but go through most of the motions\n"
   5445    "\n"
   5446    "This function can be used to read past a pickle without instantiating\n"
   5447    "any objects or importing any modules.  It can also be used to find all\n"
   5448    "persistent references without instantiating any objects or importing\n"
   5449    "any modules.\n")
   5450   },
   5451   {NULL,              NULL}           /* sentinel */
   5452 };
   5453 
   5454 
   5455 static Unpicklerobject *
   5456 newUnpicklerobject(PyObject *f)
   5457 {
   5458     Unpicklerobject *self;
   5459 
   5460     if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
   5461         return NULL;
   5462 
   5463     self->file = NULL;
   5464     self->arg = NULL;
   5465     self->stack = (Pdata*)Pdata_New();
   5466     self->pers_func = NULL;
   5467     self->last_string = NULL;
   5468     self->marks = NULL;
   5469     self->num_marks = 0;
   5470     self->marks_size = 0;
   5471     self->buf_size = 0;
   5472     self->read = NULL;
   5473     self->readline = NULL;
   5474     self->find_class = NULL;
   5475 
   5476     if (!( self->memo = PyDict_New()))
   5477         goto err;
   5478 
   5479     if (!self->stack)
   5480         goto err;
   5481 
   5482     Py_INCREF(f);
   5483     self->file = f;
   5484 
   5485     /* Set read, readline based on type of f */
   5486     if (PyFile_Check(f)) {
   5487         self->fp = PyFile_AsFile(f);
   5488         if (self->fp == NULL) {
   5489             PyErr_SetString(PyExc_ValueError,
   5490                             "I/O operation on closed file");
   5491             goto err;
   5492         }
   5493         self->read_func = read_file;
   5494         self->readline_func = readline_file;
   5495     }
   5496     else if (PycStringIO_InputCheck(f)) {
   5497         self->fp = NULL;
   5498         self->read_func = read_cStringIO;
   5499         self->readline_func = readline_cStringIO;
   5500     }
   5501     else {
   5502 
   5503         self->fp = NULL;
   5504         self->read_func = read_other;
   5505         self->readline_func = readline_other;
   5506 
   5507         if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
   5508                (self->read = PyObject_GetAttr(f, read_str))))  {
   5509             PyErr_Clear();
   5510             PyErr_SetString( PyExc_TypeError,
   5511                              "argument must have 'read' and "
   5512                              "'readline' attributes" );
   5513             goto err;
   5514         }
   5515     }
   5516     PyObject_GC_Track(self);
   5517 
   5518     return self;
   5519 
   5520   err:
   5521     Py_DECREF((PyObject *)self);
   5522     return NULL;
   5523 }
   5524 
   5525 
   5526 static PyObject *
   5527 get_Unpickler(PyObject *self, PyObject *file)
   5528 {
   5529     return (PyObject *)newUnpicklerobject(file);
   5530 }
   5531 
   5532 
   5533 static void
   5534 Unpickler_dealloc(Unpicklerobject *self)
   5535 {
   5536     PyObject_GC_UnTrack((PyObject *)self);
   5537     Py_XDECREF(self->readline);
   5538     Py_XDECREF(self->read);
   5539     Py_XDECREF(self->file);
   5540     Py_XDECREF(self->memo);
   5541     Py_XDECREF(self->stack);
   5542     Py_XDECREF(self->pers_func);
   5543     Py_XDECREF(self->arg);
   5544     Py_XDECREF(self->last_string);
   5545     Py_XDECREF(self->find_class);
   5546 
   5547     if (self->marks) {
   5548         free(self->marks);
   5549     }
   5550 
   5551     if (self->buf_size) {
   5552         free(self->buf);
   5553     }
   5554 
   5555     Py_TYPE(self)->tp_free((PyObject *)self);
   5556 }
   5557 
   5558 static int
   5559 Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
   5560 {
   5561     Py_VISIT(self->readline);
   5562     Py_VISIT(self->read);
   5563     Py_VISIT(self->file);
   5564     Py_VISIT(self->memo);
   5565     Py_VISIT(self->stack);
   5566     Py_VISIT(self->pers_func);
   5567     Py_VISIT(self->arg);
   5568     Py_VISIT(self->last_string);
   5569     Py_VISIT(self->find_class);
   5570     return 0;
   5571 }
   5572 
   5573 static int
   5574 Unpickler_clear(Unpicklerobject *self)
   5575 {
   5576     Py_CLEAR(self->readline);
   5577     Py_CLEAR(self->read);
   5578     Py_CLEAR(self->file);
   5579     Py_CLEAR(self->memo);
   5580     Py_CLEAR(self->stack);
   5581     Py_CLEAR(self->pers_func);
   5582     Py_CLEAR(self->arg);
   5583     Py_CLEAR(self->last_string);
   5584     Py_CLEAR(self->find_class);
   5585     return 0;
   5586 }
   5587 
   5588 static PyObject *
   5589 Unpickler_getattr(Unpicklerobject *self, char *name)
   5590 {
   5591     if (!strcmp(name, "persistent_load")) {
   5592         if (!self->pers_func) {
   5593             PyErr_SetString(PyExc_AttributeError, name);
   5594             return NULL;
   5595         }
   5596 
   5597         Py_INCREF(self->pers_func);
   5598         return self->pers_func;
   5599     }
   5600 
   5601     if (!strcmp(name, "find_global")) {
   5602         if (!self->find_class) {
   5603             PyErr_SetString(PyExc_AttributeError, name);
   5604             return NULL;
   5605         }
   5606 
   5607         Py_INCREF(self->find_class);
   5608         return self->find_class;
   5609     }
   5610 
   5611     if (!strcmp(name, "memo")) {
   5612         if (!self->memo) {
   5613             PyErr_SetString(PyExc_AttributeError, name);
   5614             return NULL;
   5615         }
   5616 
   5617         Py_INCREF(self->memo);
   5618         return self->memo;
   5619     }
   5620 
   5621     if (!strcmp(name, "UnpicklingError")) {
   5622         Py_INCREF(UnpicklingError);
   5623         return UnpicklingError;
   5624     }
   5625 
   5626     return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
   5627 }
   5628 
   5629 
   5630 static int
   5631 Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
   5632 {
   5633 
   5634     if (!strcmp(name, "persistent_load")) {
   5635         Py_XDECREF(self->pers_func);
   5636         self->pers_func = value;
   5637         Py_XINCREF(value);
   5638         return 0;
   5639     }
   5640 
   5641     if (!strcmp(name, "find_global")) {
   5642         Py_XDECREF(self->find_class);
   5643         self->find_class = value;
   5644         Py_XINCREF(value);
   5645         return 0;
   5646     }
   5647 
   5648     if (! value) {
   5649         PyErr_SetString(PyExc_TypeError,
   5650                         "attribute deletion is not supported");
   5651         return -1;
   5652     }
   5653 
   5654     if (strcmp(name, "memo") == 0) {
   5655         if (!PyDict_Check(value)) {
   5656             PyErr_SetString(PyExc_TypeError,
   5657                             "memo must be a dictionary");
   5658             return -1;
   5659         }
   5660         Py_XDECREF(self->memo);
   5661         self->memo = value;
   5662         Py_INCREF(value);
   5663         return 0;
   5664     }
   5665 
   5666     PyErr_SetString(PyExc_AttributeError, name);
   5667     return -1;
   5668 }
   5669 
   5670 /* ---------------------------------------------------------------------------
   5671  * Module-level functions.
   5672  */
   5673 
   5674 /* dump(obj, file, protocol=0). */
   5675 static PyObject *
   5676 cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
   5677 {
   5678     static char *kwlist[] = {"obj", "file", "protocol", NULL};
   5679     PyObject *ob, *file, *res = NULL;
   5680     Picklerobject *pickler = 0;
   5681     int proto = 0;
   5682 
   5683     if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
   5684                &ob, &file, &proto)))
   5685         goto finally;
   5686 
   5687     if (!( pickler = newPicklerobject(file, proto)))
   5688         goto finally;
   5689 
   5690     if (dump(pickler, ob) < 0)
   5691         goto finally;
   5692 
   5693     Py_INCREF(Py_None);
   5694     res = Py_None;
   5695 
   5696   finally:
   5697     Py_XDECREF(pickler);
   5698 
   5699     return res;
   5700 }
   5701 
   5702 
   5703 /* dumps(obj, protocol=0). */
   5704 static PyObject *
   5705 cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
   5706 {
   5707     static char *kwlist[] = {"obj", "protocol", NULL};
   5708     PyObject *ob, *file = 0, *res = NULL;
   5709     Picklerobject *pickler = 0;
   5710     int proto = 0;
   5711 
   5712     if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
   5713                &ob, &proto)))
   5714         goto finally;
   5715 
   5716     if (!( file = PycStringIO->NewOutput(128)))
   5717         goto finally;
   5718 
   5719     if (!( pickler = newPicklerobject(file, proto)))
   5720         goto finally;
   5721 
   5722     if (dump(pickler, ob) < 0)
   5723         goto finally;
   5724 
   5725     res = PycStringIO->cgetvalue(file);
   5726 
   5727   finally:
   5728     Py_XDECREF(pickler);
   5729     Py_XDECREF(file);
   5730 
   5731     return res;
   5732 }
   5733 
   5734 
   5735 /* load(fileobj). */
   5736 static PyObject *
   5737 cpm_load(PyObject *self, PyObject *ob)
   5738 {
   5739     Unpicklerobject *unpickler = 0;
   5740     PyObject *res = NULL;
   5741 
   5742     if (!( unpickler = newUnpicklerobject(ob)))
   5743         goto finally;
   5744 
   5745     res = load(unpickler);
   5746 
   5747   finally:
   5748     Py_XDECREF(unpickler);
   5749 
   5750     return res;
   5751 }
   5752 
   5753 
   5754 /* loads(string) */
   5755 static PyObject *
   5756 cpm_loads(PyObject *self, PyObject *args)
   5757 {
   5758     PyObject *ob, *file = 0, *res = NULL;
   5759     Unpicklerobject *unpickler = 0;
   5760 
   5761     if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
   5762         goto finally;
   5763 
   5764     if (!( file = PycStringIO->NewInput(ob)))
   5765         goto finally;
   5766 
   5767     if (!( unpickler = newUnpicklerobject(file)))
   5768         goto finally;
   5769 
   5770     res = load(unpickler);
   5771 
   5772   finally:
   5773     Py_XDECREF(file);
   5774     Py_XDECREF(unpickler);
   5775 
   5776     return res;
   5777 }
   5778 
   5779 
   5780 PyDoc_STRVAR(Unpicklertype__doc__,
   5781 "Objects that know how to unpickle");
   5782 
   5783 static PyTypeObject Unpicklertype = {
   5784     PyVarObject_HEAD_INIT(NULL, 0)
   5785     "cPickle.Unpickler",                 /*tp_name*/
   5786     sizeof(Unpicklerobject),             /*tp_basicsize*/
   5787     0,
   5788     (destructor)Unpickler_dealloc,      /* tp_dealloc */
   5789     0,                                  /* tp_print */
   5790     (getattrfunc)Unpickler_getattr,     /* tp_getattr */
   5791     (setattrfunc)Unpickler_setattr,     /* tp_setattr */
   5792     0,                                  /* tp_compare */
   5793     0,                                  /* tp_repr */
   5794     0,                                  /* tp_as_number */
   5795     0,                                  /* tp_as_sequence */
   5796     0,                                  /* tp_as_mapping */
   5797     0,                                  /* tp_hash */
   5798     0,                                  /* tp_call */
   5799     0,                                  /* tp_str */
   5800     0,                                  /* tp_getattro */
   5801     0,                                  /* tp_setattro */
   5802     0,                                  /* tp_as_buffer */
   5803     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
   5804     Unpicklertype__doc__,               /* tp_doc */
   5805     (traverseproc)Unpickler_traverse,   /* tp_traverse */
   5806     (inquiry)Unpickler_clear,           /* tp_clear */
   5807 };
   5808 
   5809 static struct PyMethodDef cPickle_methods[] = {
   5810   {"dump",         (PyCFunction)cpm_dump,         METH_VARARGS | METH_KEYWORDS,
   5811    PyDoc_STR("dump(obj, file, protocol=0) -- "
   5812    "Write an object in pickle format to the given file.\n"
   5813    "\n"
   5814    "See the Pickler docstring for the meaning of optional argument proto.")
   5815   },
   5816 
   5817   {"dumps",        (PyCFunction)cpm_dumps,        METH_VARARGS | METH_KEYWORDS,
   5818    PyDoc_STR("dumps(obj, protocol=0) -- "
   5819    "Return a string containing an object in pickle format.\n"
   5820    "\n"
   5821    "See the Pickler docstring for the meaning of optional argument proto.")
   5822   },
   5823 
   5824   {"load",         (PyCFunction)cpm_load,         METH_O,
   5825    PyDoc_STR("load(file) -- Load a pickle from the given file")},
   5826 
   5827   {"loads",        (PyCFunction)cpm_loads,        METH_VARARGS,
   5828    PyDoc_STR("loads(string) -- Load a pickle from the given string")},
   5829 
   5830   {"Pickler",      (PyCFunction)get_Pickler,      METH_VARARGS | METH_KEYWORDS,
   5831    PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
   5832    "\n"
   5833    "This takes a file-like object for writing a pickle data stream.\n"
   5834    "The optional proto argument tells the pickler to use the given\n"
   5835    "protocol; supported protocols are 0, 1, 2.  The default\n"
   5836    "protocol is 0, to be backwards compatible.  (Protocol 0 is the\n"
   5837    "only protocol that can be written to a file opened in text\n"
   5838    "mode and read back successfully.  When using a protocol higher\n"
   5839    "than 0, make sure the file is opened in binary mode, both when\n"
   5840    "pickling and unpickling.)\n"
   5841    "\n"
   5842    "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
   5843    "more efficient than protocol 1.\n"
   5844    "\n"
   5845    "Specifying a negative protocol version selects the highest\n"
   5846    "protocol version supported.  The higher the protocol used, the\n"
   5847    "more recent the version of Python needed to read the pickle\n"
   5848    "produced.\n"
   5849    "\n"
   5850    "The file parameter must have a write() method that accepts a single\n"
   5851    "string argument.  It can thus be an open file object, a StringIO\n"
   5852    "object, or any other custom object that meets this interface.\n")
   5853   },
   5854 
   5855   {"Unpickler",    (PyCFunction)get_Unpickler,    METH_O,
   5856    PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
   5857 
   5858   { NULL, NULL }
   5859 };
   5860 
   5861 static int
   5862 init_stuff(PyObject *module_dict)
   5863 {
   5864     PyObject *copyreg, *t, *r;
   5865 
   5866 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S)))  return -1;
   5867 
   5868     if (PyType_Ready(&Unpicklertype) < 0)
   5869         return -1;
   5870     if (PyType_Ready(&Picklertype) < 0)
   5871         return -1;
   5872 
   5873     INIT_STR(__class__);
   5874     INIT_STR(__getinitargs__);
   5875     INIT_STR(__dict__);
   5876     INIT_STR(__getstate__);
   5877     INIT_STR(__setstate__);
   5878     INIT_STR(__name__);
   5879     INIT_STR(__main__);
   5880     INIT_STR(__reduce__);
   5881     INIT_STR(__reduce_ex__);
   5882     INIT_STR(write);
   5883     INIT_STR(append);
   5884     INIT_STR(read);
   5885     INIT_STR(readline);
   5886     INIT_STR(dispatch_table);
   5887 
   5888     if (!( copyreg = PyImport_ImportModule("copy_reg")))
   5889         return -1;
   5890 
   5891     /* This is special because we want to use a different
   5892        one in restricted mode. */
   5893     dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
   5894     if (!dispatch_table) return -1;
   5895 
   5896     extension_registry = PyObject_GetAttrString(copyreg,
   5897                             "_extension_registry");
   5898     if (!extension_registry) return -1;
   5899 
   5900     inverted_registry = PyObject_GetAttrString(copyreg,
   5901                             "_inverted_registry");
   5902     if (!inverted_registry) return -1;
   5903 
   5904     extension_cache = PyObject_GetAttrString(copyreg,
   5905                             "_extension_cache");
   5906     if (!extension_cache) return -1;
   5907 
   5908     Py_DECREF(copyreg);
   5909 
   5910     if (!(empty_tuple = PyTuple_New(0)))
   5911         return -1;
   5912 
   5913     two_tuple = PyTuple_New(2);
   5914     if (two_tuple == NULL)
   5915         return -1;
   5916     /* We use this temp container with no regard to refcounts, or to
   5917      * keeping containees alive.  Exempt from GC, because we don't
   5918      * want anything looking at two_tuple() by magic.
   5919      */
   5920     PyObject_GC_UnTrack(two_tuple);
   5921 
   5922     /* Ugh */
   5923     if (!( t=PyImport_ImportModule("__builtin__")))  return -1;
   5924     if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
   5925         return -1;
   5926 
   5927     if (!( t=PyDict_New()))  return -1;
   5928     if (!( r=PyRun_String(
   5929                    "def __str__(self):\n"
   5930                    "  return self.args and ('%s' % self.args[0]) or '(what)'\n",
   5931                    Py_file_input,
   5932                    module_dict, t)  ))  return -1;
   5933     Py_DECREF(r);
   5934 
   5935     PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
   5936     if (!PickleError)
   5937         return -1;
   5938 
   5939     Py_DECREF(t);
   5940 
   5941     PicklingError = PyErr_NewException("cPickle.PicklingError",
   5942                                        PickleError, NULL);
   5943     if (!PicklingError)
   5944         return -1;
   5945 
   5946     if (!( t=PyDict_New()))  return -1;
   5947     if (!( r=PyRun_String(
   5948                    "def __str__(self):\n"
   5949                    "  a=self.args\n"
   5950                    "  a=a and type(a[0]) or '(what)'\n"
   5951                    "  return 'Cannot pickle %s objects' % a\n"
   5952                    , Py_file_input,
   5953                    module_dict, t)  ))  return -1;
   5954     Py_DECREF(r);
   5955 
   5956     if (!( UnpickleableError = PyErr_NewException(
   5957                    "cPickle.UnpickleableError", PicklingError, t)))
   5958         return -1;
   5959 
   5960     Py_DECREF(t);
   5961 
   5962     if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
   5963                                                 PickleError, NULL)))
   5964         return -1;
   5965 
   5966     if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
   5967                                              UnpicklingError, NULL)))
   5968         return -1;
   5969 
   5970     if (PyDict_SetItemString(module_dict, "PickleError",
   5971                              PickleError) < 0)
   5972         return -1;
   5973 
   5974     if (PyDict_SetItemString(module_dict, "PicklingError",
   5975                              PicklingError) < 0)
   5976         return -1;
   5977 
   5978     if (PyDict_SetItemString(module_dict, "UnpicklingError",
   5979                              UnpicklingError) < 0)
   5980         return -1;
   5981 
   5982     if (PyDict_SetItemString(module_dict, "UnpickleableError",
   5983                              UnpickleableError) < 0)
   5984         return -1;
   5985 
   5986     if (PyDict_SetItemString(module_dict, "BadPickleGet",
   5987                              BadPickleGet) < 0)
   5988         return -1;
   5989 
   5990     PycString_IMPORT;
   5991 
   5992     return 0;
   5993 }
   5994 
   5995 #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
   5996 #define PyMODINIT_FUNC void
   5997 #endif
   5998 PyMODINIT_FUNC
   5999 initcPickle(void)
   6000 {
   6001     PyObject *m, *d, *di, *v, *k;
   6002     Py_ssize_t i;
   6003     char *rev = "1.71";         /* XXX when does this change? */
   6004     PyObject *format_version;
   6005     PyObject *compatible_formats;
   6006 
   6007     Py_TYPE(&Picklertype) = &PyType_Type;
   6008     Py_TYPE(&Unpicklertype) = &PyType_Type;
   6009     Py_TYPE(&PdataType) = &PyType_Type;
   6010 
   6011     /* Initialize some pieces. We need to do this before module creation,
   6012      * so we're forced to use a temporary dictionary. :(
   6013      */
   6014     di = PyDict_New();
   6015     if (!di) return;
   6016     if (init_stuff(di) < 0) return;
   6017 
   6018     /* Create the module and add the functions */
   6019     m = Py_InitModule4("cPickle", cPickle_methods,
   6020                        cPickle_module_documentation,
   6021                        (PyObject*)NULL,PYTHON_API_VERSION);
   6022     if (m == NULL)
   6023         return;
   6024 
   6025     /* Add some symbolic constants to the module */
   6026     d = PyModule_GetDict(m);
   6027     v = PyString_FromString(rev);
   6028     PyDict_SetItemString(d, "__version__", v);
   6029     Py_XDECREF(v);
   6030 
   6031     /* Copy data from di. Waaa. */
   6032     for (i=0; PyDict_Next(di, &i, &k, &v); ) {
   6033         if (PyObject_SetItem(d, k, v) < 0) {
   6034             Py_DECREF(di);
   6035             return;
   6036         }
   6037     }
   6038     Py_DECREF(di);
   6039 
   6040     i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
   6041     if (i < 0)
   6042         return;
   6043 
   6044     /* These are purely informational; no code uses them. */
   6045     /* File format version we write. */
   6046     format_version = PyString_FromString("2.0");
   6047     /* Format versions we can read. */
   6048     compatible_formats = Py_BuildValue("[sssss]",
   6049         "1.0",          /* Original protocol 0 */
   6050         "1.1",          /* Protocol 0 + INST */
   6051         "1.2",          /* Original protocol 1 */
   6052         "1.3",          /* Protocol 1 + BINFLOAT */
   6053         "2.0");         /* Original protocol 2 */
   6054     PyDict_SetItemString(d, "format_version", format_version);
   6055     PyDict_SetItemString(d, "compatible_formats", compatible_formats);
   6056     Py_XDECREF(format_version);
   6057     Py_XDECREF(compatible_formats);
   6058 }
   6059