blob: ff29b6731dce0b135f3a32e48c7e984190949b22 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Walter Dörwald38e6a692007-06-20 12:37:01 +0000396 if (stringformat && !(retval=PyUnicode_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
Walter Dörwald38e6a692007-06-20 12:37:01 +0000402 v=PyUnicode_Format(retval, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 if (s == NULL) {
424 return 0;
425 }
Tim Peterscba30e22003-02-01 06:24:36 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
428 return -1;
429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000432}
433
Tim Peters84e87f32001-03-17 04:50:51 +0000434static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000435write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436{
437 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000438 if (n > INT_MAX) return -1;
439 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444{
445 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000447
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448 if (_n > INT_MAX)
449 return -1;
450 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451 if (s == NULL) {
452 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000453 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000455 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456 return -1;
457 }
458 else {
459 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
460 if (write_other(self, NULL, 0) < 0)
461 return -1;
462 }
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (n > WRITE_BUF_SIZE) {
465 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000466 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 return -1;
468 }
469 else {
470 memcpy(self->write_buf + self->buf_size, s, n);
471 self->buf_size += n;
472 return n;
473 }
474 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (self->write) {
477 /* object with write method */
478 ARG_TUP(self, py_str);
479 if (self->arg) {
480 junk = PyObject_Call(self->write, self->arg, NULL);
481 FREE_ARG_TUP(self);
482 }
483 if (junk) Py_DECREF(junk);
484 else return -1;
485 }
486 else
487 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 self->buf_size = 0;
490 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491}
492
493
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494static Py_ssize_t
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496{
497 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
500 PyErr_SetNone(PyExc_EOFError);
501 return -1;
502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000513 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
517 return -1;
518 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523}
524
525
Martin v. Löwis18e16552006-02-15 17:27:45 +0000526static Py_ssize_t
527read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528{
529 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000530
Martin v. Löwis18e16552006-02-15 17:27:45 +0000531 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 ARG_TUP(self, bytes);
534 if (self->arg) {
535 str = PyObject_Call(self->read, self->arg, NULL);
536 FREE_ARG_TUP(self);
537 }
538 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 Py_XDECREF(self->last_string);
541 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 if (! (*s = PyString_AsString(str))) return -1;
544 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545}
546
547
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000549readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550{
551 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 if ((str_size = PyString_Size(str)) < 0)
559 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 Py_XDECREF(self->last_string);
562 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 if (! (*s = PyString_AsString(str)))
565 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568}
569
Tim Petersee1a53c2003-02-02 02:57:53 +0000570/* Copy the first n bytes from s into newly malloc'ed memory, plus a
571 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
572 * The caller is responsible for free()'ing the return value.
573 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000575pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576{
Tim Petersee1a53c2003-02-02 02:57:53 +0000577 char *r = (char *)malloc(n+1);
578 if (r == NULL)
579 return (char*)PyErr_NoMemory();
580 memcpy(r, s, n);
581 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583}
584
585
586static int
Tim Peterscba30e22003-02-01 06:24:36 +0000587get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588{
589 PyObject *value, *mv;
590 long c_value;
591 char s[30];
592 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 if (!( mv = PyDict_GetItem(self->memo, id))) {
595 PyErr_SetObject(PyExc_KeyError, id);
596 return -1;
597 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Tim Peterscba30e22003-02-01 06:24:36 +0000599 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if (!( PyInt_Check(value))) {
603 PyErr_SetString(PicklingError, "no int where int expected in memo");
604 return -1;
605 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000606 c_value = PyInt_AsLong(value);
607 if (c_value == -1 && PyErr_Occurred())
608 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (!self->bin) {
611 s[0] = GET;
612 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
613 len = strlen(s);
614 }
615 else if (Pdata_Check(self->file)) {
616 if (write_other(self, NULL, 0) < 0) return -1;
617 PDATA_APPEND(self->file, mv, -1);
618 return 0;
619 }
620 else {
621 if (c_value < 256) {
622 s[0] = BINGET;
623 s[1] = (int)(c_value & 0xff);
624 len = 2;
625 }
626 else {
627 s[0] = LONG_BINGET;
628 s[1] = (int)(c_value & 0xff);
629 s[2] = (int)((c_value >> 8) & 0xff);
630 s[3] = (int)((c_value >> 16) & 0xff);
631 s[4] = (int)((c_value >> 24) & 0xff);
632 len = 5;
633 }
634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Tim Peters0bc93f52003-02-02 18:29:33 +0000636 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000638
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000639 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000641
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643static int
Tim Peterscba30e22003-02-01 06:24:36 +0000644put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645{
Tim Peterscba30e22003-02-01 06:24:36 +0000646 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 return put2(self, ob);
650}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000651
Guido van Rossum053b8df1998-11-25 16:18:00 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653static int
Tim Peterscba30e22003-02-01 06:24:36 +0000654put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655{
656 char c_str[30];
657 int p;
658 size_t len;
659 int res = -1;
660 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (self->fast)
663 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if ((p = PyDict_Size(self->memo)) < 0)
666 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000669 /* XXX Why?
670 * XXX And does "positive" really mean non-negative?
671 * XXX pickle.py starts with PUT index 0, not 1. This makes for
672 * XXX gratuitous differences between the pickling modules.
673 */
Tim Peterscba30e22003-02-01 06:24:36 +0000674 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Tim Peterscba30e22003-02-01 06:24:36 +0000676 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000678
Tim Peterscba30e22003-02-01 06:24:36 +0000679 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681
Tim Peterscba30e22003-02-01 06:24:36 +0000682 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685 PyTuple_SET_ITEM(t, 0, memo_len);
686 Py_INCREF(memo_len);
687 PyTuple_SET_ITEM(t, 1, ob);
688 Py_INCREF(ob);
689
690 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
691 goto finally;
692
693 if (!self->bin) {
694 c_str[0] = PUT;
695 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
696 len = strlen(c_str);
697 }
698 else if (Pdata_Check(self->file)) {
699 if (write_other(self, NULL, 0) < 0) return -1;
700 PDATA_APPEND(self->file, memo_len, -1);
701 res=0; /* Job well done ;) */
702 goto finally;
703 }
704 else {
705 if (p >= 256) {
706 c_str[0] = LONG_BINPUT;
707 c_str[1] = (int)(p & 0xff);
708 c_str[2] = (int)((p >> 8) & 0xff);
709 c_str[3] = (int)((p >> 16) & 0xff);
710 c_str[4] = (int)((p >> 24) & 0xff);
711 len = 5;
712 }
713 else {
714 c_str[0] = BINPUT;
715 c_str[1] = p;
716 len = 2;
717 }
718 }
719
Tim Peters0bc93f52003-02-02 18:29:33 +0000720 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 goto finally;
722
723 res = 0;
724
725 finally:
726 Py_XDECREF(py_ob_id);
727 Py_XDECREF(memo_len);
728 Py_XDECREF(t);
729
730 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000731}
732
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000733static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000734whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 PyObject *module = 0, *modules_dict = 0,
738 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000741 if (module)
742 return module;
743 if (PyErr_ExceptionMatches(PyExc_AttributeError))
744 PyErr_Clear();
745 else
746 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000747
Tim Peterscba30e22003-02-01 06:24:36 +0000748 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751 i = 0;
752 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 global_name_attr = PyObject_GetAttr(module, global_name);
757 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000758 if (PyErr_ExceptionMatches(PyExc_AttributeError))
759 PyErr_Clear();
760 else
761 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 continue;
763 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 if (global_name_attr != global) {
766 Py_DECREF(global_name_attr);
767 continue;
768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 break;
773 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 /* The following implements the rule in pickle.py added in 1.5
776 that used __main__ if no module is found. I don't actually
777 like this rule. jlf
778 */
779 if (!j) {
780 j=1;
781 name=__main___str;
782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 Py_INCREF(name);
785 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000786}
787
788
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000790fast_save_enter(Picklerobject *self, PyObject *obj)
791{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 /* if fast_container < 0, we're doing an error exit. */
793 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
794 PyObject *key = NULL;
795 if (self->fast_memo == NULL) {
796 self->fast_memo = PyDict_New();
797 if (self->fast_memo == NULL) {
798 self->fast_container = -1;
799 return 0;
800 }
801 }
802 key = PyLong_FromVoidPtr(obj);
803 if (key == NULL)
804 return 0;
805 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000806 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000808 "fast mode: can't pickle cyclic objects "
809 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 obj->ob_type->tp_name, obj);
811 self->fast_container = -1;
812 return 0;
813 }
814 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000815 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 self->fast_container = -1;
817 return 0;
818 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000819 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000820 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000822}
823
Tim Peterscba30e22003-02-01 06:24:36 +0000824int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000825fast_save_leave(Picklerobject *self, PyObject *obj)
826{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
828 PyObject *key = PyLong_FromVoidPtr(obj);
829 if (key == NULL)
830 return 0;
831 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000832 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 return 0;
834 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000835 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000836 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000838}
839
840static int
Tim Peterscba30e22003-02-01 06:24:36 +0000841save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842{
843 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000844 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848}
849
Guido van Rossum77f6a652002-04-03 22:41:51 +0000850static int
Tim Peterscba30e22003-02-01 06:24:36 +0000851save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000852{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000853 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000854 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000855 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000856
Tim Peters3c67d792003-02-02 17:59:11 +0000857 if (self->proto >= 2) {
858 char opcode = l ? NEWTRUE : NEWFALSE;
859 if (self->write_func(self, &opcode, 1) < 0)
860 return -1;
861 }
862 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000863 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000864 return 0;
865}
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Guido van Rossum60456fd1997-04-09 17:36:32 +0000867static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000868save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869{
870 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000874#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 || l > 0x7fffffffL
876 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000877#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 ) {
879 /* Text-mode pickle, or long too big to fit in the 4-byte
880 * signed BININT format: store as a string.
881 */
882 c_str[0] = INT;
883 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000884 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 return -1;
886 }
887 else {
888 /* Binary pickle and l fits in a signed 4-byte int. */
889 c_str[1] = (int)( l & 0xff);
890 c_str[2] = (int)((l >> 8) & 0xff);
891 c_str[3] = (int)((l >> 16) & 0xff);
892 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 if ((c_str[4] == 0) && (c_str[3] == 0)) {
895 if (c_str[2] == 0) {
896 c_str[0] = BININT1;
897 len = 2;
898 }
899 else {
900 c_str[0] = BININT2;
901 len = 3;
902 }
903 }
904 else {
905 c_str[0] = BININT;
906 len = 5;
907 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Tim Peters0bc93f52003-02-02 18:29:33 +0000909 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return -1;
911 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914}
915
916
917static int
Tim Peterscba30e22003-02-01 06:24:36 +0000918save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +0000921 int res = -1;
922 PyObject *repr = NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000923 long val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925
Guido van Rossumddefaf32007-01-14 03:31:43 +0000926 if (val == -1 && PyErr_Occurred()) {
927 /* out of range for int pickling */
928 PyErr_Clear();
929 }
930 else
931 return save_int(self, val);
932
Tim Petersee1a53c2003-02-02 02:57:53 +0000933 if (self->proto >= 2) {
934 /* Linear-time pickling. */
935 size_t nbits;
936 size_t nbytes;
937 unsigned char *pdata;
938 char c_str[5];
939 int i;
940 int sign = _PyLong_Sign(args);
941
942 if (sign == 0) {
943 /* It's 0 -- an empty bytestring. */
944 c_str[0] = LONG1;
945 c_str[1] = 0;
946 i = self->write_func(self, c_str, 2);
947 if (i < 0) goto finally;
948 res = 0;
949 goto finally;
950 }
951 nbits = _PyLong_NumBits(args);
952 if (nbits == (size_t)-1 && PyErr_Occurred())
953 goto finally;
954 /* How many bytes do we need? There are nbits >> 3 full
955 * bytes of data, and nbits & 7 leftover bits. If there
956 * are any leftover bits, then we clearly need another
957 * byte. Wnat's not so obvious is that we *probably*
958 * need another byte even if there aren't any leftovers:
959 * the most-significant bit of the most-significant byte
960 * acts like a sign bit, and it's usually got a sense
961 * opposite of the one we need. The exception is longs
962 * of the form -(2**(8*j-1)) for j > 0. Such a long is
963 * its own 256's-complement, so has the right sign bit
964 * even without the extra byte. That's a pain to check
965 * for in advance, though, so we always grab an extra
966 * byte at the start, and cut it back later if possible.
967 */
968 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000970 PyErr_SetString(PyExc_OverflowError, "long too large "
971 "to pickle");
972 goto finally;
973 }
974 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
975 if (repr == NULL) goto finally;
976 pdata = (unsigned char *)PyString_AS_STRING(repr);
977 i = _PyLong_AsByteArray((PyLongObject *)args,
978 pdata, nbytes,
979 1 /* little endian */, 1 /* signed */);
980 if (i < 0) goto finally;
981 /* If the long is negative, this may be a byte more than
982 * needed. This is so iff the MSB is all redundant sign
983 * bits.
984 */
985 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
986 (pdata[nbytes - 2] & 0x80) != 0)
987 --nbytes;
988
989 if (nbytes < 256) {
990 c_str[0] = LONG1;
991 c_str[1] = (char)nbytes;
992 size = 2;
993 }
994 else {
995 c_str[0] = LONG4;
996 size = (int)nbytes;
997 for (i = 1; i < 5; i++) {
998 c_str[i] = (char)(size & 0xff);
999 size >>= 8;
1000 }
1001 size = 5;
1002 }
1003 i = self->write_func(self, c_str, size);
1004 if (i < 0) goto finally;
1005 i = self->write_func(self, (char *)pdata, (int)nbytes);
1006 if (i < 0) goto finally;
1007 res = 0;
1008 goto finally;
1009 }
1010
1011 /* proto < 2: write the repr and newline. This is quadratic-time
1012 * (in the number of digits), in both directions.
1013 */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001014 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((size = PyString_Size(repr)) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Tim Peters0bc93f52003-02-02 18:29:33 +00001023 if (self->write_func(self,
1024 PyString_AS_STRING((PyStringObject *)repr),
1025 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Tim Peters0bc93f52003-02-02 18:29:33 +00001028 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 finally:
1034 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036}
1037
1038
1039static int
Tim Peterscba30e22003-02-01 06:24:36 +00001040save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041{
1042 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001046 str[0] = BINFLOAT;
1047 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001049 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 return -1;
1051 }
1052 else {
1053 char c_str[250];
1054 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1056 /* Extend the formatted string with a newline character */
1057 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Tim Peters0bc93f52003-02-02 18:29:33 +00001059 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 return -1;
1061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064}
1065
1066
1067static int
Tim Peterscba30e22003-02-01 06:24:36 +00001068save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069{
1070 int size, len;
1071 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if ((size = PyString_Size(args)) < 0)
1074 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001076 if (!self->bin) {
1077 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001079 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001080
Walter Dörwald1ab83302007-05-18 17:15:44 +00001081 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001084 if ((len = PyString_Size(repr)) < 0)
1085 goto err;
1086 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Guido van Rossumaa588c42007-06-15 03:35:38 +00001088 /* Strip leading 's' due to repr() of str8() returning s'...' */
Guido van Rossum1718fd12007-07-03 20:30:03 +00001089 if (repr_str[0] == 's') {
Guido van Rossumaa588c42007-06-15 03:35:38 +00001090 repr_str++;
Guido van Rossum1718fd12007-07-03 20:30:03 +00001091 len--;
1092 }
Guido van Rossumaa588c42007-06-15 03:35:38 +00001093
Tim Peters0bc93f52003-02-02 18:29:33 +00001094 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001095 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Tim Peters0bc93f52003-02-02 18:29:33 +00001097 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001098 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099
Tim Peters0bc93f52003-02-02 18:29:33 +00001100 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 Py_XDECREF(repr);
1104 }
1105 else {
1106 int i;
1107 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 if ((size = PyString_Size(args)) < 0)
1110 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 if (size < 256) {
1113 c_str[0] = SHORT_BINSTRING;
1114 c_str[1] = size;
1115 len = 2;
1116 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 c_str[0] = BINSTRING;
1119 for (i = 1; i < 5; i++)
1120 c_str[i] = (int)(size >> ((i - 1) * 8));
1121 len = 5;
1122 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001123 else
1124 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 if (size > 128 && Pdata_Check(self->file)) {
1130 if (write_other(self, NULL, 0) < 0) return -1;
1131 PDATA_APPEND(self->file, args, -1);
1132 }
1133 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self,
1135 PyString_AS_STRING(
1136 (PyStringObject *)args),
1137 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return -1;
1139 }
1140 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 if (doput)
1143 if (put(self, args) < 0)
1144 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 err:
1149 Py_XDECREF(repr);
1150 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151}
1152
1153
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001154static int
1155save_bytes(Picklerobject *self, PyObject *args, int doput)
1156{
1157 int size, len;
1158 PyObject *repr=0;
1159
1160 if ((size = PyBytes_Size(args)) < 0)
1161 return -1;
1162
1163 if (!self->bin) {
1164 char *repr_str;
1165
1166 static char string = STRING;
1167
1168 if (!( repr = PyObject_ReprStr8(args)))
1169 return -1;
1170
1171 if ((len = PyString_Size(repr)) < 0)
1172 goto err;
1173 repr_str = PyString_AS_STRING((PyStringObject *)repr);
1174
1175 /* Strip leading 's' due to repr() of str8() returning s'...' */
1176 if (repr_str[0] == 'b') {
1177 repr_str++;
1178 len--;
1179 }
1180
1181 if (self->write_func(self, &string, 1) < 0)
1182 goto err;
1183
1184 if (self->write_func(self, repr_str, len) < 0)
1185 goto err;
1186
1187 if (self->write_func(self, "\n", 1) < 0)
1188 goto err;
1189
1190 Py_XDECREF(repr);
1191 }
1192 else {
1193 int i;
1194 char c_str[5];
1195
1196 if ((size = PyBytes_Size(args)) < 0)
1197 return -1;
1198
1199 if (size < 256) {
1200 c_str[0] = SHORT_BINSTRING;
1201 c_str[1] = size;
1202 len = 2;
1203 }
1204 else if (size <= INT_MAX) {
1205 c_str[0] = BINSTRING;
1206 for (i = 1; i < 5; i++)
1207 c_str[i] = (int)(size >> ((i - 1) * 8));
1208 len = 5;
1209 }
1210 else
1211 return -1; /* string too large */
1212
1213 if (self->write_func(self, c_str, len) < 0)
1214 return -1;
1215
1216 if (size > 128 && Pdata_Check(self->file)) {
1217 if (write_other(self, NULL, 0) < 0) return -1;
1218 PDATA_APPEND(self->file, args, -1);
1219 }
1220 else {
1221 if (self->write_func(self,
1222 PyBytes_AsString(args),
1223 size) < 0)
1224 return -1;
1225 }
1226 }
1227
1228 if (doput)
1229 if (put(self, args) < 0)
1230 return -1;
1231
1232 return 0;
1233
1234 err:
1235 Py_XDECREF(repr);
1236 return -1;
1237}
1238
1239
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001240/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1241 backslash and newline characters to \uXXXX escapes. */
1242static PyObject *
1243modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1244{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 PyObject *repr;
1246 char *p;
1247 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001249 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 repr = PyString_FromStringAndSize(NULL, 6 * size);
1252 if (repr == NULL)
1253 return NULL;
1254 if (size == 0)
1255 return repr;
1256
1257 p = q = PyString_AS_STRING(repr);
1258 while (size-- > 0) {
1259 Py_UNICODE ch = *s++;
1260 /* Map 16-bit characters to '\uxxxx' */
1261 if (ch >= 256 || ch == '\\' || ch == '\n') {
1262 *p++ = '\\';
1263 *p++ = 'u';
1264 *p++ = hexdigit[(ch >> 12) & 0xf];
1265 *p++ = hexdigit[(ch >> 8) & 0xf];
1266 *p++ = hexdigit[(ch >> 4) & 0xf];
1267 *p++ = hexdigit[ch & 15];
1268 }
1269 /* Copy everything else as-is */
1270 else
1271 *p++ = (char) ch;
1272 }
1273 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001274 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001275 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001276}
1277
1278
Guido van Rossum60456fd1997-04-09 17:36:32 +00001279static int
Tim Peterscba30e22003-02-01 06:24:36 +00001280save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001282 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001285 if (!PyUnicode_Check(args))
1286 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288 if (!self->bin) {
1289 char *repr_str;
1290 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 repr = modified_EncodeRawUnicodeEscape(
1293 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001294 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if ((len = PyString_Size(repr)) < 0)
1298 goto err;
1299 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Tim Peters0bc93f52003-02-02 18:29:33 +00001301 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Tim Peters0bc93f52003-02-02 18:29:33 +00001304 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Tim Peters0bc93f52003-02-02 18:29:33 +00001307 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 Py_XDECREF(repr);
1311 }
1312 else {
1313 int i;
1314 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Tim Peterscba30e22003-02-01 06:24:36 +00001316 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Guido van Rossum617dbc42007-05-07 23:57:08 +00001319 assert(PyBytes_Check(repr));
1320 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001322 if (size > INT_MAX)
1323 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 c_str[0] = BINUNICODE;
1326 for (i = 1; i < 5; i++)
1327 c_str[i] = (int)(size >> ((i - 1) * 8));
1328 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Tim Peters0bc93f52003-02-02 18:29:33 +00001330 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001333 if (size > 128 && Pdata_Check(self->file)) {
1334 if (write_other(self, NULL, 0) < 0)
1335 goto err;
1336 PDATA_APPEND(self->file, repr, -1);
1337 }
1338 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001339 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001340 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 goto err;
1342 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 Py_DECREF(repr);
1345 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if (doput)
1348 if (put(self, args) < 0)
1349 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 err:
1354 Py_XDECREF(repr);
1355 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001356}
1357
Tim Peters1d63c9f2003-02-02 20:29:39 +00001358/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1359static int
Tim Peters67920142003-02-05 03:46:17 +00001360store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001361{
1362 int i;
1363 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Tim Peters1d63c9f2003-02-02 20:29:39 +00001365 assert(PyTuple_Size(t) == len);
1366
1367 for (i = 0; i < len; i++) {
1368 PyObject *element = PyTuple_GET_ITEM(t, i);
1369
1370 if (element == NULL)
1371 goto finally;
1372 if (save(self, element, 0) < 0)
1373 goto finally;
1374 }
1375 res = 0;
1376
1377 finally:
1378 return res;
1379}
1380
1381/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1382 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001383 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001384 * (a tuple can be reached from itself), and that requires some subtle
1385 * magic so that it works in all cases. IOW, this is a long routine.
1386 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001387static int
Tim Peterscba30e22003-02-01 06:24:36 +00001388save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001390 PyObject *py_tuple_id = NULL;
1391 int len, i;
1392 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001395 static char pop = POP;
1396 static char pop_mark = POP_MARK;
1397 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 if ((len = PyTuple_Size(args)) < 0)
1400 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001401
Tim Peters1d63c9f2003-02-02 20:29:39 +00001402 if (len == 0) {
1403 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001404
Tim Peters1d63c9f2003-02-02 20:29:39 +00001405 if (self->proto) {
1406 c_str[0] = EMPTY_TUPLE;
1407 len = 1;
1408 }
1409 else {
1410 c_str[0] = MARK;
1411 c_str[1] = TUPLE;
1412 len = 2;
1413 }
1414 if (self->write_func(self, c_str, len) >= 0)
1415 res = 0;
1416 /* Don't memoize an empty tuple. */
1417 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Tim Peters1d63c9f2003-02-02 20:29:39 +00001420 /* A non-empty tuple. */
1421
1422 /* id(tuple) isn't in the memo now. If it shows up there after
1423 * saving the tuple elements, the tuple must be recursive, in
1424 * which case we'll pop everything we put on the stack, and fetch
1425 * its value from the memo.
1426 */
1427 py_tuple_id = PyLong_FromVoidPtr(args);
1428 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001430
Tim Peters1d63c9f2003-02-02 20:29:39 +00001431 if (len <= 3 && self->proto >= 2) {
1432 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001433 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001434 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001436 /* pop the len elements */
1437 for (i = 0; i < len; ++i)
1438 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001440 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 if (get(self, py_tuple_id) < 0)
1442 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 res = 0;
1444 goto finally;
1445 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001446 /* Not recursive. */
1447 if (self->write_func(self, len2opcode + len, 1) < 0)
1448 goto finally;
1449 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
Tim Peters1d63c9f2003-02-02 20:29:39 +00001452 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1453 * Generate MARK elt1 elt2 ... TUPLE
1454 */
1455 if (self->write_func(self, &MARKv, 1) < 0)
1456 goto finally;
1457
Tim Peters67920142003-02-05 03:46:17 +00001458 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001459 goto finally;
1460
1461 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1462 /* pop the stack stuff we pushed */
1463 if (self->bin) {
1464 if (self->write_func(self, &pop_mark, 1) < 0)
1465 goto finally;
1466 }
1467 else {
1468 /* Note that we pop one more than len, to remove
1469 * the MARK too.
1470 */
1471 for (i = 0; i <= len; i++)
1472 if (self->write_func(self, &pop, 1) < 0)
1473 goto finally;
1474 }
1475 /* fetch from memo */
1476 if (get(self, py_tuple_id) >= 0)
1477 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 goto finally;
1479 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001480
Tim Peters1d63c9f2003-02-02 20:29:39 +00001481 /* Not recursive. */
1482 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001484
Tim Peters1d63c9f2003-02-02 20:29:39 +00001485 memoize:
1486 if (put(self, args) >= 0)
1487 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489 finally:
1490 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492}
1493
Tim Peters1092d642003-02-11 21:06:20 +00001494/* iter is an iterator giving items, and we batch up chunks of
1495 * MARK item item ... item APPENDS
1496 * opcode sequences. Calling code should have arranged to first create an
1497 * empty list, or list-like object, for the APPENDS to operate on.
1498 * Returns 0 on success, <0 on error.
1499 */
1500static int
1501batch_list(Picklerobject *self, PyObject *iter)
1502{
1503 PyObject *obj;
1504 PyObject *slice[BATCHSIZE];
1505 int i, n;
1506
1507 static char append = APPEND;
1508 static char appends = APPENDS;
1509
1510 assert(iter != NULL);
1511
1512 if (self->proto == 0) {
1513 /* APPENDS isn't available; do one at a time. */
1514 for (;;) {
1515 obj = PyIter_Next(iter);
1516 if (obj == NULL) {
1517 if (PyErr_Occurred())
1518 return -1;
1519 break;
1520 }
1521 i = save(self, obj, 0);
1522 Py_DECREF(obj);
1523 if (i < 0)
1524 return -1;
1525 if (self->write_func(self, &append, 1) < 0)
1526 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001527 }
1528 return 0;
1529 }
1530
1531 /* proto > 0: write in batches of BATCHSIZE. */
1532 do {
1533 /* Get next group of (no more than) BATCHSIZE elements. */
1534 for (n = 0; n < BATCHSIZE; ++n) {
1535 obj = PyIter_Next(iter);
1536 if (obj == NULL) {
1537 if (PyErr_Occurred())
1538 goto BatchFailed;
1539 break;
1540 }
1541 slice[n] = obj;
1542 }
1543
1544 if (n > 1) {
1545 /* Pump out MARK, slice[0:n], APPENDS. */
1546 if (self->write_func(self, &MARKv, 1) < 0)
1547 goto BatchFailed;
1548 for (i = 0; i < n; ++i) {
1549 if (save(self, slice[i], 0) < 0)
1550 goto BatchFailed;
1551 }
1552 if (self->write_func(self, &appends, 1) < 0)
1553 goto BatchFailed;
1554 }
1555 else if (n == 1) {
1556 if (save(self, slice[0], 0) < 0)
1557 goto BatchFailed;
1558 if (self->write_func(self, &append, 1) < 0)
1559 goto BatchFailed;
1560 }
1561
1562 for (i = 0; i < n; ++i) {
1563 Py_DECREF(slice[i]);
1564 }
Tim Peters90975f12003-02-12 05:28:58 +00001565 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001566 return 0;
1567
1568BatchFailed:
1569 while (--n >= 0) {
1570 Py_DECREF(slice[n]);
1571 }
1572 return -1;
1573}
1574
Guido van Rossum60456fd1997-04-09 17:36:32 +00001575static int
Tim Peterscba30e22003-02-01 06:24:36 +00001576save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001577{
Tim Peters1092d642003-02-11 21:06:20 +00001578 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001580 int len;
1581 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001583 if (self->fast && !fast_save_enter(self, args))
1584 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001585
Tim Peters1092d642003-02-11 21:06:20 +00001586 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 if (self->bin) {
1588 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001589 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001590 }
1591 else {
1592 s[0] = MARK;
1593 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001594 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001596
Tim Peters1092d642003-02-11 21:06:20 +00001597 if (self->write_func(self, s, len) < 0)
1598 goto finally;
1599
1600 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 if ((len = PyList_Size(args)) < 0)
1602 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001603
Tim Peters1092d642003-02-11 21:06:20 +00001604 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001606 if (put(self, args) >= 0)
1607 res = 0;
1608 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 }
Tim Peters90975f12003-02-12 05:28:58 +00001610 if (put2(self, args) < 0)
1611 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001612
Tim Peters1092d642003-02-11 21:06:20 +00001613 /* Materialize the list elements. */
1614 iter = PyObject_GetIter(args);
1615 if (iter == NULL)
1616 goto finally;
1617 res = batch_list(self, iter);
1618 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 finally:
1621 if (self->fast && !fast_save_leave(self, args))
1622 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625}
1626
1627
Tim Peters42f08ac2003-02-11 22:43:24 +00001628/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1629 * MARK key value ... key value SETITEMS
1630 * opcode sequences. Calling code should have arranged to first create an
1631 * empty dict, or dict-like object, for the SETITEMS to operate on.
1632 * Returns 0 on success, <0 on error.
1633 *
1634 * This is very much like batch_list(). The difference between saving
1635 * elements directly, and picking apart two-tuples, is so long-winded at
1636 * the C level, though, that attempts to combine these routines were too
1637 * ugly to bear.
1638 */
1639static int
1640batch_dict(Picklerobject *self, PyObject *iter)
1641{
1642 PyObject *p;
1643 PyObject *slice[BATCHSIZE];
1644 int i, n;
1645
1646 static char setitem = SETITEM;
1647 static char setitems = SETITEMS;
1648
1649 assert(iter != NULL);
1650
1651 if (self->proto == 0) {
1652 /* SETITEMS isn't available; do one at a time. */
1653 for (;;) {
1654 p = PyIter_Next(iter);
1655 if (p == NULL) {
1656 if (PyErr_Occurred())
1657 return -1;
1658 break;
1659 }
1660 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1661 PyErr_SetString(PyExc_TypeError, "dict items "
1662 "iterator must return 2-tuples");
1663 return -1;
1664 }
1665 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1666 if (i >= 0)
1667 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1668 Py_DECREF(p);
1669 if (i < 0)
1670 return -1;
1671 if (self->write_func(self, &setitem, 1) < 0)
1672 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001673 }
1674 return 0;
1675 }
1676
1677 /* proto > 0: write in batches of BATCHSIZE. */
1678 do {
1679 /* Get next group of (no more than) BATCHSIZE elements. */
1680 for (n = 0; n < BATCHSIZE; ++n) {
1681 p = PyIter_Next(iter);
1682 if (p == NULL) {
1683 if (PyErr_Occurred())
1684 goto BatchFailed;
1685 break;
1686 }
1687 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1688 PyErr_SetString(PyExc_TypeError, "dict items "
1689 "iterator must return 2-tuples");
1690 goto BatchFailed;
1691 }
1692 slice[n] = p;
1693 }
1694
1695 if (n > 1) {
1696 /* Pump out MARK, slice[0:n], SETITEMS. */
1697 if (self->write_func(self, &MARKv, 1) < 0)
1698 goto BatchFailed;
1699 for (i = 0; i < n; ++i) {
1700 p = slice[i];
1701 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1702 goto BatchFailed;
1703 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1704 goto BatchFailed;
1705 }
1706 if (self->write_func(self, &setitems, 1) < 0)
1707 goto BatchFailed;
1708 }
1709 else if (n == 1) {
1710 p = slice[0];
1711 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1712 goto BatchFailed;
1713 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1714 goto BatchFailed;
1715 if (self->write_func(self, &setitem, 1) < 0)
1716 goto BatchFailed;
1717 }
1718
1719 for (i = 0; i < n; ++i) {
1720 Py_DECREF(slice[i]);
1721 }
Tim Peters90975f12003-02-12 05:28:58 +00001722 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001723 return 0;
1724
1725BatchFailed:
1726 while (--n >= 0) {
1727 Py_DECREF(slice[n]);
1728 }
1729 return -1;
1730}
1731
Guido van Rossum60456fd1997-04-09 17:36:32 +00001732static int
Tim Peterscba30e22003-02-01 06:24:36 +00001733save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734{
Tim Peters42f08ac2003-02-11 22:43:24 +00001735 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001737 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001738 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 if (self->fast && !fast_save_enter(self, args))
1741 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001742
Tim Peters42f08ac2003-02-11 22:43:24 +00001743 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 if (self->bin) {
1745 s[0] = EMPTY_DICT;
1746 len = 1;
1747 }
1748 else {
1749 s[0] = MARK;
1750 s[1] = DICT;
1751 len = 2;
1752 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001753
Tim Peters0bc93f52003-02-02 18:29:33 +00001754 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Tim Peters42f08ac2003-02-11 22:43:24 +00001757 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 if ((len = PyDict_Size(args)) < 0)
1759 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001762 if (put(self, args) >= 0)
1763 res = 0;
1764 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001765 }
Tim Peters90975f12003-02-12 05:28:58 +00001766 if (put2(self, args) < 0)
1767 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Tim Peters42f08ac2003-02-11 22:43:24 +00001769 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001770 items = PyObject_CallMethod(args, "items", "()");
1771 if (items == NULL)
1772 goto finally;
1773 iter = PyObject_GetIter(items);
1774 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001775 if (iter == NULL)
1776 goto finally;
1777 res = batch_dict(self, iter);
1778 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 finally:
1781 if (self->fast && !fast_save_leave(self, args))
1782 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785}
1786
1787
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788static int
Tim Peterscba30e22003-02-01 06:24:36 +00001789save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001790{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001791 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 char *name_str, *module_str;
1793 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 if (name) {
1798 global_name = name;
1799 Py_INCREF(global_name);
1800 }
1801 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001802 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 goto finally;
1804 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Tim Peterscba30e22003-02-01 06:24:36 +00001806 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 if ((module_size = PyString_Size(module)) < 0 ||
1810 (name_size = PyString_Size(global_name)) < 0)
1811 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001812
Martin v. Löwis5b222132007-06-10 09:51:05 +00001813 module_str = PyUnicode_AsString(module);
1814 name_str = PyUnicode_AsString(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Guido van Rossum75bfd052002-12-24 18:10:07 +00001816 /* XXX This can be doing a relative import. Clearly it shouldn't,
1817 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 mod = PyImport_ImportModule(module_str);
1819 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001821 "Can't pickle %s: import of module %s "
1822 "failed",
1823 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 goto finally;
1825 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001826 klass = PyObject_GetAttr(mod, global_name);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 if (klass == NULL) {
1828 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001829 "Can't pickle %s: attribute lookup %s.%s "
1830 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 "OSS", args, module, global_name);
1832 goto finally;
1833 }
1834 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001835 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001836 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001837 "Can't pickle %s: it's not the same object "
1838 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 "OSS", args, module, global_name);
1840 goto finally;
1841 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001842 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001843
Tim Peters731098b2003-02-04 20:56:09 +00001844 if (self->proto >= 2) {
1845 /* See whether this is in the extension registry, and if
1846 * so generate an EXT opcode.
1847 */
1848 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001849 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001850 char c_str[5];
1851 int n;
1852
1853 PyTuple_SET_ITEM(two_tuple, 0, module);
1854 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1855 py_code = PyDict_GetItem(extension_registry, two_tuple);
1856 if (py_code == NULL)
1857 goto gen_global; /* not registered */
1858
1859 /* Verify py_code has the right type and value. */
1860 if (!PyInt_Check(py_code)) {
1861 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001862 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001863 "OO", args, py_code);
1864 goto finally;
1865 }
1866 code = PyInt_AS_LONG(py_code);
1867 if (code <= 0 || code > 0x7fffffffL) {
1868 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1869 "extension code %ld is out of range",
1870 "Ol", args, code);
1871 goto finally;
1872 }
1873
1874 /* Generate an EXT opcode. */
1875 if (code <= 0xff) {
1876 c_str[0] = EXT1;
1877 c_str[1] = (char)code;
1878 n = 2;
1879 }
1880 else if (code <= 0xffff) {
1881 c_str[0] = EXT2;
1882 c_str[1] = (char)(code & 0xff);
1883 c_str[2] = (char)((code >> 8) & 0xff);
1884 n = 3;
1885 }
1886 else {
1887 c_str[0] = EXT4;
1888 c_str[1] = (char)(code & 0xff);
1889 c_str[2] = (char)((code >> 8) & 0xff);
1890 c_str[3] = (char)((code >> 16) & 0xff);
1891 c_str[4] = (char)((code >> 24) & 0xff);
1892 n = 5;
1893 }
1894
1895 if (self->write_func(self, c_str, n) >= 0)
1896 res = 0;
1897 goto finally; /* and don't memoize */
1898 }
1899
1900 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001901 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Tim Peters0bc93f52003-02-02 18:29:33 +00001904 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001906
Tim Peters0bc93f52003-02-02 18:29:33 +00001907 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001909
Tim Peters0bc93f52003-02-02 18:29:33 +00001910 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001911 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001912
Tim Peters0bc93f52003-02-02 18:29:33 +00001913 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 if (put(self, args) < 0)
1917 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 finally:
1922 Py_XDECREF(module);
1923 Py_XDECREF(global_name);
1924 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927}
1928
Guido van Rossum60456fd1997-04-09 17:36:32 +00001929static int
Tim Peterscba30e22003-02-01 06:24:36 +00001930save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931{
1932 PyObject *pid = 0;
1933 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 Py_INCREF(args);
1938 ARG_TUP(self, args);
1939 if (self->arg) {
1940 pid = PyObject_Call(f, self->arg, NULL);
1941 FREE_ARG_TUP(self);
1942 }
1943 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (pid != Py_None) {
1946 if (!self->bin) {
1947 if (!PyString_Check(pid)) {
1948 PyErr_SetString(PicklingError,
1949 "persistent id must be string");
1950 goto finally;
1951 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Tim Peters0bc93f52003-02-02 18:29:33 +00001953 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if ((size = PyString_Size(pid)) < 0)
1957 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001958
Tim Peters0bc93f52003-02-02 18:29:33 +00001959 if (self->write_func(self,
1960 PyString_AS_STRING(
1961 (PyStringObject *)pid),
1962 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Tim Peters0bc93f52003-02-02 18:29:33 +00001965 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 res = 1;
1969 goto finally;
1970 }
1971 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001972 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 res = -1;
1974 else
1975 res = 1;
1976 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001978 goto finally;
1979 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 finally:
1984 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001987}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001988
Tim Peters71fcda52003-02-14 23:05:28 +00001989/* We're saving ob, and args is the 2-thru-5 tuple returned by the
1990 * appropriate __reduce__ method for ob.
1991 */
Tim Peters84e87f32001-03-17 04:50:51 +00001992static int
Tim Peters71fcda52003-02-14 23:05:28 +00001993save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001994{
Tim Peters71fcda52003-02-14 23:05:28 +00001995 PyObject *callable;
1996 PyObject *argtup;
1997 PyObject *state = NULL;
1998 PyObject *listitems = NULL;
1999 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002000
Tim Peters71fcda52003-02-14 23:05:28 +00002001 int use_newobj = self->proto >= 2;
2002
2003 static char reduce = REDUCE;
2004 static char build = BUILD;
2005 static char newobj = NEWOBJ;
2006
2007 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2008 &callable,
2009 &argtup,
2010 &state,
2011 &listitems,
2012 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002014
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002015 if (!PyTuple_Check(argtup)) {
2016 PyErr_SetString(PicklingError,
2017 "args from reduce() should be a tuple");
2018 return -1;
2019 }
2020
Tim Peters71fcda52003-02-14 23:05:28 +00002021 if (state == Py_None)
2022 state = NULL;
2023 if (listitems == Py_None)
2024 listitems = NULL;
2025 if (dictitems == Py_None)
2026 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027
Tim Peters71fcda52003-02-14 23:05:28 +00002028 /* Protocol 2 special case: if callable's name is __newobj__, use
2029 * NEWOBJ. This consumes a lot of code.
2030 */
2031 if (use_newobj) {
2032 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Tim Peters71fcda52003-02-14 23:05:28 +00002034 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002035 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2036 PyErr_Clear();
2037 else
2038 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002039 use_newobj = 0;
2040 }
2041 else {
2042 use_newobj = PyString_Check(temp) &&
2043 strcmp(PyString_AS_STRING(temp),
2044 "__newobj__") == 0;
2045 Py_DECREF(temp);
2046 }
2047 }
2048 if (use_newobj) {
2049 PyObject *cls;
2050 PyObject *newargtup;
2051 int n, i;
2052
2053 /* Sanity checks. */
2054 n = PyTuple_Size(argtup);
2055 if (n < 1) {
2056 PyErr_SetString(PicklingError, "__newobj__ arglist "
2057 "is empty");
2058 return -1;
2059 }
2060
2061 cls = PyTuple_GET_ITEM(argtup, 0);
2062 if (! PyObject_HasAttrString(cls, "__new__")) {
2063 PyErr_SetString(PicklingError, "args[0] from "
2064 "__newobj__ args has no __new__");
2065 return -1;
2066 }
2067
2068 /* XXX How could ob be NULL? */
2069 if (ob != NULL) {
2070 PyObject *ob_dot_class;
2071
2072 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002073 if (ob_dot_class == NULL) {
2074 if (PyErr_ExceptionMatches(
2075 PyExc_AttributeError))
2076 PyErr_Clear();
2077 else
2078 return -1;
2079 }
Tim Peters71fcda52003-02-14 23:05:28 +00002080 i = ob_dot_class != cls; /* true iff a problem */
2081 Py_XDECREF(ob_dot_class);
2082 if (i) {
2083 PyErr_SetString(PicklingError, "args[0] from "
2084 "__newobj__ args has the wrong class");
2085 return -1;
2086 }
2087 }
2088
2089 /* Save the class and its __new__ arguments. */
2090 if (save(self, cls, 0) < 0)
2091 return -1;
2092
2093 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2094 if (newargtup == NULL)
2095 return -1;
2096 for (i = 1; i < n; ++i) {
2097 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2098 Py_INCREF(temp);
2099 PyTuple_SET_ITEM(newargtup, i-1, temp);
2100 }
2101 i = save(self, newargtup, 0) < 0;
2102 Py_DECREF(newargtup);
2103 if (i < 0)
2104 return -1;
2105
2106 /* Add NEWOBJ opcode. */
2107 if (self->write_func(self, &newobj, 1) < 0)
2108 return -1;
2109 }
2110 else {
2111 /* Not using NEWOBJ. */
2112 if (save(self, callable, 0) < 0 ||
2113 save(self, argtup, 0) < 0 ||
2114 self->write_func(self, &reduce, 1) < 0)
2115 return -1;
2116 }
2117
2118 /* Memoize. */
2119 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 if (ob != NULL) {
2121 if (state && !PyDict_Check(state)) {
2122 if (put2(self, ob) < 0)
2123 return -1;
2124 }
Tim Peters71fcda52003-02-14 23:05:28 +00002125 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 }
Tim Peters84e87f32001-03-17 04:50:51 +00002128
Guido van Rossum60456fd1997-04-09 17:36:32 +00002129
Tim Peters71fcda52003-02-14 23:05:28 +00002130 if (listitems && batch_list(self, listitems) < 0)
2131 return -1;
2132
2133 if (dictitems && batch_dict(self, dictitems) < 0)
2134 return -1;
2135
2136 if (state) {
2137 if (save(self, state, 0) < 0 ||
2138 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 return -1;
2140 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002143}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002144
Guido van Rossum60456fd1997-04-09 17:36:32 +00002145static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002146save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147{
2148 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002149 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2150 PyObject *arg_tup;
2151 int res = -1;
2152 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002153
Martin v. Löwis5a395302002-08-04 08:20:23 +00002154 if (self->nesting++ > Py_GetRecursionLimit()){
2155 PyErr_SetString(PyExc_RuntimeError,
2156 "maximum recursion depth exceeded");
2157 goto finally;
2158 }
2159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160 if (!pers_save && self->pers_func) {
2161 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2162 res = tmp;
2163 goto finally;
2164 }
2165 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 if (args == Py_None) {
2168 res = save_none(self, args);
2169 goto finally;
2170 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002172 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 switch (type->tp_name[0]) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002175 case 'b': /* XXX may want to save short byte strings here. */
Guido van Rossum77f6a652002-04-03 22:41:51 +00002176 if (args == Py_False || args == Py_True) {
2177 res = save_bool(self, args);
2178 goto finally;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002179 }
Guido van Rossum77f6a652002-04-03 22:41:51 +00002180 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002181 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 if (type == &PyLong_Type) {
2183 res = save_long(self, args);
2184 goto finally;
2185 }
2186 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002187
Guido van Rossum60456fd1997-04-09 17:36:32 +00002188 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 if (type == &PyFloat_Type) {
2190 res = save_float(self, args);
2191 goto finally;
2192 }
2193 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002194
Guido van Rossum60456fd1997-04-09 17:36:32 +00002195 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002196 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2197 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 goto finally;
2199 }
2200 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002201
Guido van Rossum32c38e72007-05-07 17:15:57 +00002202 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002203 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2204 res = save_string(self, args, 0);
2205 goto finally;
2206 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002207 if ((type == &PyUnicode_Type) && (PyUnicode_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 res = save_unicode(self, args, 0);
2209 goto finally;
2210 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002211 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002213 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002214 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002215 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002217 if (PyDict_GetItem(self->memo, py_ob_id)) {
2218 if (get(self, py_ob_id) < 0)
2219 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 res = 0;
2222 goto finally;
2223 }
2224 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002227 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002228 if (type == &PyString_Type) {
2229 res = save_string(self, args, 1);
2230 goto finally;
2231 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 if (type == &PyUnicode_Type) {
2233 res = save_unicode(self, args, 1);
2234 goto finally;
2235 }
2236 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002237
Guido van Rossum60456fd1997-04-09 17:36:32 +00002238 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 if (type == &PyTuple_Type) {
2240 res = save_tuple(self, args);
2241 goto finally;
2242 }
2243 if (type == &PyType_Type) {
2244 res = save_global(self, args, NULL);
2245 goto finally;
2246 }
2247 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002248
Guido van Rossum60456fd1997-04-09 17:36:32 +00002249 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002250 if (type == &PyList_Type) {
2251 res = save_list(self, args);
2252 goto finally;
2253 }
2254 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002255
2256 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 if (type == &PyDict_Type) {
2258 res = save_dict(self, args);
2259 goto finally;
2260 }
2261 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002262
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002263 case 'i':
2264 break;
2265
2266 case 'c':
2267 break;
2268
Guido van Rossum60456fd1997-04-09 17:36:32 +00002269 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270 if (type == &PyFunction_Type) {
2271 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002272 if (res && PyErr_ExceptionMatches(PickleError)) {
2273 /* fall back to reduce */
2274 PyErr_Clear();
2275 break;
2276 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 goto finally;
2278 }
2279 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002280
2281 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 if (type == &PyCFunction_Type) {
2283 res = save_global(self, args, NULL);
2284 goto finally;
2285 }
Martin v. Löwis10a60b32007-07-18 02:28:27 +00002286 else if (type == &PyBytes_Type) {
2287 res = save_bytes(self, args, 1);
2288 goto finally;
2289 }
2290 break;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 if (!pers_save && self->inst_pers_func) {
2294 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2295 res = tmp;
2296 goto finally;
2297 }
2298 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299
Jeremy Hylton39c61162002-07-16 19:47:43 +00002300 if (PyType_IsSubtype(type, &PyType_Type)) {
2301 res = save_global(self, args, NULL);
2302 goto finally;
2303 }
2304
Guido van Rossumb289b872003-02-19 01:45:13 +00002305 /* Get a reduction callable, and call it. This may come from
2306 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2307 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002308 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002309 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2310 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002312 Py_INCREF(args);
2313 ARG_TUP(self, args);
2314 if (self->arg) {
2315 t = PyObject_Call(__reduce__, self->arg, NULL);
2316 FREE_ARG_TUP(self);
2317 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002318 }
2319 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002320 /* Check for a __reduce_ex__ method. */
2321 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2322 if (__reduce__ != NULL) {
2323 t = PyInt_FromLong(self->proto);
2324 if (t != NULL) {
2325 ARG_TUP(self, t);
2326 t = NULL;
2327 if (self->arg) {
2328 t = PyObject_Call(__reduce__,
2329 self->arg, NULL);
2330 FREE_ARG_TUP(self);
2331 }
2332 }
2333 }
2334 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002335 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2336 PyErr_Clear();
2337 else
2338 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002339 /* Check for a __reduce__ method. */
2340 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2341 if (__reduce__ != NULL) {
2342 t = PyObject_Call(__reduce__,
2343 empty_tuple, NULL);
2344 }
2345 else {
2346 PyErr_SetObject(UnpickleableError, args);
2347 goto finally;
2348 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002350 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002351
Tim Peters71fcda52003-02-14 23:05:28 +00002352 if (t == NULL)
2353 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002354
Tim Peters71fcda52003-02-14 23:05:28 +00002355 if (PyString_Check(t)) {
2356 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357 goto finally;
2358 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002359
Tim Peters71fcda52003-02-14 23:05:28 +00002360 if (! PyTuple_Check(t)) {
2361 cPickle_ErrFormat(PicklingError, "Value returned by "
2362 "%s must be string or tuple",
2363 "O", __reduce__);
2364 goto finally;
2365 }
2366
2367 size = PyTuple_Size(t);
2368 if (size < 2 || size > 5) {
2369 cPickle_ErrFormat(PicklingError, "tuple returned by "
2370 "%s must contain 2 through 5 elements",
2371 "O", __reduce__);
2372 goto finally;
2373 }
2374
2375 arg_tup = PyTuple_GET_ITEM(t, 1);
2376 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2377 cPickle_ErrFormat(PicklingError, "Second element of "
2378 "tuple returned by %s must be a tuple",
2379 "O", __reduce__);
2380 goto finally;
2381 }
2382
2383 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002386 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 Py_XDECREF(py_ob_id);
2388 Py_XDECREF(__reduce__);
2389 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002392}
2393
2394
2395static int
Tim Peterscba30e22003-02-01 06:24:36 +00002396dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397{
2398 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002399
Tim Peters4190fb82003-02-02 16:09:05 +00002400 if (self->proto >= 2) {
2401 char bytes[2];
2402
2403 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002404 assert(self->proto >= 0 && self->proto < 256);
2405 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002406 if (self->write_func(self, bytes, 2) < 0)
2407 return -1;
2408 }
2409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002410 if (save(self, args, 0) < 0)
2411 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002412
Tim Peters4190fb82003-02-02 16:09:05 +00002413 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002415
Tim Peters4190fb82003-02-02 16:09:05 +00002416 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002420}
2421
2422static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002423Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424{
Tim Peterscba30e22003-02-01 06:24:36 +00002425 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426 PyDict_Clear(self->memo);
2427 Py_INCREF(Py_None);
2428 return Py_None;
2429}
2430
2431static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002432Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433{
2434 int l, i, rsize, ssize, clear=1, lm;
2435 long ik;
2436 PyObject *k, *r;
2437 char *s, *p, *have_get;
2438 Pdata *data;
2439
2440 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002441 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002442 return NULL;
2443
2444 /* Check to make sure we are based on a list */
2445 if (! Pdata_Check(self->file)) {
2446 PyErr_SetString(PicklingError,
2447 "Attempt to getvalue() a non-list-based pickler");
2448 return NULL;
2449 }
2450
2451 /* flush write buffer */
2452 if (write_other(self, NULL, 0) < 0) return NULL;
2453
2454 data=(Pdata*)self->file;
2455 l=data->length;
2456
2457 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002458 lm = PyDict_Size(self->memo);
2459 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002461 have_get = malloc(lm);
2462 if (have_get == NULL) return PyErr_NoMemory();
2463 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464
2465 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002466 for (rsize = 0, i = l; --i >= 0; ) {
2467 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468
Tim Petersac5687a2003-02-02 18:08:34 +00002469 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002470 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002471
2472 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002473 ik = PyInt_AsLong(k);
2474 if (ik == -1 && PyErr_Occurred())
2475 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002476 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 PyErr_SetString(PicklingError,
2478 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002479 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002480 }
Tim Petersac5687a2003-02-02 18:08:34 +00002481 if (have_get[ik]) /* with matching get */
2482 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002483 }
2484
2485 else if (! (PyTuple_Check(k) &&
2486 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002487 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 ) {
2489 PyErr_SetString(PicklingError,
2490 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002491 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492 }
2493
2494 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002495 ik = PyInt_AsLong(k);
2496 if (ik == -1 && PyErr_Occurred())
2497 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002498 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 PyErr_SetString(PicklingError,
2500 "Invalid get data");
2501 return NULL;
2502 }
Tim Petersac5687a2003-02-02 18:08:34 +00002503 have_get[ik] = 1;
2504 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 }
2507
2508 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002509 r = PyString_FromStringAndSize(NULL, rsize);
2510 if (r == NULL) goto err;
2511 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512
Tim Petersac5687a2003-02-02 18:08:34 +00002513 for (i = 0; i < l; i++) {
2514 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002515
2516 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002517 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002518 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002519 p=PyString_AS_STRING((PyStringObject *)k);
2520 while (--ssize >= 0)
2521 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 }
2523 }
2524
2525 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002526 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2527 if (ik == -1 && PyErr_Occurred())
2528 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529 if (ik < 256) {
2530 *s++ = BINGET;
2531 *s++ = (int)(ik & 0xff);
2532 }
2533 else {
2534 *s++ = LONG_BINGET;
2535 *s++ = (int)(ik & 0xff);
2536 *s++ = (int)((ik >> 8) & 0xff);
2537 *s++ = (int)((ik >> 16) & 0xff);
2538 *s++ = (int)((ik >> 24) & 0xff);
2539 }
2540 }
2541
2542 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002543 ik = PyLong_AsLong(k);
2544 if (ik == -1 && PyErr_Occurred())
2545 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546
2547 if (have_get[ik]) { /* with matching get */
2548 if (ik < 256) {
2549 *s++ = BINPUT;
2550 *s++ = (int)(ik & 0xff);
2551 }
2552 else {
2553 *s++ = LONG_BINPUT;
2554 *s++ = (int)(ik & 0xff);
2555 *s++ = (int)((ik >> 8) & 0xff);
2556 *s++ = (int)((ik >> 16) & 0xff);
2557 *s++ = (int)((ik >> 24) & 0xff);
2558 }
2559 }
2560 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 }
2562
2563 if (clear) {
2564 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002565 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 }
2567
2568 free(have_get);
2569 return r;
2570 err:
2571 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002572 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002573}
2574
2575static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002576Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577{
2578 PyObject *ob;
2579 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002580
Tim Peterscba30e22003-02-01 06:24:36 +00002581 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 if (dump(self, ob) < 0)
2585 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 /* XXX Why does dump() return self? */
2590 Py_INCREF(self);
2591 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592}
2593
2594
Tim Peterscba30e22003-02-01 06:24:36 +00002595static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596{
Neal Norwitzb0493252002-03-31 14:44:22 +00002597 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002598 PyDoc_STR("dump(object) -- "
2599 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002600 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002601 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002602 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002603 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002604 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002605};
2606
2607
2608static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002609newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610{
2611 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002612
Tim Peters5bd2a792003-02-01 16:45:06 +00002613 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002614 proto = HIGHEST_PROTOCOL;
2615 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002616 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2617 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002618 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002620 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002621
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002622 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002623 if (self == NULL)
2624 return NULL;
2625 self->proto = proto;
2626 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 self->fp = NULL;
2628 self->write = NULL;
2629 self->memo = NULL;
2630 self->arg = NULL;
2631 self->pers_func = NULL;
2632 self->inst_pers_func = NULL;
2633 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002635 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 self->fast_container = 0;
2637 self->fast_memo = NULL;
2638 self->buf_size = 0;
2639 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002640
Tim Peters5bd2a792003-02-01 16:45:06 +00002641 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 if (file)
2643 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002644 else {
2645 file = Pdata_New();
2646 if (file == NULL)
2647 goto err;
2648 }
2649 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002650
Tim Peterscba30e22003-02-01 06:24:36 +00002651 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002653
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002654 if (PycStringIO_OutputCheck(file)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 self->write_func = write_cStringIO;
2656 }
2657 else if (file == Py_None) {
2658 self->write_func = write_none;
2659 }
2660 else {
2661 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 if (! Pdata_Check(file)) {
2664 self->write = PyObject_GetAttr(file, write_str);
2665 if (!self->write) {
2666 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002667 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 "argument must have 'write' "
2669 "attribute");
2670 goto err;
2671 }
2672 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002673
Tim Peters5bd2a792003-02-01 16:45:06 +00002674 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2675 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 PyErr_NoMemory();
2677 goto err;
2678 }
2679 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002680
Guido van Rossuma8add0e2007-05-14 22:03:55 +00002681 self->dispatch_table = dispatch_table;
2682 Py_INCREF(dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002683 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002688 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002690}
2691
2692
2693static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002694get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002696 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002698 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002699
Tim Peters92c8bb32003-02-13 23:00:26 +00002700 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002701 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002702 * accepts Pickler() and Pickler(integer) too. The meaning then
2703 * is clear as mud, undocumented, and not supported by pickle.py.
2704 * I'm told Zope uses this, but I haven't traced into this code
2705 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002706 */
2707 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002709 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002710 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2711 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 return NULL;
2713 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002714 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002715}
2716
2717
2718static void
Tim Peterscba30e22003-02-01 06:24:36 +00002719Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002721 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 Py_XDECREF(self->write);
2723 Py_XDECREF(self->memo);
2724 Py_XDECREF(self->fast_memo);
2725 Py_XDECREF(self->arg);
2726 Py_XDECREF(self->file);
2727 Py_XDECREF(self->pers_func);
2728 Py_XDECREF(self->inst_pers_func);
2729 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002730 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002731 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002732}
2733
2734static int
2735Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2736{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002737 Py_VISIT(self->write);
2738 Py_VISIT(self->memo);
2739 Py_VISIT(self->fast_memo);
2740 Py_VISIT(self->arg);
2741 Py_VISIT(self->file);
2742 Py_VISIT(self->pers_func);
2743 Py_VISIT(self->inst_pers_func);
2744 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002745 return 0;
2746}
2747
2748static int
2749Pickler_clear(Picklerobject *self)
2750{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002751 Py_CLEAR(self->write);
2752 Py_CLEAR(self->memo);
2753 Py_CLEAR(self->fast_memo);
2754 Py_CLEAR(self->arg);
2755 Py_CLEAR(self->file);
2756 Py_CLEAR(self->pers_func);
2757 Py_CLEAR(self->inst_pers_func);
2758 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002759 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002760}
2761
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002762static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002763Pickler_get_pers_func(Picklerobject *p)
2764{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 if (p->pers_func == NULL)
2766 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2767 else
2768 Py_INCREF(p->pers_func);
2769 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002770}
2771
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002772static int
2773Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2774{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 if (v == NULL) {
2776 PyErr_SetString(PyExc_TypeError,
2777 "attribute deletion is not supported");
2778 return -1;
2779 }
2780 Py_XDECREF(p->pers_func);
2781 Py_INCREF(v);
2782 p->pers_func = v;
2783 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002784}
2785
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002786static int
2787Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2788{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 if (v == NULL) {
2790 PyErr_SetString(PyExc_TypeError,
2791 "attribute deletion is not supported");
2792 return -1;
2793 }
2794 Py_XDECREF(p->inst_pers_func);
2795 Py_INCREF(v);
2796 p->inst_pers_func = v;
2797 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002798}
2799
2800static PyObject *
2801Pickler_get_memo(Picklerobject *p)
2802{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 if (p->memo == NULL)
2804 PyErr_SetString(PyExc_AttributeError, "memo");
2805 else
2806 Py_INCREF(p->memo);
2807 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002808}
2809
2810static int
2811Pickler_set_memo(Picklerobject *p, PyObject *v)
2812{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002813 if (v == NULL) {
2814 PyErr_SetString(PyExc_TypeError,
2815 "attribute deletion is not supported");
2816 return -1;
2817 }
2818 if (!PyDict_Check(v)) {
2819 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2820 return -1;
2821 }
2822 Py_XDECREF(p->memo);
2823 Py_INCREF(v);
2824 p->memo = v;
2825 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002826}
2827
2828static PyObject *
2829Pickler_get_error(Picklerobject *p)
2830{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 /* why is this an attribute on the Pickler? */
2832 Py_INCREF(PicklingError);
2833 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002834}
2835
2836static PyMemberDef Pickler_members[] = {
2837 {"binary", T_INT, offsetof(Picklerobject, bin)},
2838 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002839 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002840};
2841
2842static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002843 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002844 (setter)Pickler_set_pers_func},
2845 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2846 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002847 {"PicklingError", (getter)Pickler_get_error, NULL},
2848 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002849};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002851PyDoc_STRVAR(Picklertype__doc__,
2852"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002853
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002854static PyTypeObject Picklertype = {
2855 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002857 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002858 sizeof(Picklerobject), /*tp_basicsize*/
2859 0,
2860 (destructor)Pickler_dealloc, /* tp_dealloc */
2861 0, /* tp_print */
2862 0, /* tp_getattr */
2863 0, /* tp_setattr */
2864 0, /* tp_compare */
2865 0, /* tp_repr */
2866 0, /* tp_as_number */
2867 0, /* tp_as_sequence */
2868 0, /* tp_as_mapping */
2869 0, /* tp_hash */
2870 0, /* tp_call */
2871 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002872 PyObject_GenericGetAttr, /* tp_getattro */
2873 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002874 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002875 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002876 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002877 (traverseproc)Pickler_traverse, /* tp_traverse */
2878 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002879 0, /* tp_richcompare */
2880 0, /* tp_weaklistoffset */
2881 0, /* tp_iter */
2882 0, /* tp_iternext */
2883 Pickler_methods, /* tp_methods */
2884 Pickler_members, /* tp_members */
2885 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002886};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002887
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002888static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002889find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890{
2891 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002893 if (fc) {
2894 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002895 PyErr_SetString(UnpicklingError, "Global and instance "
2896 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 return NULL;
2898 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002899 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2900 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002903 module = PySys_GetObject("modules");
2904 if (module == NULL)
2905 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907 module = PyDict_GetItem(module, py_module_name);
2908 if (module == NULL) {
2909 module = PyImport_Import(py_module_name);
2910 if (!module)
2911 return NULL;
2912 global = PyObject_GetAttr(module, py_global_name);
2913 Py_DECREF(module);
2914 }
2915 else
2916 global = PyObject_GetAttr(module, py_global_name);
2917 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002918}
2919
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002920static int
Tim Peterscba30e22003-02-01 06:24:36 +00002921marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922{
2923 if (self->num_marks < 1) {
2924 PyErr_SetString(UnpicklingError, "could not find MARK");
2925 return -1;
2926 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929}
2930
Tim Peters84e87f32001-03-17 04:50:51 +00002931
Guido van Rossum60456fd1997-04-09 17:36:32 +00002932static int
Tim Peterscba30e22003-02-01 06:24:36 +00002933load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002934{
2935 PDATA_APPEND(self->stack, Py_None, -1);
2936 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937}
2938
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002939static int
Tim Peterscba30e22003-02-01 06:24:36 +00002940bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941{
2942 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2943 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002944}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002945
2946static int
Tim Peterscba30e22003-02-01 06:24:36 +00002947load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948{
2949 PyObject *py_int = 0;
2950 char *endptr, *s;
2951 int len, res = -1;
2952 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
Tim Peters0bc93f52003-02-02 18:29:33 +00002954 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002955 if (len < 2) return bad_readline();
2956 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 errno = 0;
2959 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2962 /* Hm, maybe we've got something long. Let's try reading
2963 it as a Python long object. */
2964 errno = 0;
2965 py_int = PyLong_FromString(s, NULL, 0);
2966 if (py_int == NULL) {
2967 PyErr_SetString(PyExc_ValueError,
2968 "could not convert string to int");
2969 goto finally;
2970 }
2971 }
2972 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002973 if (len == 3 && (l == 0 || l == 1)) {
2974 if (!( py_int = PyBool_FromLong(l))) goto finally;
2975 }
2976 else {
2977 if (!( py_int = PyInt_FromLong(l))) goto finally;
2978 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 free(s);
2982 PDATA_PUSH(self->stack, py_int, -1);
2983 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 finally:
2986 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989}
2990
Tim Peters3c67d792003-02-02 17:59:11 +00002991static int
2992load_bool(Unpicklerobject *self, PyObject *boolean)
2993{
2994 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002995 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002996 return 0;
2997}
2998
Tim Petersee1a53c2003-02-02 02:57:53 +00002999/* s contains x bytes of a little-endian integer. Return its value as a
3000 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3001 * int, but when x is 4 it's a signed one. This is an historical source
3002 * of x-platform bugs.
3003 */
Tim Peters84e87f32001-03-17 04:50:51 +00003004static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003005calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006{
3007 unsigned char c;
3008 int i;
3009 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 for (i = 0, l = 0L; i < x; i++) {
3012 c = (unsigned char)s[i];
3013 l |= (long)c << (i * 8);
3014 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003015#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3017 * is signed, so on a box with longs bigger than 4 bytes we need
3018 * to extend a BININT's sign bit to the full width.
3019 */
3020 if (x == 4 && l & (1L << 31))
3021 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003022#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003024}
3025
3026
3027static int
Tim Peterscba30e22003-02-01 06:24:36 +00003028load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029{
3030 PyObject *py_int = 0;
3031 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003034
Tim Peterscba30e22003-02-01 06:24:36 +00003035 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003036 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003038 PDATA_PUSH(self->stack, py_int, -1);
3039 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040}
3041
3042
3043static int
Tim Peterscba30e22003-02-01 06:24:36 +00003044load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045{
3046 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
Tim Peters0bc93f52003-02-02 18:29:33 +00003048 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052}
3053
3054
3055static int
Tim Peterscba30e22003-02-01 06:24:36 +00003056load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057{
3058 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Tim Peters0bc93f52003-02-02 18:29:33 +00003060 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064}
3065
3066
3067static int
Tim Peterscba30e22003-02-01 06:24:36 +00003068load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069{
3070 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071
Tim Peters0bc93f52003-02-02 18:29:33 +00003072 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076}
Tim Peters84e87f32001-03-17 04:50:51 +00003077
Guido van Rossum60456fd1997-04-09 17:36:32 +00003078static int
Tim Peterscba30e22003-02-01 06:24:36 +00003079load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080{
3081 PyObject *l = 0;
3082 char *end, *s;
3083 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003084
Tim Peters0bc93f52003-02-02 18:29:33 +00003085 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 if (len < 2) return bad_readline();
3087 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Tim Peterscba30e22003-02-01 06:24:36 +00003089 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 free(s);
3093 PDATA_PUSH(self->stack, l, -1);
3094 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 finally:
3097 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100}
3101
Tim Petersee1a53c2003-02-02 02:57:53 +00003102/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3103 * data following.
3104 */
3105static int
3106load_counted_long(Unpicklerobject *self, int size)
3107{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003108 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003109 char *nbytes;
3110 unsigned char *pdata;
3111 PyObject *along;
3112
3113 assert(size == 1 || size == 4);
3114 i = self->read_func(self, &nbytes, size);
3115 if (i < 0) return -1;
3116
3117 size = calc_binint(nbytes, size);
3118 if (size < 0) {
3119 /* Corrupt or hostile pickle -- we never write one like
3120 * this.
3121 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003122 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003123 "byte count");
3124 return -1;
3125 }
3126
3127 if (size == 0)
3128 along = PyLong_FromLong(0L);
3129 else {
3130 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003131 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003132 if (i < 0) return -1;
3133 along = _PyLong_FromByteArray(pdata, (size_t)size,
3134 1 /* little endian */, 1 /* signed */);
3135 }
3136 if (along == NULL)
3137 return -1;
3138 PDATA_PUSH(self->stack, along, -1);
3139 return 0;
3140}
Tim Peters84e87f32001-03-17 04:50:51 +00003141
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142static int
Tim Peterscba30e22003-02-01 06:24:36 +00003143load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003144{
3145 PyObject *py_float = 0;
3146 char *endptr, *s;
3147 int len, res = -1;
3148 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Tim Peters0bc93f52003-02-02 18:29:33 +00003150 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151 if (len < 2) return bad_readline();
3152 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003155 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3158 PyErr_SetString(PyExc_ValueError,
3159 "could not convert string to float");
3160 goto finally;
3161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Tim Peterscba30e22003-02-01 06:24:36 +00003163 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 free(s);
3167 PDATA_PUSH(self->stack, py_float, -1);
3168 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 finally:
3171 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174}
3175
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176static int
Tim Peterscba30e22003-02-01 06:24:36 +00003177load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178{
Tim Peters9905b942003-03-20 20:53:32 +00003179 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 double x;
3181 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182
Tim Peters0bc93f52003-02-02 18:29:33 +00003183 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003184 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Tim Peters9905b942003-03-20 20:53:32 +00003186 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3187 if (x == -1.0 && PyErr_Occurred())
3188 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Tim Peters9905b942003-03-20 20:53:32 +00003190 py_float = PyFloat_FromDouble(x);
3191 if (py_float == NULL)
3192 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 PDATA_PUSH(self->stack, py_float, -1);
3195 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
3198static int
Tim Peterscba30e22003-02-01 06:24:36 +00003199load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200{
3201 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003202 int len, res = -1;
3203 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Tim Peters0bc93f52003-02-02 18:29:33 +00003205 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 if (len < 2) return bad_readline();
3207 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003209
3210 /* Strip outermost quotes */
3211 while (s[len-1] <= ' ')
3212 len--;
3213 if(s[0]=='"' && s[len-1]=='"'){
3214 s[len-1] = '\0';
3215 p = s + 1 ;
3216 len -= 2;
3217 } else if(s[0]=='\'' && s[len-1]=='\''){
3218 s[len-1] = '\0';
3219 p = s + 1 ;
3220 len -= 2;
3221 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 goto insecure;
3223 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003224
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003225 /* XXX avoid going through str8 here. */
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003226 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003227 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003228 if (str) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003229 PyObject *str2 = PyBytes_FromStringAndSize(
3230 PyString_AsString(str), PyString_Size(str));
3231 Py_DECREF(str);
3232 if (str2) {
3233 PDATA_PUSH(self->stack, str2, -1);
3234 res = 0;
3235 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003236 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 insecure:
3240 free(s);
3241 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3242 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003243}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
3245
3246static int
Tim Peterscba30e22003-02-01 06:24:36 +00003247load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248{
3249 PyObject *py_string = 0;
3250 long l;
3251 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003252
Tim Peters0bc93f52003-02-02 18:29:33 +00003253 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256
Tim Peters0bc93f52003-02-02 18:29:33 +00003257 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003260 if (!( py_string = PyBytes_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 PDATA_PUSH(self->stack, py_string, -1);
3264 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265}
3266
3267
3268static int
Tim Peterscba30e22003-02-01 06:24:36 +00003269load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270{
3271 PyObject *py_string = 0;
3272 unsigned char l;
3273 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003274
Tim Peters0bc93f52003-02-02 18:29:33 +00003275 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Tim Peters0bc93f52003-02-02 18:29:33 +00003280 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
Martin v. Löwis10a60b32007-07-18 02:28:27 +00003282 if (!( py_string = PyBytes_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 PDATA_PUSH(self->stack, py_string, -1);
3285 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003286}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
3288
3289static int
Tim Peterscba30e22003-02-01 06:24:36 +00003290load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291{
3292 PyObject *str = 0;
3293 int len, res = -1;
3294 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003295
Tim Peters0bc93f52003-02-02 18:29:33 +00003296 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003298
Tim Peterscba30e22003-02-01 06:24:36 +00003299 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003302 PDATA_PUSH(self->stack, str, -1);
3303 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003305 finally:
3306 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003307}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003308
3309
3310static int
Tim Peterscba30e22003-02-01 06:24:36 +00003311load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003312{
3313 PyObject *unicode;
3314 long l;
3315 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003316
Tim Peters0bc93f52003-02-02 18:29:33 +00003317 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003320
Tim Peters0bc93f52003-02-02 18:29:33 +00003321 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003323
Tim Peterscba30e22003-02-01 06:24:36 +00003324 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003325 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327 PDATA_PUSH(self->stack, unicode, -1);
3328 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003329}
3330
3331
3332static int
Tim Peterscba30e22003-02-01 06:24:36 +00003333load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334{
3335 PyObject *tup;
3336 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 if ((i = marker(self)) < 0) return -1;
3339 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3340 PDATA_PUSH(self->stack, tup, -1);
3341 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342}
3343
3344static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003345load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003347 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Tim Peters1d63c9f2003-02-02 20:29:39 +00003349 if (tup == NULL)
3350 return -1;
3351
3352 while (--len >= 0) {
3353 PyObject *element;
3354
3355 PDATA_POP(self->stack, element);
3356 if (element == NULL)
3357 return -1;
3358 PyTuple_SET_ITEM(tup, len, element);
3359 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 PDATA_PUSH(self->stack, tup, -1);
3361 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362}
3363
3364static int
Tim Peterscba30e22003-02-01 06:24:36 +00003365load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366{
3367 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 if (!( list=PyList_New(0))) return -1;
3370 PDATA_PUSH(self->stack, list, -1);
3371 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372}
3373
3374static int
Tim Peterscba30e22003-02-01 06:24:36 +00003375load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376{
3377 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 if (!( dict=PyDict_New())) return -1;
3380 PDATA_PUSH(self->stack, dict, -1);
3381 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382}
3383
3384
3385static int
Tim Peterscba30e22003-02-01 06:24:36 +00003386load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387{
3388 PyObject *list = 0;
3389 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 if ((i = marker(self)) < 0) return -1;
3392 if (!( list=Pdata_popList(self->stack, i))) return -1;
3393 PDATA_PUSH(self->stack, list, -1);
3394 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395}
3396
3397static int
Tim Peterscba30e22003-02-01 06:24:36 +00003398load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399{
3400 PyObject *dict, *key, *value;
3401 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 if ((i = marker(self)) < 0) return -1;
3404 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 for (k = i+1; k < j; k += 2) {
3409 key =self->stack->data[k-1];
3410 value=self->stack->data[k ];
3411 if (PyDict_SetItem(dict, key, value) < 0) {
3412 Py_DECREF(dict);
3413 return -1;
3414 }
3415 }
3416 Pdata_clear(self->stack, i);
3417 PDATA_PUSH(self->stack, dict, -1);
3418 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419}
3420
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003421static PyObject *
3422Instance_New(PyObject *cls, PyObject *args)
3423{
3424 PyObject *r = 0;
3425
3426 if ((r=PyObject_CallObject(cls, args))) return r;
3427
3428 {
3429 PyObject *tp, *v, *tb, *tmp_value;
3430
3431 PyErr_Fetch(&tp, &v, &tb);
3432 tmp_value = v;
3433 /* NULL occurs when there was a KeyboardInterrupt */
3434 if (tmp_value == NULL)
3435 tmp_value = Py_None;
3436 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3437 Py_XDECREF(v);
3438 v=r;
3439 }
3440 PyErr_Restore(tp,v,tb);
3441 }
3442 return NULL;
3443}
3444
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445
3446static int
Tim Peterscba30e22003-02-01 06:24:36 +00003447load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448{
3449 PyObject *class, *tup, *obj=0;
3450 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 if ((i = marker(self)) < 0) return -1;
3453 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3454 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003455 if (class) {
3456 obj = Instance_New(class, tup);
3457 Py_DECREF(class);
3458 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003459 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461 if (! obj) return -1;
3462 PDATA_PUSH(self->stack, obj, -1);
3463 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464}
3465
3466
3467static int
Tim Peterscba30e22003-02-01 06:24:36 +00003468load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469{
3470 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3471 int i, len;
3472 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003474 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003475
Tim Peters0bc93f52003-02-02 18:29:33 +00003476 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 if (len < 2) return bad_readline();
3478 module_name = PyString_FromStringAndSize(s, len - 1);
3479 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003480
Tim Peters0bc93f52003-02-02 18:29:33 +00003481 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003482 if (len < 2) return bad_readline();
3483 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003484 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 self->find_class);
3486 Py_DECREF(class_name);
3487 }
3488 }
3489 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003494 obj = Instance_New(class, tup);
3495 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 }
3497 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501 PDATA_PUSH(self->stack, obj, -1);
3502 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003503}
3504
Tim Peterseab7db32003-02-13 18:24:14 +00003505static int
3506load_newobj(Unpicklerobject *self)
3507{
3508 PyObject *args = NULL;
3509 PyObject *clsraw = NULL;
3510 PyTypeObject *cls; /* clsraw cast to its true type */
3511 PyObject *obj;
3512
3513 /* Stack is ... cls argtuple, and we want to call
3514 * cls.__new__(cls, *argtuple).
3515 */
3516 PDATA_POP(self->stack, args);
3517 if (args == NULL) goto Fail;
3518 if (! PyTuple_Check(args)) {
3519 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3520 "tuple.");
3521 goto Fail;
3522 }
3523
3524 PDATA_POP(self->stack, clsraw);
3525 cls = (PyTypeObject *)clsraw;
3526 if (cls == NULL) goto Fail;
3527 if (! PyType_Check(cls)) {
3528 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3529 "isn't a type object");
3530 goto Fail;
3531 }
3532 if (cls->tp_new == NULL) {
3533 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3534 "has NULL tp_new");
3535 goto Fail;
3536 }
3537
3538 /* Call __new__. */
3539 obj = cls->tp_new(cls, args, NULL);
3540 if (obj == NULL) goto Fail;
3541
3542 Py_DECREF(args);
3543 Py_DECREF(clsraw);
3544 PDATA_PUSH(self->stack, obj, -1);
3545 return 0;
3546
3547 Fail:
3548 Py_XDECREF(args);
3549 Py_XDECREF(clsraw);
3550 return -1;
3551}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552
3553static int
Tim Peterscba30e22003-02-01 06:24:36 +00003554load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555{
3556 PyObject *class = 0, *module_name = 0, *class_name = 0;
3557 int len;
3558 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003559
Tim Peters0bc93f52003-02-02 18:29:33 +00003560 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 if (len < 2) return bad_readline();
3562 module_name = PyString_FromStringAndSize(s, len - 1);
3563 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Tim Peters0bc93f52003-02-02 18:29:33 +00003565 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003566 if (len < 2) {
3567 Py_DECREF(module_name);
3568 return bad_readline();
3569 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00003570 if ((class_name = PyUnicode_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003571 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572 self->find_class);
3573 Py_DECREF(class_name);
3574 }
3575 }
3576 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 if (! class) return -1;
3579 PDATA_PUSH(self->stack, class, -1);
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583
3584static int
Tim Peterscba30e22003-02-01 06:24:36 +00003585load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586{
3587 PyObject *pid = 0;
3588 int len;
3589 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003592 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003593 if (len < 2) return bad_readline();
3594
3595 pid = PyString_FromStringAndSize(s, len - 1);
3596 if (!pid) return -1;
3597
3598 if (PyList_Check(self->pers_func)) {
3599 if (PyList_Append(self->pers_func, pid) < 0) {
3600 Py_DECREF(pid);
3601 return -1;
3602 }
3603 }
3604 else {
3605 ARG_TUP(self, pid);
3606 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003607 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 NULL);
3609 FREE_ARG_TUP(self);
3610 }
3611 }
3612
3613 if (! pid) return -1;
3614
3615 PDATA_PUSH(self->stack, pid, -1);
3616 return 0;
3617 }
3618 else {
3619 PyErr_SetString(UnpicklingError,
3620 "A load persistent id instruction was encountered,\n"
3621 "but no persistent_load function was specified.");
3622 return -1;
3623 }
3624}
3625
3626static int
Tim Peterscba30e22003-02-01 06:24:36 +00003627load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628{
3629 PyObject *pid = 0;
3630
3631 if (self->pers_func) {
3632 PDATA_POP(self->stack, pid);
3633 if (! pid) return -1;
3634
3635 if (PyList_Check(self->pers_func)) {
3636 if (PyList_Append(self->pers_func, pid) < 0) {
3637 Py_DECREF(pid);
3638 return -1;
3639 }
3640 }
3641 else {
3642 ARG_TUP(self, pid);
3643 if (self->arg) {
3644 pid = PyObject_Call(self->pers_func, self->arg,
3645 NULL);
3646 FREE_ARG_TUP(self);
3647 }
3648 if (! pid) return -1;
3649 }
3650
3651 PDATA_PUSH(self->stack, pid, -1);
3652 return 0;
3653 }
3654 else {
3655 PyErr_SetString(UnpicklingError,
3656 "A load persistent id instruction was encountered,\n"
3657 "but no persistent_load function was specified.");
3658 return -1;
3659 }
3660}
3661
3662
3663static int
Tim Peterscba30e22003-02-01 06:24:36 +00003664load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665{
3666 int len;
3667
3668 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3669
3670 /* Note that we split the (pickle.py) stack into two stacks,
3671 an object stack and a mark stack. We have to be clever and
3672 pop the right one. We do this by looking at the top of the
3673 mark stack.
3674 */
3675
3676 if ((self->num_marks > 0) &&
3677 (self->marks[self->num_marks - 1] == len))
3678 self->num_marks--;
3679 else {
3680 len--;
3681 Py_DECREF(self->stack->data[len]);
3682 self->stack->length=len;
3683 }
3684
3685 return 0;
3686}
3687
3688
3689static int
Tim Peterscba30e22003-02-01 06:24:36 +00003690load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691{
3692 int i;
3693
3694 if ((i = marker(self)) < 0)
3695 return -1;
3696
3697 Pdata_clear(self->stack, i);
3698
3699 return 0;
3700}
3701
3702
3703static int
Tim Peterscba30e22003-02-01 06:24:36 +00003704load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705{
3706 PyObject *last;
3707 int len;
3708
3709 if ((len = self->stack->length) <= 0) return stackUnderflow();
3710 last=self->stack->data[len-1];
3711 Py_INCREF(last);
3712 PDATA_PUSH(self->stack, last, -1);
3713 return 0;
3714}
3715
3716
3717static int
Tim Peterscba30e22003-02-01 06:24:36 +00003718load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719{
3720 PyObject *py_str = 0, *value = 0;
3721 int len;
3722 char *s;
3723 int rc;
3724
Tim Peters0bc93f52003-02-02 18:29:33 +00003725 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003726 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730 value = PyDict_GetItem(self->memo, py_str);
3731 if (! value) {
3732 PyErr_SetObject(BadPickleGet, py_str);
3733 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003734 }
3735 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 PDATA_APPEND(self->stack, value, -1);
3737 rc = 0;
3738 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 Py_DECREF(py_str);
3741 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003742}
3743
3744
3745static int
Tim Peterscba30e22003-02-01 06:24:36 +00003746load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747{
3748 PyObject *py_key = 0, *value = 0;
3749 unsigned char key;
3750 char *s;
3751 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752
Tim Peters0bc93f52003-02-02 18:29:33 +00003753 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003755 key = (unsigned char)s[0];
3756 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 value = PyDict_GetItem(self->memo, py_key);
3759 if (! value) {
3760 PyErr_SetObject(BadPickleGet, py_key);
3761 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003762 }
3763 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 PDATA_APPEND(self->stack, value, -1);
3765 rc = 0;
3766 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 Py_DECREF(py_key);
3769 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003770}
3771
3772
3773static int
Tim Peterscba30e22003-02-01 06:24:36 +00003774load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775{
3776 PyObject *py_key = 0, *value = 0;
3777 unsigned char c;
3778 char *s;
3779 long key;
3780 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Tim Peters0bc93f52003-02-02 18:29:33 +00003782 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784 c = (unsigned char)s[0];
3785 key = (long)c;
3786 c = (unsigned char)s[1];
3787 key |= (long)c << 8;
3788 c = (unsigned char)s[2];
3789 key |= (long)c << 16;
3790 c = (unsigned char)s[3];
3791 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3794
3795 value = PyDict_GetItem(self->memo, py_key);
3796 if (! value) {
3797 PyErr_SetObject(BadPickleGet, py_key);
3798 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003799 }
3800 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 PDATA_APPEND(self->stack, value, -1);
3802 rc = 0;
3803 }
3804
3805 Py_DECREF(py_key);
3806 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807}
3808
Tim Peters2d629652003-02-04 05:06:17 +00003809/* Push an object from the extension registry (EXT[124]). nbytes is
3810 * the number of bytes following the opcode, holding the index (code) value.
3811 */
3812static int
3813load_extension(Unpicklerobject *self, int nbytes)
3814{
3815 char *codebytes; /* the nbytes bytes after the opcode */
3816 long code; /* calc_binint returns long */
3817 PyObject *py_code; /* code as a Python int */
3818 PyObject *obj; /* the object to push */
3819 PyObject *pair; /* (module_name, class_name) */
3820 PyObject *module_name, *class_name;
3821
3822 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3823 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3824 code = calc_binint(codebytes, nbytes);
3825 if (code <= 0) { /* note that 0 is forbidden */
3826 /* Corrupt or hostile pickle. */
3827 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3828 return -1;
3829 }
3830
3831 /* Look for the code in the cache. */
3832 py_code = PyInt_FromLong(code);
3833 if (py_code == NULL) return -1;
3834 obj = PyDict_GetItem(extension_cache, py_code);
3835 if (obj != NULL) {
3836 /* Bingo. */
3837 Py_DECREF(py_code);
3838 PDATA_APPEND(self->stack, obj, -1);
3839 return 0;
3840 }
3841
3842 /* Look up the (module_name, class_name) pair. */
3843 pair = PyDict_GetItem(inverted_registry, py_code);
3844 if (pair == NULL) {
3845 Py_DECREF(py_code);
3846 PyErr_Format(PyExc_ValueError, "unregistered extension "
3847 "code %ld", code);
3848 return -1;
3849 }
3850 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003851 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003852 */
3853 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3854 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3855 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3856 Py_DECREF(py_code);
3857 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3858 "isn't a 2-tuple of strings", code);
3859 return -1;
3860 }
3861 /* Load the object. */
3862 obj = find_class(module_name, class_name, self->find_class);
3863 if (obj == NULL) {
3864 Py_DECREF(py_code);
3865 return -1;
3866 }
3867 /* Cache code -> obj. */
3868 code = PyDict_SetItem(extension_cache, py_code, obj);
3869 Py_DECREF(py_code);
3870 if (code < 0) {
3871 Py_DECREF(obj);
3872 return -1;
3873 }
3874 PDATA_PUSH(self->stack, obj, -1);
3875 return 0;
3876}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003877
3878static int
Tim Peterscba30e22003-02-01 06:24:36 +00003879load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880{
3881 PyObject *py_str = 0, *value = 0;
3882 int len, l;
3883 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
Tim Peters0bc93f52003-02-02 18:29:33 +00003885 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 if (l < 2) return bad_readline();
3887 if (!( len=self->stack->length )) return stackUnderflow();
3888 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3889 value=self->stack->data[len-1];
3890 l=PyDict_SetItem(self->memo, py_str, value);
3891 Py_DECREF(py_str);
3892 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893}
3894
3895
3896static int
Tim Peterscba30e22003-02-01 06:24:36 +00003897load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898{
3899 PyObject *py_key = 0, *value = 0;
3900 unsigned char key;
3901 char *s;
3902 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Tim Peters0bc93f52003-02-02 18:29:33 +00003904 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3910 value=self->stack->data[len-1];
3911 len=PyDict_SetItem(self->memo, py_key, value);
3912 Py_DECREF(py_key);
3913 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914}
3915
3916
3917static int
Tim Peterscba30e22003-02-01 06:24:36 +00003918load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919{
3920 PyObject *py_key = 0, *value = 0;
3921 long key;
3922 unsigned char c;
3923 char *s;
3924 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Tim Peters0bc93f52003-02-02 18:29:33 +00003926 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 c = (unsigned char)s[0];
3930 key = (long)c;
3931 c = (unsigned char)s[1];
3932 key |= (long)c << 8;
3933 c = (unsigned char)s[2];
3934 key |= (long)c << 16;
3935 c = (unsigned char)s[3];
3936 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 if (!( py_key = PyInt_FromLong(key))) return -1;
3939 value=self->stack->data[len-1];
3940 len=PyDict_SetItem(self->memo, py_key, value);
3941 Py_DECREF(py_key);
3942 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943}
3944
3945
3946static int
Tim Peterscba30e22003-02-01 06:24:36 +00003947do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948{
3949 PyObject *value = 0, *list = 0, *append_method = 0;
3950 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 len=self->stack->length;
3953 if (!( len >= x && x > 0 )) return stackUnderflow();
3954 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003955 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 if (PyList_Check(list)) {
3960 PyObject *slice;
3961 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003964 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 list_len = PyList_GET_SIZE(list);
3966 i=PyList_SetSlice(list, list_len, list_len, slice);
3967 Py_DECREF(slice);
3968 return i;
3969 }
3970 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Tim Peterscba30e22003-02-01 06:24:36 +00003972 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 return -1;
3974
3975 for (i = x; i < len; i++) {
3976 PyObject *junk;
3977
3978 value=self->stack->data[i];
3979 junk=0;
3980 ARG_TUP(self, value);
3981 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003982 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 NULL);
3984 FREE_ARG_TUP(self);
3985 }
3986 if (! junk) {
3987 Pdata_clear(self->stack, i+1);
3988 self->stack->length=x;
3989 Py_DECREF(append_method);
3990 return -1;
3991 }
3992 Py_DECREF(junk);
3993 }
3994 self->stack->length=x;
3995 Py_DECREF(append_method);
3996 }
3997
3998 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003999}
4000
4001
4002static int
Tim Peterscba30e22003-02-01 06:24:36 +00004003load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004{
4005 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004006}
4007
4008
4009static int
Tim Peterscba30e22003-02-01 06:24:36 +00004010load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011{
4012 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013}
4014
4015
4016static int
Tim Peterscba30e22003-02-01 06:24:36 +00004017do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018{
4019 PyObject *value = 0, *key = 0, *dict = 0;
4020 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022 if (!( (len=self->stack->length) >= x
4023 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004025 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 for (i = x+1; i < len; i += 2) {
4028 key =self->stack->data[i-1];
4029 value=self->stack->data[i ];
4030 if (PyObject_SetItem(dict, key, value) < 0) {
4031 r=-1;
4032 break;
4033 }
4034 }
4035
4036 Pdata_clear(self->stack, x);
4037
4038 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039}
4040
4041
Tim Peters84e87f32001-03-17 04:50:51 +00004042static int
Tim Peterscba30e22003-02-01 06:24:36 +00004043load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044{
4045 return do_setitems(self, self->stack->length - 2);
4046}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048static int
Tim Peterscba30e22003-02-01 06:24:36 +00004049load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004050{
4051 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004052}
4053
Tim Peters84e87f32001-03-17 04:50:51 +00004054
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055static int
Tim Peterscba30e22003-02-01 06:24:36 +00004056load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057{
Tim Peters080c88b2003-02-15 03:01:11 +00004058 PyObject *state, *inst, *slotstate;
4059 PyObject *__setstate__;
4060 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004061 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004062 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063
Tim Peters080c88b2003-02-15 03:01:11 +00004064 /* Stack is ... instance, state. We want to leave instance at
4065 * the stack top, possibly mutated via instance.__setstate__(state).
4066 */
4067 if (self->stack->length < 2)
4068 return stackUnderflow();
4069 PDATA_POP(self->stack, state);
4070 if (state == NULL)
4071 return -1;
4072 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073
Tim Peters080c88b2003-02-15 03:01:11 +00004074 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4075 if (__setstate__ != NULL) {
4076 PyObject *junk = NULL;
4077
4078 /* The explicit __setstate__ is responsible for everything. */
4079 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 if (self->arg) {
4081 junk = PyObject_Call(__setstate__, self->arg, NULL);
4082 FREE_ARG_TUP(self);
4083 }
4084 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004085 if (junk == NULL)
4086 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 Py_DECREF(junk);
4088 return 0;
4089 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004090 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4091 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004093
4094 /* A default __setstate__. First see whether state embeds a
4095 * slot state dict too (a proto 2 addition).
4096 */
4097 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4098 PyObject *temp = state;
4099 state = PyTuple_GET_ITEM(temp, 0);
4100 slotstate = PyTuple_GET_ITEM(temp, 1);
4101 Py_INCREF(state);
4102 Py_INCREF(slotstate);
4103 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 }
Tim Peters080c88b2003-02-15 03:01:11 +00004105 else
4106 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107
Tim Peters080c88b2003-02-15 03:01:11 +00004108 /* Set inst.__dict__ from the state dict (if any). */
4109 if (state != Py_None) {
4110 PyObject *dict;
4111 if (! PyDict_Check(state)) {
4112 PyErr_SetString(UnpicklingError, "state is not a "
4113 "dictionary");
4114 goto finally;
4115 }
4116 dict = PyObject_GetAttr(inst, __dict___str);
4117 if (dict == NULL)
4118 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119
Tim Peters080c88b2003-02-15 03:01:11 +00004120 i = 0;
4121 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4122 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4123 goto finally;
4124 }
4125 Py_DECREF(dict);
4126 }
4127
4128 /* Also set instance attributes from the slotstate dict (if any). */
4129 if (slotstate != NULL) {
4130 if (! PyDict_Check(slotstate)) {
4131 PyErr_SetString(UnpicklingError, "slot state is not "
4132 "a dictionary");
4133 goto finally;
4134 }
4135 i = 0;
4136 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4137 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4138 goto finally;
4139 }
4140 }
4141 res = 0;
4142
4143 finally:
4144 Py_DECREF(state);
4145 Py_XDECREF(slotstate);
4146 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147}
4148
4149
4150static int
Tim Peterscba30e22003-02-01 06:24:36 +00004151load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152{
4153 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 /* Note that we split the (pickle.py) stack into two stacks, an
4156 object stack and a mark stack. Here we push a mark onto the
4157 mark stack.
4158 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004161 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 s=self->marks_size+20;
4163 if (s <= self->num_marks) s=self->num_marks + 1;
4164 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004165 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004167 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004169 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 PyErr_NoMemory();
4171 return -1;
4172 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004173 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 self->marks_size = s;
4175 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180}
4181
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182static int
Tim Peterscba30e22003-02-01 06:24:36 +00004183load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184{
4185 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 PDATA_POP(self->stack, arg_tup);
4188 if (! arg_tup) return -1;
4189 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004190 if (callable) {
4191 ob = Instance_New(callable, arg_tup);
4192 Py_DECREF(callable);
4193 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 PDATA_PUSH(self->stack, ob, -1);
4199 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004200}
Tim Peters84e87f32001-03-17 04:50:51 +00004201
Tim Peters4190fb82003-02-02 16:09:05 +00004202/* Just raises an error if we don't know the protocol specified. PROTO
4203 * is the first opcode for protocols >= 2.
4204 */
4205static int
4206load_proto(Unpicklerobject *self)
4207{
4208 int i;
4209 char *protobyte;
4210
4211 i = self->read_func(self, &protobyte, 1);
4212 if (i < 0)
4213 return -1;
4214
4215 i = calc_binint(protobyte, 1);
4216 /* No point checking for < 0, since calc_binint returns an unsigned
4217 * int when chewing on 1 byte.
4218 */
4219 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004220 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004221 return 0;
4222
4223 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4224 return -1;
4225}
4226
Guido van Rossum60456fd1997-04-09 17:36:32 +00004227static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004228load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229{
4230 PyObject *err = 0, *val = 0;
4231 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 self->num_marks = 0;
4234 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004237 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 switch (s[0]) {
4241 case NONE:
4242 if (load_none(self) < 0)
4243 break;
4244 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246 case BININT:
4247 if (load_binint(self) < 0)
4248 break;
4249 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 case BININT1:
4252 if (load_binint1(self) < 0)
4253 break;
4254 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004256 case BININT2:
4257 if (load_binint2(self) < 0)
4258 break;
4259 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 case INT:
4262 if (load_int(self) < 0)
4263 break;
4264 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266 case LONG:
4267 if (load_long(self) < 0)
4268 break;
4269 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004270
Tim Petersee1a53c2003-02-02 02:57:53 +00004271 case LONG1:
4272 if (load_counted_long(self, 1) < 0)
4273 break;
4274 continue;
4275
4276 case LONG4:
4277 if (load_counted_long(self, 4) < 0)
4278 break;
4279 continue;
4280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 case FLOAT:
4282 if (load_float(self) < 0)
4283 break;
4284 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 case BINFLOAT:
4287 if (load_binfloat(self) < 0)
4288 break;
4289 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 case BINSTRING:
4292 if (load_binstring(self) < 0)
4293 break;
4294 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 case SHORT_BINSTRING:
4297 if (load_short_binstring(self) < 0)
4298 break;
4299 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004301 case STRING:
4302 if (load_string(self) < 0)
4303 break;
4304 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 case UNICODE:
4307 if (load_unicode(self) < 0)
4308 break;
4309 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case BINUNICODE:
4312 if (load_binunicode(self) < 0)
4313 break;
4314 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004317 if (load_counted_tuple(self, 0) < 0)
4318 break;
4319 continue;
4320
4321 case TUPLE1:
4322 if (load_counted_tuple(self, 1) < 0)
4323 break;
4324 continue;
4325
4326 case TUPLE2:
4327 if (load_counted_tuple(self, 2) < 0)
4328 break;
4329 continue;
4330
4331 case TUPLE3:
4332 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 break;
4334 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case TUPLE:
4337 if (load_tuple(self) < 0)
4338 break;
4339 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 case EMPTY_LIST:
4342 if (load_empty_list(self) < 0)
4343 break;
4344 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 case LIST:
4347 if (load_list(self) < 0)
4348 break;
4349 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 case EMPTY_DICT:
4352 if (load_empty_dict(self) < 0)
4353 break;
4354 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356 case DICT:
4357 if (load_dict(self) < 0)
4358 break;
4359 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 case OBJ:
4362 if (load_obj(self) < 0)
4363 break;
4364 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 case INST:
4367 if (load_inst(self) < 0)
4368 break;
4369 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004370
Tim Peterseab7db32003-02-13 18:24:14 +00004371 case NEWOBJ:
4372 if (load_newobj(self) < 0)
4373 break;
4374 continue;
4375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 case GLOBAL:
4377 if (load_global(self) < 0)
4378 break;
4379 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 case APPEND:
4382 if (load_append(self) < 0)
4383 break;
4384 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 case APPENDS:
4387 if (load_appends(self) < 0)
4388 break;
4389 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 case BUILD:
4392 if (load_build(self) < 0)
4393 break;
4394 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 case DUP:
4397 if (load_dup(self) < 0)
4398 break;
4399 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 case BINGET:
4402 if (load_binget(self) < 0)
4403 break;
4404 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 case LONG_BINGET:
4407 if (load_long_binget(self) < 0)
4408 break;
4409 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 case GET:
4412 if (load_get(self) < 0)
4413 break;
4414 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004415
Tim Peters2d629652003-02-04 05:06:17 +00004416 case EXT1:
4417 if (load_extension(self, 1) < 0)
4418 break;
4419 continue;
4420
4421 case EXT2:
4422 if (load_extension(self, 2) < 0)
4423 break;
4424 continue;
4425
4426 case EXT4:
4427 if (load_extension(self, 4) < 0)
4428 break;
4429 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430 case MARK:
4431 if (load_mark(self) < 0)
4432 break;
4433 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 case BINPUT:
4436 if (load_binput(self) < 0)
4437 break;
4438 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 case LONG_BINPUT:
4441 if (load_long_binput(self) < 0)
4442 break;
4443 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case PUT:
4446 if (load_put(self) < 0)
4447 break;
4448 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 case POP:
4451 if (load_pop(self) < 0)
4452 break;
4453 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 case POP_MARK:
4456 if (load_pop_mark(self) < 0)
4457 break;
4458 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 case SETITEM:
4461 if (load_setitem(self) < 0)
4462 break;
4463 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 case SETITEMS:
4466 if (load_setitems(self) < 0)
4467 break;
4468 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 case STOP:
4471 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 case PERSID:
4474 if (load_persid(self) < 0)
4475 break;
4476 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 case BINPERSID:
4479 if (load_binpersid(self) < 0)
4480 break;
4481 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483 case REDUCE:
4484 if (load_reduce(self) < 0)
4485 break;
4486 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004487
Tim Peters4190fb82003-02-02 16:09:05 +00004488 case PROTO:
4489 if (load_proto(self) < 0)
4490 break;
4491 continue;
4492
Tim Peters3c67d792003-02-02 17:59:11 +00004493 case NEWTRUE:
4494 if (load_bool(self, Py_True) < 0)
4495 break;
4496 continue;
4497
4498 case NEWFALSE:
4499 if (load_bool(self, Py_False) < 0)
4500 break;
4501 continue;
4502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 case '\0':
4504 /* end of file */
4505 PyErr_SetNone(PyExc_EOFError);
4506 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004509 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 "invalid load key, '%s'.",
4511 "c", s[0]);
4512 return NULL;
4513 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 break;
4516 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 if ((err = PyErr_Occurred())) {
4519 if (err == PyExc_EOFError) {
4520 PyErr_SetNone(PyExc_EOFError);
4521 }
4522 return NULL;
4523 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 PDATA_POP(self->stack, val);
4526 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527}
Tim Peters84e87f32001-03-17 04:50:51 +00004528
Guido van Rossum60456fd1997-04-09 17:36:32 +00004529
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004530/* No-load functions to support noload, which is used to
4531 find persistent references. */
4532
4533static int
Tim Peterscba30e22003-02-01 06:24:36 +00004534noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535{
4536 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 if ((i = marker(self)) < 0) return -1;
4539 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004540}
4541
4542
4543static int
Tim Peterscba30e22003-02-01 06:24:36 +00004544noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545{
4546 int i;
4547 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 if ((i = marker(self)) < 0) return -1;
4550 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004551 if (self->readline_func(self, &s) < 0) return -1;
4552 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004553 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004555}
4556
4557static int
Tim Peterseab7db32003-02-13 18:24:14 +00004558noload_newobj(Unpicklerobject *self)
4559{
4560 PyObject *obj;
4561
4562 PDATA_POP(self->stack, obj); /* pop argtuple */
4563 if (obj == NULL) return -1;
4564 Py_DECREF(obj);
4565
4566 PDATA_POP(self->stack, obj); /* pop cls */
4567 if (obj == NULL) return -1;
4568 Py_DECREF(obj);
4569
4570 PDATA_APPEND(self->stack, Py_None, -1);
4571 return 0;
4572}
4573
4574static int
Tim Peterscba30e22003-02-01 06:24:36 +00004575noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576{
4577 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004578
Tim Peters0bc93f52003-02-02 18:29:33 +00004579 if (self->readline_func(self, &s) < 0) return -1;
4580 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 PDATA_APPEND(self->stack, Py_None,-1);
4582 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004583}
4584
4585static int
Tim Peterscba30e22003-02-01 06:24:36 +00004586noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 if (self->stack->length < 2) return stackUnderflow();
4590 Pdata_clear(self->stack, self->stack->length-2);
4591 PDATA_APPEND(self->stack, Py_None,-1);
4592 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004593}
4594
4595static int
4596noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004597
Guido van Rossum053b8df1998-11-25 16:18:00 +00004598 if (self->stack->length < 1) return stackUnderflow();
4599 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004600 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004601}
4602
Tim Peters2d629652003-02-04 05:06:17 +00004603static int
4604noload_extension(Unpicklerobject *self, int nbytes)
4605{
4606 char *codebytes;
4607
4608 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4609 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4610 PDATA_APPEND(self->stack, Py_None, -1);
4611 return 0;
4612}
4613
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004614
4615static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004616noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617{
4618 PyObject *err = 0, *val = 0;
4619 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621 self->num_marks = 0;
4622 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004625 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 switch (s[0]) {
4629 case NONE:
4630 if (load_none(self) < 0)
4631 break;
4632 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 case BININT:
4635 if (load_binint(self) < 0)
4636 break;
4637 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 case BININT1:
4640 if (load_binint1(self) < 0)
4641 break;
4642 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 case BININT2:
4645 if (load_binint2(self) < 0)
4646 break;
4647 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004649 case INT:
4650 if (load_int(self) < 0)
4651 break;
4652 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654 case LONG:
4655 if (load_long(self) < 0)
4656 break;
4657 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004658
Tim Peters4190fb82003-02-02 16:09:05 +00004659 case LONG1:
4660 if (load_counted_long(self, 1) < 0)
4661 break;
4662 continue;
4663
4664 case LONG4:
4665 if (load_counted_long(self, 4) < 0)
4666 break;
4667 continue;
4668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 case FLOAT:
4670 if (load_float(self) < 0)
4671 break;
4672 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 case BINFLOAT:
4675 if (load_binfloat(self) < 0)
4676 break;
4677 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 case BINSTRING:
4680 if (load_binstring(self) < 0)
4681 break;
4682 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 case SHORT_BINSTRING:
4685 if (load_short_binstring(self) < 0)
4686 break;
4687 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 case STRING:
4690 if (load_string(self) < 0)
4691 break;
4692 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 case UNICODE:
4695 if (load_unicode(self) < 0)
4696 break;
4697 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004699 case BINUNICODE:
4700 if (load_binunicode(self) < 0)
4701 break;
4702 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004705 if (load_counted_tuple(self, 0) < 0)
4706 break;
4707 continue;
4708
4709 case TUPLE1:
4710 if (load_counted_tuple(self, 1) < 0)
4711 break;
4712 continue;
4713
4714 case TUPLE2:
4715 if (load_counted_tuple(self, 2) < 0)
4716 break;
4717 continue;
4718
4719 case TUPLE3:
4720 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 break;
4722 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 case TUPLE:
4725 if (load_tuple(self) < 0)
4726 break;
4727 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 case EMPTY_LIST:
4730 if (load_empty_list(self) < 0)
4731 break;
4732 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 case LIST:
4735 if (load_list(self) < 0)
4736 break;
4737 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004739 case EMPTY_DICT:
4740 if (load_empty_dict(self) < 0)
4741 break;
4742 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 case DICT:
4745 if (load_dict(self) < 0)
4746 break;
4747 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 case OBJ:
4750 if (noload_obj(self) < 0)
4751 break;
4752 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 case INST:
4755 if (noload_inst(self) < 0)
4756 break;
4757 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758
Tim Peterseab7db32003-02-13 18:24:14 +00004759 case NEWOBJ:
4760 if (noload_newobj(self) < 0)
4761 break;
4762 continue;
4763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 case GLOBAL:
4765 if (noload_global(self) < 0)
4766 break;
4767 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case APPEND:
4770 if (load_append(self) < 0)
4771 break;
4772 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 case APPENDS:
4775 if (load_appends(self) < 0)
4776 break;
4777 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 case BUILD:
4780 if (noload_build(self) < 0)
4781 break;
4782 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case DUP:
4785 if (load_dup(self) < 0)
4786 break;
4787 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case BINGET:
4790 if (load_binget(self) < 0)
4791 break;
4792 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 case LONG_BINGET:
4795 if (load_long_binget(self) < 0)
4796 break;
4797 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 case GET:
4800 if (load_get(self) < 0)
4801 break;
4802 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004803
Tim Peters2d629652003-02-04 05:06:17 +00004804 case EXT1:
4805 if (noload_extension(self, 1) < 0)
4806 break;
4807 continue;
4808
4809 case EXT2:
4810 if (noload_extension(self, 2) < 0)
4811 break;
4812 continue;
4813
4814 case EXT4:
4815 if (noload_extension(self, 4) < 0)
4816 break;
4817 continue;
4818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case MARK:
4820 if (load_mark(self) < 0)
4821 break;
4822 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case BINPUT:
4825 if (load_binput(self) < 0)
4826 break;
4827 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case LONG_BINPUT:
4830 if (load_long_binput(self) < 0)
4831 break;
4832 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case PUT:
4835 if (load_put(self) < 0)
4836 break;
4837 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 case POP:
4840 if (load_pop(self) < 0)
4841 break;
4842 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 case POP_MARK:
4845 if (load_pop_mark(self) < 0)
4846 break;
4847 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case SETITEM:
4850 if (load_setitem(self) < 0)
4851 break;
4852 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 case SETITEMS:
4855 if (load_setitems(self) < 0)
4856 break;
4857 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 case STOP:
4860 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case PERSID:
4863 if (load_persid(self) < 0)
4864 break;
4865 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case BINPERSID:
4868 if (load_binpersid(self) < 0)
4869 break;
4870 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 case REDUCE:
4873 if (noload_reduce(self) < 0)
4874 break;
4875 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004876
Tim Peters4190fb82003-02-02 16:09:05 +00004877 case PROTO:
4878 if (load_proto(self) < 0)
4879 break;
4880 continue;
4881
Tim Peters3c67d792003-02-02 17:59:11 +00004882 case NEWTRUE:
4883 if (load_bool(self, Py_True) < 0)
4884 break;
4885 continue;
4886
4887 case NEWFALSE:
4888 if (load_bool(self, Py_False) < 0)
4889 break;
4890 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004891 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004892 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893 "invalid load key, '%s'.",
4894 "c", s[0]);
4895 return NULL;
4896 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 break;
4899 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 if ((err = PyErr_Occurred())) {
4902 if (err == PyExc_EOFError) {
4903 PyErr_SetNone(PyExc_EOFError);
4904 }
4905 return NULL;
4906 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 PDATA_POP(self->stack, val);
4909 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004910}
Tim Peters84e87f32001-03-17 04:50:51 +00004911
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004912
Guido van Rossum60456fd1997-04-09 17:36:32 +00004913static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004914Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004917}
4918
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004920Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004923}
4924
Guido van Rossum60456fd1997-04-09 17:36:32 +00004925
4926static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004927 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004928 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004929 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004930 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004931 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004932 "noload() -- not load a pickle, but go through most of the motions\n"
4933 "\n"
4934 "This function can be used to read past a pickle without instantiating\n"
4935 "any objects or importing any modules. It can also be used to find all\n"
4936 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004937 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004938 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004939 {NULL, NULL} /* sentinel */
4940};
4941
4942
4943static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004944newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004945{
4946 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004947
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004948 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 self->file = NULL;
4952 self->arg = NULL;
4953 self->stack = (Pdata*)Pdata_New();
4954 self->pers_func = NULL;
4955 self->last_string = NULL;
4956 self->marks = NULL;
4957 self->num_marks = 0;
4958 self->marks_size = 0;
4959 self->buf_size = 0;
4960 self->read = NULL;
4961 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004963
Tim Peterscba30e22003-02-01 06:24:36 +00004964 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004966
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004967 if (!self->stack)
4968 goto err;
4969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 Py_INCREF(f);
4971 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 /* Set read, readline based on type of f */
Guido van Rossumda5b8f22007-06-12 23:30:11 +00004974 if (PycStringIO_InputCheck(f)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975 self->fp = NULL;
4976 self->read_func = read_cStringIO;
4977 self->readline_func = readline_cStringIO;
4978 }
4979 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 self->fp = NULL;
4982 self->read_func = read_other;
4983 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4986 (self->read = PyObject_GetAttr(f, read_str)))) {
4987 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004988 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004989 "argument must have 'read' and "
4990 "'readline' attributes" );
4991 goto err;
4992 }
4993 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004994 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 err:
4999 Py_DECREF((PyObject *)self);
5000 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005001}
5002
5003
5004static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005005get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005008}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005009
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005010
Guido van Rossum60456fd1997-04-09 17:36:32 +00005011static void
Tim Peterscba30e22003-02-01 06:24:36 +00005012Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005014 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005015 Py_XDECREF(self->readline);
5016 Py_XDECREF(self->read);
5017 Py_XDECREF(self->file);
5018 Py_XDECREF(self->memo);
5019 Py_XDECREF(self->stack);
5020 Py_XDECREF(self->pers_func);
5021 Py_XDECREF(self->arg);
5022 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005023 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 if (self->marks) {
5026 free(self->marks);
5027 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 if (self->buf_size) {
5030 free(self->buf);
5031 }
Tim Peters84e87f32001-03-17 04:50:51 +00005032
Tim Peters3cfe7542003-05-21 21:29:48 +00005033 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005034}
5035
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005036static int
5037Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5038{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005039 Py_VISIT(self->readline);
5040 Py_VISIT(self->read);
5041 Py_VISIT(self->file);
5042 Py_VISIT(self->memo);
5043 Py_VISIT(self->stack);
5044 Py_VISIT(self->pers_func);
5045 Py_VISIT(self->arg);
5046 Py_VISIT(self->last_string);
5047 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005048 return 0;
5049}
5050
5051static int
5052Unpickler_clear(Unpicklerobject *self)
5053{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005054 Py_CLEAR(self->readline);
5055 Py_CLEAR(self->read);
5056 Py_CLEAR(self->file);
5057 Py_CLEAR(self->memo);
5058 Py_CLEAR(self->stack);
5059 Py_CLEAR(self->pers_func);
5060 Py_CLEAR(self->arg);
5061 Py_CLEAR(self->last_string);
5062 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005063 return 0;
5064}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005065
5066static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005067Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068{
5069 if (!strcmp(name, "persistent_load")) {
5070 if (!self->pers_func) {
5071 PyErr_SetString(PyExc_AttributeError, name);
5072 return NULL;
5073 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005075 Py_INCREF(self->pers_func);
5076 return self->pers_func;
5077 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 if (!strcmp(name, "find_global")) {
5080 if (!self->find_class) {
5081 PyErr_SetString(PyExc_AttributeError, name);
5082 return NULL;
5083 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 Py_INCREF(self->find_class);
5086 return self->find_class;
5087 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 if (!strcmp(name, "memo")) {
5090 if (!self->memo) {
5091 PyErr_SetString(PyExc_AttributeError, name);
5092 return NULL;
5093 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 Py_INCREF(self->memo);
5096 return self->memo;
5097 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005099 if (!strcmp(name, "UnpicklingError")) {
5100 Py_INCREF(UnpicklingError);
5101 return UnpicklingError;
5102 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005104 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005105}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005106
Guido van Rossum60456fd1997-04-09 17:36:32 +00005107
5108static int
Tim Peterscba30e22003-02-01 06:24:36 +00005109Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005110{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112 if (!strcmp(name, "persistent_load")) {
5113 Py_XDECREF(self->pers_func);
5114 self->pers_func = value;
5115 Py_XINCREF(value);
5116 return 0;
5117 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 if (!strcmp(name, "find_global")) {
5120 Py_XDECREF(self->find_class);
5121 self->find_class = value;
5122 Py_XINCREF(value);
5123 return 0;
5124 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126 if (! value) {
5127 PyErr_SetString(PyExc_TypeError,
5128 "attribute deletion is not supported");
5129 return -1;
5130 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 if (strcmp(name, "memo") == 0) {
5133 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005134 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 "memo must be a dictionary");
5136 return -1;
5137 }
5138 Py_XDECREF(self->memo);
5139 self->memo = value;
5140 Py_INCREF(value);
5141 return 0;
5142 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 PyErr_SetString(PyExc_AttributeError, name);
5145 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005146}
5147
Tim Peters5bd2a792003-02-01 16:45:06 +00005148/* ---------------------------------------------------------------------------
5149 * Module-level functions.
5150 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005151
Martin v. Löwis544f1192004-07-27 05:22:33 +00005152/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005153static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005154cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005156 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 PyObject *ob, *file, *res = NULL;
5158 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005159 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005160
Martin v. Löwis544f1192004-07-27 05:22:33 +00005161 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5162 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005164
Tim Peters5bd2a792003-02-01 16:45:06 +00005165 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005166 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 if (dump(pickler, ob) < 0)
5169 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005171 Py_INCREF(Py_None);
5172 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 finally:
5175 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005177 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005178}
5179
5180
Martin v. Löwis544f1192004-07-27 05:22:33 +00005181/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005182static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005183cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005185 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005186 PyObject *ob, *file = 0, *res = NULL;
5187 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005188 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005189
Martin v. Löwis544f1192004-07-27 05:22:33 +00005190 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5191 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005192 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005193
Tim Peterscba30e22003-02-01 06:24:36 +00005194 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005196
Tim Peters5bd2a792003-02-01 16:45:06 +00005197 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005198 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 if (dump(pickler, ob) < 0)
5201 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005203 res = PycStringIO->cgetvalue(file);
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005204 if (res == NULL)
5205 goto finally;
5206 if (!PyBytes_Check(res)) {
5207 PyObject *tmp = res;
5208 res = PyBytes_FromObject(res);
5209 Py_DECREF(tmp);
5210 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005212 finally:
5213 Py_XDECREF(pickler);
5214 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005216 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005217}
5218
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005219
Tim Peters5bd2a792003-02-01 16:45:06 +00005220/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005221static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005222cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005223{
5224 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005225 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005226
Tim Peterscba30e22003-02-01 06:24:36 +00005227 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232 finally:
5233 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005236}
5237
5238
Tim Peters5bd2a792003-02-01 16:45:06 +00005239/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005240static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005241cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005242{
5243 PyObject *ob, *file = 0, *res = NULL;
5244 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005245
Guido van Rossum617dbc42007-05-07 23:57:08 +00005246 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5247 PyErr_Clear();
5248 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5249 goto finally;
5250 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005251
Tim Peterscba30e22003-02-01 06:24:36 +00005252 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005254
Tim Peterscba30e22003-02-01 06:24:36 +00005255 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005260 finally:
5261 Py_XDECREF(file);
5262 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005264 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005265}
5266
5267
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005268PyDoc_STRVAR(Unpicklertype__doc__,
5269"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005270
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005271static PyTypeObject Unpicklertype = {
5272 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005273 0, /*ob_size*/
5274 "cPickle.Unpickler", /*tp_name*/
5275 sizeof(Unpicklerobject), /*tp_basicsize*/
5276 0,
5277 (destructor)Unpickler_dealloc, /* tp_dealloc */
5278 0, /* tp_print */
5279 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5280 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5281 0, /* tp_compare */
5282 0, /* tp_repr */
5283 0, /* tp_as_number */
5284 0, /* tp_as_sequence */
5285 0, /* tp_as_mapping */
5286 0, /* tp_hash */
5287 0, /* tp_call */
5288 0, /* tp_str */
5289 0, /* tp_getattro */
5290 0, /* tp_setattro */
5291 0, /* tp_as_buffer */
5292 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5293 Unpicklertype__doc__, /* tp_doc */
5294 (traverseproc)Unpickler_traverse, /* tp_traverse */
5295 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005296};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005297
Guido van Rossum60456fd1997-04-09 17:36:32 +00005298static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005299 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5300 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005301 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005302 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005303 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005304 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005305
Martin v. Löwis544f1192004-07-27 05:22:33 +00005306 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5307 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005308 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005309 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005310 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005311 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005312
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005313 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005314 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005315
Neal Norwitzb0493252002-03-31 14:44:22 +00005316 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005317 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005318
Martin v. Löwis544f1192004-07-27 05:22:33 +00005319 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5320 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005321 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005322 "This takes a file-like object for writing a pickle data stream.\n"
5323 "The optional proto argument tells the pickler to use the given\n"
5324 "protocol; supported protocols are 0, 1, 2. The default\n"
5325 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5326 "only protocol that can be written to a file opened in text\n"
5327 "mode and read back successfully. When using a protocol higher\n"
5328 "than 0, make sure the file is opened in binary mode, both when\n"
5329 "pickling and unpickling.)\n"
5330 "\n"
5331 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5332 "more efficient than protocol 1.\n"
5333 "\n"
5334 "Specifying a negative protocol version selects the highest\n"
5335 "protocol version supported. The higher the protocol used, the\n"
5336 "more recent the version of Python needed to read the pickle\n"
5337 "produced.\n"
5338 "\n"
5339 "The file parameter must have a write() method that accepts a single\n"
5340 "string argument. It can thus be an open file object, a StringIO\n"
5341 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005342 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005343
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005344 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005345 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5346
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005347 { NULL, NULL }
5348};
5349
Guido van Rossum60456fd1997-04-09 17:36:32 +00005350static int
Tim Peterscba30e22003-02-01 06:24:36 +00005351init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005352{
5353 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005354
Martin v. Löwis5b222132007-06-10 09:51:05 +00005355#define INIT_STR(S) if (!( S ## _str=PyUnicode_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005356
Tim Peters3cfe7542003-05-21 21:29:48 +00005357 if (PyType_Ready(&Unpicklertype) < 0)
5358 return -1;
5359 if (PyType_Ready(&Picklertype) < 0)
5360 return -1;
5361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005362 INIT_STR(__class__);
5363 INIT_STR(__getinitargs__);
5364 INIT_STR(__dict__);
5365 INIT_STR(__getstate__);
5366 INIT_STR(__setstate__);
5367 INIT_STR(__name__);
5368 INIT_STR(__main__);
5369 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005370 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005371 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005372 INIT_STR(append);
5373 INIT_STR(read);
5374 INIT_STR(readline);
5375 INIT_STR(copy_reg);
5376 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005377
Tim Peterscba30e22003-02-01 06:24:36 +00005378 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005380
Tim Peters1f1b2d22003-02-01 02:16:37 +00005381 /* This is special because we want to use a different
5382 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005383 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005384 if (!dispatch_table) return -1;
5385
5386 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005387 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005388 if (!extension_registry) return -1;
5389
5390 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005391 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005392 if (!inverted_registry) return -1;
5393
5394 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005395 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005396 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005399
Tim Peters731098b2003-02-04 20:56:09 +00005400 if (!(empty_tuple = PyTuple_New(0)))
5401 return -1;
5402
5403 two_tuple = PyTuple_New(2);
5404 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005406 /* We use this temp container with no regard to refcounts, or to
5407 * keeping containees alive. Exempt from GC, because we don't
5408 * want anything looking at two_tuple() by magic.
5409 */
5410 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005412 /* Ugh */
5413 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5414 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5415 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 if (!( t=PyDict_New())) return -1;
5418 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005419 "def __str__(self):\n"
5420 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5421 Py_file_input,
5422 module_dict, t) )) return -1;
5423 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005425 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005426 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005427 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005429 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005430
Tim Peterscba30e22003-02-01 06:24:36 +00005431 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005433 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005434 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005436 if (!( t=PyDict_New())) return -1;
5437 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005438 "def __str__(self):\n"
5439 " a=self.args\n"
5440 " a=a and type(a[0]) or '(what)'\n"
5441 " return 'Cannot pickle %s objects' % a\n"
5442 , Py_file_input,
5443 module_dict, t) )) return -1;
5444 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005447 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005448 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005453 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005455
Martin v. Löwis658009a2002-09-16 17:26:24 +00005456 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5457 UnpicklingError, NULL)))
5458 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005460 if (PyDict_SetItemString(module_dict, "PickleError",
5461 PickleError) < 0)
5462 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005464 if (PyDict_SetItemString(module_dict, "PicklingError",
5465 PicklingError) < 0)
5466 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5469 UnpicklingError) < 0)
5470 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5473 UnpickleableError) < 0)
5474 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5477 BadPickleGet) < 0)
5478 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005483}
5484
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005485#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5486#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005487#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005488PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005489initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005490{
5491 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005492 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005493 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 PyObject *format_version;
5495 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 Unpicklertype.ob_type = &PyType_Type;
5499 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005501 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005502 * so we're forced to use a temporary dictionary. :(
5503 */
5504 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005505 if (!di) return;
5506 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005508 /* Create the module and add the functions */
5509 m = Py_InitModule4("cPickle", cPickle_methods,
5510 cPickle_module_documentation,
5511 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005512 if (m == NULL)
5513 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005515 /* Add some symbolic constants to the module */
5516 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005517 v = PyString_FromString(rev);
5518 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005519 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005521 /* Copy data from di. Waaa. */
5522 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5523 if (PyObject_SetItem(d, k, v) < 0) {
5524 Py_DECREF(di);
5525 return;
5526 }
5527 }
5528 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005529
Tim Peters8587b3c2003-02-13 15:44:41 +00005530 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5531 if (i < 0)
5532 return;
5533
Tim Peters5b7da392003-02-04 00:21:07 +00005534 /* These are purely informational; no code uses them. */
5535 /* File format version we write. */
5536 format_version = PyString_FromString("2.0");
5537 /* Format versions we can read. */
5538 compatible_formats = Py_BuildValue("[sssss]",
5539 "1.0", /* Original protocol 0 */
5540 "1.1", /* Protocol 0 + INST */
5541 "1.2", /* Original protocol 1 */
5542 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005543 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005544 PyDict_SetItemString(d, "format_version", format_version);
5545 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5546 Py_XDECREF(format_version);
5547 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005548}