blob: d6b4581b86fc0c529f898fc2d4e019bda7902d50 [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;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_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;
402 v=PyString_Format(retval, args);
403 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_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (s == NULL) {
426 return 0;
427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000428
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
432 }
433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) {
449 return 0;
450 }
Tim Peterscba30e22003-02-01 06:24:36 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463 if (n > INT_MAX) return -1;
464 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000465}
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000472
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000478 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000480 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
487 }
Tim Peterscba30e22003-02-01 06:24:36 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000491 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 return -1;
493 }
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
498 }
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
507 }
508 if (junk) Py_DECREF(junk);
509 else return -1;
510 }
511 else
512 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 0;
515 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516}
517
518
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519static Py_ssize_t
520read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521{
522 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000524 if (self->buf_size == 0) {
525 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000528 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size = size;
534 }
535 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000536 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537 if (!self->buf) {
538 PyErr_NoMemory();
539 return -1;
540 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 self->buf_size = n;
542 }
Tim Peters84e87f32001-03-17 04:50:51 +0000543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000544 Py_BEGIN_ALLOW_THREADS
545 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
546 Py_END_ALLOW_THREADS
547 if (nbytesread != (size_t)n) {
548 if (feof(self->fp)) {
549 PyErr_SetNone(PyExc_EOFError);
550 return -1;
551 }
Tim Peterscba30e22003-02-01 06:24:36 +0000552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553 PyErr_SetFromErrno(PyExc_IOError);
554 return -1;
555 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560}
561
562
Martin v. Löwis18e16552006-02-15 17:27:45 +0000563static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000564readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565{
566 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000569 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 PyErr_NoMemory();
571 return -1;
572 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573 self->buf_size = 40;
574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 i = 0;
577 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000578 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000580 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 (self->buf[i] = getc(self->fp)) == '\n') {
582 self->buf[i + 1] = '\0';
583 *s = self->buf;
584 return i + 1;
585 }
586 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000587 bigger = self->buf_size << 1;
588 if (bigger <= 0) { /* overflow */
589 PyErr_NoMemory();
590 return -1;
591 }
592 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 if (!self->buf) {
594 PyErr_NoMemory();
595 return -1;
596 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000597 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 }
Tim Peters84e87f32001-03-17 04:50:51 +0000599}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000600
601
Martin v. Löwis18e16552006-02-15 17:27:45 +0000602static Py_ssize_t
603read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604{
605 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
608 PyErr_SetNone(PyExc_EOFError);
609 return -1;
610 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615}
616
617
Martin v. Löwis18e16552006-02-15 17:27:45 +0000618static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000619readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
625 return -1;
626 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631}
632
633
Martin v. Löwis18e16552006-02-15 17:27:45 +0000634static Py_ssize_t
635read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636{
637 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis18e16552006-02-15 17:27:45 +0000639 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000641 ARG_TUP(self, bytes);
642 if (self->arg) {
643 str = PyObject_Call(self->read, self->arg, NULL);
644 FREE_ARG_TUP(self);
645 }
646 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 Py_XDECREF(self->last_string);
649 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (! (*s = PyString_AsString(str))) return -1;
652 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653}
654
655
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000657readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658{
659 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
663 return -1;
664 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666 if ((str_size = PyString_Size(str)) < 0)
667 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 Py_XDECREF(self->last_string);
670 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 if (! (*s = PyString_AsString(str)))
673 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000676}
677
Tim Petersee1a53c2003-02-02 02:57:53 +0000678/* Copy the first n bytes from s into newly malloc'ed memory, plus a
679 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
680 * The caller is responsible for free()'ing the return value.
681 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000683pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684{
Tim Petersee1a53c2003-02-02 02:57:53 +0000685 char *r = (char *)malloc(n+1);
686 if (r == NULL)
687 return (char*)PyErr_NoMemory();
688 memcpy(r, s, n);
689 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691}
692
693
694static int
Tim Peterscba30e22003-02-01 06:24:36 +0000695get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696{
697 PyObject *value, *mv;
698 long c_value;
699 char s[30];
700 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 if (!( mv = PyDict_GetItem(self->memo, id))) {
703 PyErr_SetObject(PyExc_KeyError, id);
704 return -1;
705 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000706
Tim Peterscba30e22003-02-01 06:24:36 +0000707 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (!( PyInt_Check(value))) {
711 PyErr_SetString(PicklingError, "no int where int expected in memo");
712 return -1;
713 }
714 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!self->bin) {
717 s[0] = GET;
718 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
719 len = strlen(s);
720 }
721 else if (Pdata_Check(self->file)) {
722 if (write_other(self, NULL, 0) < 0) return -1;
723 PDATA_APPEND(self->file, mv, -1);
724 return 0;
725 }
726 else {
727 if (c_value < 256) {
728 s[0] = BINGET;
729 s[1] = (int)(c_value & 0xff);
730 len = 2;
731 }
732 else {
733 s[0] = LONG_BINGET;
734 s[1] = (int)(c_value & 0xff);
735 s[2] = (int)((c_value >> 8) & 0xff);
736 s[3] = (int)((c_value >> 16) & 0xff);
737 s[4] = (int)((c_value >> 24) & 0xff);
738 len = 5;
739 }
740 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000741
Tim Peters0bc93f52003-02-02 18:29:33 +0000742 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000743 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000744
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000745 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000746}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000747
Guido van Rossum60456fd1997-04-09 17:36:32 +0000748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749static int
Tim Peterscba30e22003-02-01 06:24:36 +0000750put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751{
Tim Peterscba30e22003-02-01 06:24:36 +0000752 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755 return put2(self, ob);
756}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000757
Guido van Rossum053b8df1998-11-25 16:18:00 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759static int
Tim Peterscba30e22003-02-01 06:24:36 +0000760put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761{
762 char c_str[30];
763 int p;
764 size_t len;
765 int res = -1;
766 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000768 if (self->fast)
769 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 if ((p = PyDict_Size(self->memo)) < 0)
772 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000775 /* XXX Why?
776 * XXX And does "positive" really mean non-negative?
777 * XXX pickle.py starts with PUT index 0, not 1. This makes for
778 * XXX gratuitous differences between the pickling modules.
779 */
Tim Peterscba30e22003-02-01 06:24:36 +0000780 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000781
Tim Peterscba30e22003-02-01 06:24:36 +0000782 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000783 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000784
Tim Peterscba30e22003-02-01 06:24:36 +0000785 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000787
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 PyTuple_SET_ITEM(t, 0, memo_len);
792 Py_INCREF(memo_len);
793 PyTuple_SET_ITEM(t, 1, ob);
794 Py_INCREF(ob);
795
796 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
797 goto finally;
798
799 if (!self->bin) {
800 c_str[0] = PUT;
801 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
802 len = strlen(c_str);
803 }
804 else if (Pdata_Check(self->file)) {
805 if (write_other(self, NULL, 0) < 0) return -1;
806 PDATA_APPEND(self->file, memo_len, -1);
807 res=0; /* Job well done ;) */
808 goto finally;
809 }
810 else {
811 if (p >= 256) {
812 c_str[0] = LONG_BINPUT;
813 c_str[1] = (int)(p & 0xff);
814 c_str[2] = (int)((p >> 8) & 0xff);
815 c_str[3] = (int)((p >> 16) & 0xff);
816 c_str[4] = (int)((p >> 24) & 0xff);
817 len = 5;
818 }
819 else {
820 c_str[0] = BINPUT;
821 c_str[1] = p;
822 len = 2;
823 }
824 }
825
Tim Peters0bc93f52003-02-02 18:29:33 +0000826 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 goto finally;
828
829 res = 0;
830
831 finally:
832 Py_XDECREF(py_ob_id);
833 Py_XDECREF(memo_len);
834 Py_XDECREF(t);
835
836 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000837}
838
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000839static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000840whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000842 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 PyObject *module = 0, *modules_dict = 0,
844 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000847 if (module)
848 return module;
849 if (PyErr_ExceptionMatches(PyExc_AttributeError))
850 PyErr_Clear();
851 else
852 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000853
Tim Peterscba30e22003-02-01 06:24:36 +0000854 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 i = 0;
858 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 global_name_attr = PyObject_GetAttr(module, global_name);
863 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000864 if (PyErr_ExceptionMatches(PyExc_AttributeError))
865 PyErr_Clear();
866 else
867 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 continue;
869 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 if (global_name_attr != global) {
872 Py_DECREF(global_name_attr);
873 continue;
874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 break;
879 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 /* The following implements the rule in pickle.py added in 1.5
882 that used __main__ if no module is found. I don't actually
883 like this rule. jlf
884 */
885 if (!j) {
886 j=1;
887 name=__main___str;
888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 Py_INCREF(name);
891 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000892}
893
894
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000896fast_save_enter(Picklerobject *self, PyObject *obj)
897{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 /* if fast_container < 0, we're doing an error exit. */
899 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
900 PyObject *key = NULL;
901 if (self->fast_memo == NULL) {
902 self->fast_memo = PyDict_New();
903 if (self->fast_memo == NULL) {
904 self->fast_container = -1;
905 return 0;
906 }
907 }
908 key = PyLong_FromVoidPtr(obj);
909 if (key == NULL)
910 return 0;
911 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000912 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000914 "fast mode: can't pickle cyclic objects "
915 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 obj->ob_type->tp_name, obj);
917 self->fast_container = -1;
918 return 0;
919 }
920 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000921 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 self->fast_container = -1;
923 return 0;
924 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000925 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000928}
929
Tim Peterscba30e22003-02-01 06:24:36 +0000930int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931fast_save_leave(Picklerobject *self, PyObject *obj)
932{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
934 PyObject *key = PyLong_FromVoidPtr(obj);
935 if (key == NULL)
936 return 0;
937 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000938 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000939 return 0;
940 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000942 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000943 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000944}
945
946static int
Tim Peterscba30e22003-02-01 06:24:36 +0000947save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948{
949 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000950 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000954}
955
Guido van Rossum77f6a652002-04-03 22:41:51 +0000956static int
Tim Peterscba30e22003-02-01 06:24:36 +0000957save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000958{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000959 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000960 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961 long l = PyInt_AS_LONG((PyIntObject *)args);
962
Tim Peters3c67d792003-02-02 17:59:11 +0000963 if (self->proto >= 2) {
964 char opcode = l ? NEWTRUE : NEWFALSE;
965 if (self->write_func(self, &opcode, 1) < 0)
966 return -1;
967 }
968 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000969 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000970 return 0;
971}
Tim Peters84e87f32001-03-17 04:50:51 +0000972
Guido van Rossum60456fd1997-04-09 17:36:32 +0000973static int
Tim Peterscba30e22003-02-01 06:24:36 +0000974save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000975{
976 char c_str[32];
977 long l = PyInt_AS_LONG((PyIntObject *)args);
978 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000981#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 || l > 0x7fffffffL
983 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 ) {
986 /* Text-mode pickle, or long too big to fit in the 4-byte
987 * signed BININT format: store as a string.
988 */
989 c_str[0] = INT;
990 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000991 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992 return -1;
993 }
994 else {
995 /* Binary pickle and l fits in a signed 4-byte int. */
996 c_str[1] = (int)( l & 0xff);
997 c_str[2] = (int)((l >> 8) & 0xff);
998 c_str[3] = (int)((l >> 16) & 0xff);
999 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1002 if (c_str[2] == 0) {
1003 c_str[0] = BININT1;
1004 len = 2;
1005 }
1006 else {
1007 c_str[0] = BININT2;
1008 len = 3;
1009 }
1010 }
1011 else {
1012 c_str[0] = BININT;
1013 len = 5;
1014 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001015
Tim Peters0bc93f52003-02-02 18:29:33 +00001016 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 return -1;
1018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021}
1022
1023
1024static int
Tim Peterscba30e22003-02-01 06:24:36 +00001025save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026{
Tim Petersee1a53c2003-02-02 02:57:53 +00001027 int size;
1028 int res = -1;
1029 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Tim Petersee1a53c2003-02-02 02:57:53 +00001033 if (self->proto >= 2) {
1034 /* Linear-time pickling. */
1035 size_t nbits;
1036 size_t nbytes;
1037 unsigned char *pdata;
1038 char c_str[5];
1039 int i;
1040 int sign = _PyLong_Sign(args);
1041
1042 if (sign == 0) {
1043 /* It's 0 -- an empty bytestring. */
1044 c_str[0] = LONG1;
1045 c_str[1] = 0;
1046 i = self->write_func(self, c_str, 2);
1047 if (i < 0) goto finally;
1048 res = 0;
1049 goto finally;
1050 }
1051 nbits = _PyLong_NumBits(args);
1052 if (nbits == (size_t)-1 && PyErr_Occurred())
1053 goto finally;
1054 /* How many bytes do we need? There are nbits >> 3 full
1055 * bytes of data, and nbits & 7 leftover bits. If there
1056 * are any leftover bits, then we clearly need another
1057 * byte. Wnat's not so obvious is that we *probably*
1058 * need another byte even if there aren't any leftovers:
1059 * the most-significant bit of the most-significant byte
1060 * acts like a sign bit, and it's usually got a sense
1061 * opposite of the one we need. The exception is longs
1062 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1063 * its own 256's-complement, so has the right sign bit
1064 * even without the extra byte. That's a pain to check
1065 * for in advance, though, so we always grab an extra
1066 * byte at the start, and cut it back later if possible.
1067 */
1068 nbytes = (nbits >> 3) + 1;
1069 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1070 PyErr_SetString(PyExc_OverflowError, "long too large "
1071 "to pickle");
1072 goto finally;
1073 }
1074 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1075 if (repr == NULL) goto finally;
1076 pdata = (unsigned char *)PyString_AS_STRING(repr);
1077 i = _PyLong_AsByteArray((PyLongObject *)args,
1078 pdata, nbytes,
1079 1 /* little endian */, 1 /* signed */);
1080 if (i < 0) goto finally;
1081 /* If the long is negative, this may be a byte more than
1082 * needed. This is so iff the MSB is all redundant sign
1083 * bits.
1084 */
1085 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1086 (pdata[nbytes - 2] & 0x80) != 0)
1087 --nbytes;
1088
1089 if (nbytes < 256) {
1090 c_str[0] = LONG1;
1091 c_str[1] = (char)nbytes;
1092 size = 2;
1093 }
1094 else {
1095 c_str[0] = LONG4;
1096 size = (int)nbytes;
1097 for (i = 1; i < 5; i++) {
1098 c_str[i] = (char)(size & 0xff);
1099 size >>= 8;
1100 }
1101 size = 5;
1102 }
1103 i = self->write_func(self, c_str, size);
1104 if (i < 0) goto finally;
1105 i = self->write_func(self, (char *)pdata, (int)nbytes);
1106 if (i < 0) goto finally;
1107 res = 0;
1108 goto finally;
1109 }
1110
1111 /* proto < 2: write the repr and newline. This is quadratic-time
1112 * (in the number of digits), in both directions.
1113 */
Tim Peterscba30e22003-02-01 06:24:36 +00001114 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 if ((size = PyString_Size(repr)) < 0)
1118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Tim Peters0bc93f52003-02-02 18:29:33 +00001120 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Tim Peters0bc93f52003-02-02 18:29:33 +00001123 if (self->write_func(self,
1124 PyString_AS_STRING((PyStringObject *)repr),
1125 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Tim Peters0bc93f52003-02-02 18:29:33 +00001128 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001131 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 finally:
1134 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136}
1137
1138
1139static int
Tim Peterscba30e22003-02-01 06:24:36 +00001140save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141{
1142 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001146 str[0] = BINFLOAT;
1147 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001149 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 return -1;
1151 }
1152 else {
1153 char c_str[250];
1154 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001155 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1156 /* Extend the formatted string with a newline character */
1157 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
Tim Peters0bc93f52003-02-02 18:29:33 +00001159 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 return -1;
1161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164}
1165
1166
1167static int
Tim Peterscba30e22003-02-01 06:24:36 +00001168save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169{
1170 int size, len;
1171 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((size = PyString_Size(args)) < 0)
1174 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if (!self->bin) {
1177 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Tim Peterscba30e22003-02-01 06:24:36 +00001181 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if ((len = PyString_Size(repr)) < 0)
1185 goto err;
1186 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Tim Peters0bc93f52003-02-02 18:29:33 +00001188 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Tim Peters0bc93f52003-02-02 18:29:33 +00001191 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Tim Peters0bc93f52003-02-02 18:29:33 +00001194 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 Py_XDECREF(repr);
1198 }
1199 else {
1200 int i;
1201 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 if ((size = PyString_Size(args)) < 0)
1204 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if (size < 256) {
1207 c_str[0] = SHORT_BINSTRING;
1208 c_str[1] = size;
1209 len = 2;
1210 }
1211 else {
1212 c_str[0] = BINSTRING;
1213 for (i = 1; i < 5; i++)
1214 c_str[i] = (int)(size >> ((i - 1) * 8));
1215 len = 5;
1216 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217
Tim Peters0bc93f52003-02-02 18:29:33 +00001218 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (size > 128 && Pdata_Check(self->file)) {
1222 if (write_other(self, NULL, 0) < 0) return -1;
1223 PDATA_APPEND(self->file, args, -1);
1224 }
1225 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001226 if (self->write_func(self,
1227 PyString_AS_STRING(
1228 (PyStringObject *)args),
1229 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 return -1;
1231 }
1232 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 if (doput)
1235 if (put(self, args) < 0)
1236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001240 err:
1241 Py_XDECREF(repr);
1242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001243}
1244
1245
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001246#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001247/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1248 backslash and newline characters to \uXXXX escapes. */
1249static PyObject *
1250modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1251{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001252 PyObject *repr;
1253 char *p;
1254 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001256 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 repr = PyString_FromStringAndSize(NULL, 6 * size);
1259 if (repr == NULL)
1260 return NULL;
1261 if (size == 0)
1262 return repr;
1263
1264 p = q = PyString_AS_STRING(repr);
1265 while (size-- > 0) {
1266 Py_UNICODE ch = *s++;
1267 /* Map 16-bit characters to '\uxxxx' */
1268 if (ch >= 256 || ch == '\\' || ch == '\n') {
1269 *p++ = '\\';
1270 *p++ = 'u';
1271 *p++ = hexdigit[(ch >> 12) & 0xf];
1272 *p++ = hexdigit[(ch >> 8) & 0xf];
1273 *p++ = hexdigit[(ch >> 4) & 0xf];
1274 *p++ = hexdigit[ch & 15];
1275 }
1276 /* Copy everything else as-is */
1277 else
1278 *p++ = (char) ch;
1279 }
1280 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001281 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001282 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001283}
1284
1285
Guido van Rossum60456fd1997-04-09 17:36:32 +00001286static int
Tim Peterscba30e22003-02-01 06:24:36 +00001287save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288{
1289 int size, len;
1290 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 if (!PyUnicode_Check(args))
1293 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 if (!self->bin) {
1296 char *repr_str;
1297 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001299 repr = modified_EncodeRawUnicodeEscape(
1300 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001301 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 if ((len = PyString_Size(repr)) < 0)
1305 goto err;
1306 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001307
Tim Peters0bc93f52003-02-02 18:29:33 +00001308 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Tim Peters0bc93f52003-02-02 18:29:33 +00001311 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Tim Peters0bc93f52003-02-02 18:29:33 +00001314 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001315 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 Py_XDECREF(repr);
1318 }
1319 else {
1320 int i;
1321 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Tim Peterscba30e22003-02-01 06:24:36 +00001323 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 if ((size = PyString_Size(repr)) < 0)
1327 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 c_str[0] = BINUNICODE;
1330 for (i = 1; i < 5; i++)
1331 c_str[i] = (int)(size >> ((i - 1) * 8));
1332 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Tim Peters0bc93f52003-02-02 18:29:33 +00001334 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 if (size > 128 && Pdata_Check(self->file)) {
1338 if (write_other(self, NULL, 0) < 0)
1339 goto err;
1340 PDATA_APPEND(self->file, repr, -1);
1341 }
1342 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001343 if (self->write_func(self, PyString_AS_STRING(repr),
1344 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 goto err;
1346 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001348 Py_DECREF(repr);
1349 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 if (doput)
1352 if (put(self, args) < 0)
1353 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 err:
1358 Py_XDECREF(repr);
1359 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001361#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001362
Tim Peters1d63c9f2003-02-02 20:29:39 +00001363/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1364static int
Tim Peters67920142003-02-05 03:46:17 +00001365store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001366{
1367 int i;
1368 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Tim Peters1d63c9f2003-02-02 20:29:39 +00001370 assert(PyTuple_Size(t) == len);
1371
1372 for (i = 0; i < len; i++) {
1373 PyObject *element = PyTuple_GET_ITEM(t, i);
1374
1375 if (element == NULL)
1376 goto finally;
1377 if (save(self, element, 0) < 0)
1378 goto finally;
1379 }
1380 res = 0;
1381
1382 finally:
1383 return res;
1384}
1385
1386/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1387 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001388 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001389 * (a tuple can be reached from itself), and that requires some subtle
1390 * magic so that it works in all cases. IOW, this is a long routine.
1391 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001392static int
Tim Peterscba30e22003-02-01 06:24:36 +00001393save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001395 PyObject *py_tuple_id = NULL;
1396 int len, i;
1397 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001400 static char pop = POP;
1401 static char pop_mark = POP_MARK;
1402 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 if ((len = PyTuple_Size(args)) < 0)
1405 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001406
Tim Peters1d63c9f2003-02-02 20:29:39 +00001407 if (len == 0) {
1408 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001409
Tim Peters1d63c9f2003-02-02 20:29:39 +00001410 if (self->proto) {
1411 c_str[0] = EMPTY_TUPLE;
1412 len = 1;
1413 }
1414 else {
1415 c_str[0] = MARK;
1416 c_str[1] = TUPLE;
1417 len = 2;
1418 }
1419 if (self->write_func(self, c_str, len) >= 0)
1420 res = 0;
1421 /* Don't memoize an empty tuple. */
1422 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001424
Tim Peters1d63c9f2003-02-02 20:29:39 +00001425 /* A non-empty tuple. */
1426
1427 /* id(tuple) isn't in the memo now. If it shows up there after
1428 * saving the tuple elements, the tuple must be recursive, in
1429 * which case we'll pop everything we put on the stack, and fetch
1430 * its value from the memo.
1431 */
1432 py_tuple_id = PyLong_FromVoidPtr(args);
1433 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001434 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001435
Tim Peters1d63c9f2003-02-02 20:29:39 +00001436 if (len <= 3 && self->proto >= 2) {
1437 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001438 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001439 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001440 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001441 /* pop the len elements */
1442 for (i = 0; i < len; ++i)
1443 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001445 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 if (get(self, py_tuple_id) < 0)
1447 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 res = 0;
1449 goto finally;
1450 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 /* Not recursive. */
1452 if (self->write_func(self, len2opcode + len, 1) < 0)
1453 goto finally;
1454 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001456
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1458 * Generate MARK elt1 elt2 ... TUPLE
1459 */
1460 if (self->write_func(self, &MARKv, 1) < 0)
1461 goto finally;
1462
Tim Peters67920142003-02-05 03:46:17 +00001463 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001464 goto finally;
1465
1466 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1467 /* pop the stack stuff we pushed */
1468 if (self->bin) {
1469 if (self->write_func(self, &pop_mark, 1) < 0)
1470 goto finally;
1471 }
1472 else {
1473 /* Note that we pop one more than len, to remove
1474 * the MARK too.
1475 */
1476 for (i = 0; i <= len; i++)
1477 if (self->write_func(self, &pop, 1) < 0)
1478 goto finally;
1479 }
1480 /* fetch from memo */
1481 if (get(self, py_tuple_id) >= 0)
1482 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 goto finally;
1484 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001485
Tim Peters1d63c9f2003-02-02 20:29:39 +00001486 /* Not recursive. */
1487 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001489
Tim Peters1d63c9f2003-02-02 20:29:39 +00001490 memoize:
1491 if (put(self, args) >= 0)
1492 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 finally:
1495 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497}
1498
Tim Peters1092d642003-02-11 21:06:20 +00001499/* iter is an iterator giving items, and we batch up chunks of
1500 * MARK item item ... item APPENDS
1501 * opcode sequences. Calling code should have arranged to first create an
1502 * empty list, or list-like object, for the APPENDS to operate on.
1503 * Returns 0 on success, <0 on error.
1504 */
1505static int
1506batch_list(Picklerobject *self, PyObject *iter)
1507{
1508 PyObject *obj;
1509 PyObject *slice[BATCHSIZE];
1510 int i, n;
1511
1512 static char append = APPEND;
1513 static char appends = APPENDS;
1514
1515 assert(iter != NULL);
1516
1517 if (self->proto == 0) {
1518 /* APPENDS isn't available; do one at a time. */
1519 for (;;) {
1520 obj = PyIter_Next(iter);
1521 if (obj == NULL) {
1522 if (PyErr_Occurred())
1523 return -1;
1524 break;
1525 }
1526 i = save(self, obj, 0);
1527 Py_DECREF(obj);
1528 if (i < 0)
1529 return -1;
1530 if (self->write_func(self, &append, 1) < 0)
1531 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001532 }
1533 return 0;
1534 }
1535
1536 /* proto > 0: write in batches of BATCHSIZE. */
1537 do {
1538 /* Get next group of (no more than) BATCHSIZE elements. */
1539 for (n = 0; n < BATCHSIZE; ++n) {
1540 obj = PyIter_Next(iter);
1541 if (obj == NULL) {
1542 if (PyErr_Occurred())
1543 goto BatchFailed;
1544 break;
1545 }
1546 slice[n] = obj;
1547 }
1548
1549 if (n > 1) {
1550 /* Pump out MARK, slice[0:n], APPENDS. */
1551 if (self->write_func(self, &MARKv, 1) < 0)
1552 goto BatchFailed;
1553 for (i = 0; i < n; ++i) {
1554 if (save(self, slice[i], 0) < 0)
1555 goto BatchFailed;
1556 }
1557 if (self->write_func(self, &appends, 1) < 0)
1558 goto BatchFailed;
1559 }
1560 else if (n == 1) {
1561 if (save(self, slice[0], 0) < 0)
1562 goto BatchFailed;
1563 if (self->write_func(self, &append, 1) < 0)
1564 goto BatchFailed;
1565 }
1566
1567 for (i = 0; i < n; ++i) {
1568 Py_DECREF(slice[i]);
1569 }
Tim Peters90975f12003-02-12 05:28:58 +00001570 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001571 return 0;
1572
1573BatchFailed:
1574 while (--n >= 0) {
1575 Py_DECREF(slice[n]);
1576 }
1577 return -1;
1578}
1579
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580static int
Tim Peterscba30e22003-02-01 06:24:36 +00001581save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582{
Tim Peters1092d642003-02-11 21:06:20 +00001583 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001584 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001585 int len;
1586 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 if (self->fast && !fast_save_enter(self, args))
1589 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001590
Tim Peters1092d642003-02-11 21:06:20 +00001591 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if (self->bin) {
1593 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001594 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 }
1596 else {
1597 s[0] = MARK;
1598 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001599 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001601
Tim Peters1092d642003-02-11 21:06:20 +00001602 if (self->write_func(self, s, len) < 0)
1603 goto finally;
1604
1605 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 if ((len = PyList_Size(args)) < 0)
1607 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001608
Tim Peters1092d642003-02-11 21:06:20 +00001609 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001611 if (put(self, args) >= 0)
1612 res = 0;
1613 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 }
Tim Peters90975f12003-02-12 05:28:58 +00001615 if (put2(self, args) < 0)
1616 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001617
Tim Peters1092d642003-02-11 21:06:20 +00001618 /* Materialize the list elements. */
1619 iter = PyObject_GetIter(args);
1620 if (iter == NULL)
1621 goto finally;
1622 res = batch_list(self, iter);
1623 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 finally:
1626 if (self->fast && !fast_save_leave(self, args))
1627 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630}
1631
1632
Tim Peters42f08ac2003-02-11 22:43:24 +00001633/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1634 * MARK key value ... key value SETITEMS
1635 * opcode sequences. Calling code should have arranged to first create an
1636 * empty dict, or dict-like object, for the SETITEMS to operate on.
1637 * Returns 0 on success, <0 on error.
1638 *
1639 * This is very much like batch_list(). The difference between saving
1640 * elements directly, and picking apart two-tuples, is so long-winded at
1641 * the C level, though, that attempts to combine these routines were too
1642 * ugly to bear.
1643 */
1644static int
1645batch_dict(Picklerobject *self, PyObject *iter)
1646{
1647 PyObject *p;
1648 PyObject *slice[BATCHSIZE];
1649 int i, n;
1650
1651 static char setitem = SETITEM;
1652 static char setitems = SETITEMS;
1653
1654 assert(iter != NULL);
1655
1656 if (self->proto == 0) {
1657 /* SETITEMS isn't available; do one at a time. */
1658 for (;;) {
1659 p = PyIter_Next(iter);
1660 if (p == NULL) {
1661 if (PyErr_Occurred())
1662 return -1;
1663 break;
1664 }
1665 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1666 PyErr_SetString(PyExc_TypeError, "dict items "
1667 "iterator must return 2-tuples");
1668 return -1;
1669 }
1670 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1671 if (i >= 0)
1672 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1673 Py_DECREF(p);
1674 if (i < 0)
1675 return -1;
1676 if (self->write_func(self, &setitem, 1) < 0)
1677 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001678 }
1679 return 0;
1680 }
1681
1682 /* proto > 0: write in batches of BATCHSIZE. */
1683 do {
1684 /* Get next group of (no more than) BATCHSIZE elements. */
1685 for (n = 0; n < BATCHSIZE; ++n) {
1686 p = PyIter_Next(iter);
1687 if (p == NULL) {
1688 if (PyErr_Occurred())
1689 goto BatchFailed;
1690 break;
1691 }
1692 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1693 PyErr_SetString(PyExc_TypeError, "dict items "
1694 "iterator must return 2-tuples");
1695 goto BatchFailed;
1696 }
1697 slice[n] = p;
1698 }
1699
1700 if (n > 1) {
1701 /* Pump out MARK, slice[0:n], SETITEMS. */
1702 if (self->write_func(self, &MARKv, 1) < 0)
1703 goto BatchFailed;
1704 for (i = 0; i < n; ++i) {
1705 p = slice[i];
1706 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1707 goto BatchFailed;
1708 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1709 goto BatchFailed;
1710 }
1711 if (self->write_func(self, &setitems, 1) < 0)
1712 goto BatchFailed;
1713 }
1714 else if (n == 1) {
1715 p = slice[0];
1716 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1717 goto BatchFailed;
1718 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1719 goto BatchFailed;
1720 if (self->write_func(self, &setitem, 1) < 0)
1721 goto BatchFailed;
1722 }
1723
1724 for (i = 0; i < n; ++i) {
1725 Py_DECREF(slice[i]);
1726 }
Tim Peters90975f12003-02-12 05:28:58 +00001727 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001728 return 0;
1729
1730BatchFailed:
1731 while (--n >= 0) {
1732 Py_DECREF(slice[n]);
1733 }
1734 return -1;
1735}
1736
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737static int
Tim Peterscba30e22003-02-01 06:24:36 +00001738save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739{
Tim Peters42f08ac2003-02-11 22:43:24 +00001740 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001742 int len;
1743 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 if (self->fast && !fast_save_enter(self, args))
1746 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001747
Tim Peters42f08ac2003-02-11 22:43:24 +00001748 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 if (self->bin) {
1750 s[0] = EMPTY_DICT;
1751 len = 1;
1752 }
1753 else {
1754 s[0] = MARK;
1755 s[1] = DICT;
1756 len = 2;
1757 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Tim Peters0bc93f52003-02-02 18:29:33 +00001759 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001760 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001761
Tim Peters42f08ac2003-02-11 22:43:24 +00001762 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if ((len = PyDict_Size(args)) < 0)
1764 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001767 if (put(self, args) >= 0)
1768 res = 0;
1769 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 }
Tim Peters90975f12003-02-12 05:28:58 +00001771 if (put2(self, args) < 0)
1772 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Tim Peters42f08ac2003-02-11 22:43:24 +00001774 /* Materialize the dict items. */
1775 iter = PyObject_CallMethod(args, "iteritems", "()");
1776 if (iter == NULL)
1777 goto finally;
1778 res = batch_dict(self, iter);
1779 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 finally:
1782 if (self->fast && !fast_save_leave(self, args))
1783 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001786}
1787
1788
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001789
Guido van Rossum60456fd1997-04-09 17:36:32 +00001790static int
Tim Peterscba30e22003-02-01 06:24:36 +00001791save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001793 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001794 char *name_str, *module_str;
1795 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 if (name) {
1800 global_name = name;
1801 Py_INCREF(global_name);
1802 }
1803 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001804 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 goto finally;
1806 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Tim Peterscba30e22003-02-01 06:24:36 +00001808 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 if ((module_size = PyString_Size(module)) < 0 ||
1812 (name_size = PyString_Size(global_name)) < 0)
1813 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 module_str = PyString_AS_STRING((PyStringObject *)module);
1816 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Guido van Rossum75bfd052002-12-24 18:10:07 +00001818 /* XXX This can be doing a relative import. Clearly it shouldn't,
1819 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 mod = PyImport_ImportModule(module_str);
1821 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001823 "Can't pickle %s: import of module %s "
1824 "failed",
1825 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
1827 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001828 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 if (klass == NULL) {
1830 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001831 "Can't pickle %s: attribute lookup %s.%s "
1832 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 "OSS", args, module, global_name);
1834 goto finally;
1835 }
1836 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001837 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001839 "Can't pickle %s: it's not the same object "
1840 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841 "OSS", args, module, global_name);
1842 goto finally;
1843 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001844 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001845
Tim Peters731098b2003-02-04 20:56:09 +00001846 if (self->proto >= 2) {
1847 /* See whether this is in the extension registry, and if
1848 * so generate an EXT opcode.
1849 */
1850 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001851 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001852 char c_str[5];
1853 int n;
1854
1855 PyTuple_SET_ITEM(two_tuple, 0, module);
1856 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1857 py_code = PyDict_GetItem(extension_registry, two_tuple);
1858 if (py_code == NULL)
1859 goto gen_global; /* not registered */
1860
1861 /* Verify py_code has the right type and value. */
1862 if (!PyInt_Check(py_code)) {
1863 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001864 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001865 "OO", args, py_code);
1866 goto finally;
1867 }
1868 code = PyInt_AS_LONG(py_code);
1869 if (code <= 0 || code > 0x7fffffffL) {
1870 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1871 "extension code %ld is out of range",
1872 "Ol", args, code);
1873 goto finally;
1874 }
1875
1876 /* Generate an EXT opcode. */
1877 if (code <= 0xff) {
1878 c_str[0] = EXT1;
1879 c_str[1] = (char)code;
1880 n = 2;
1881 }
1882 else if (code <= 0xffff) {
1883 c_str[0] = EXT2;
1884 c_str[1] = (char)(code & 0xff);
1885 c_str[2] = (char)((code >> 8) & 0xff);
1886 n = 3;
1887 }
1888 else {
1889 c_str[0] = EXT4;
1890 c_str[1] = (char)(code & 0xff);
1891 c_str[2] = (char)((code >> 8) & 0xff);
1892 c_str[3] = (char)((code >> 16) & 0xff);
1893 c_str[4] = (char)((code >> 24) & 0xff);
1894 n = 5;
1895 }
1896
1897 if (self->write_func(self, c_str, n) >= 0)
1898 res = 0;
1899 goto finally; /* and don't memoize */
1900 }
1901
1902 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001903 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001905
Tim Peters0bc93f52003-02-02 18:29:33 +00001906 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001908
Tim Peters0bc93f52003-02-02 18:29:33 +00001909 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Tim Peters0bc93f52003-02-02 18:29:33 +00001912 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Tim Peters0bc93f52003-02-02 18:29:33 +00001915 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001918 if (put(self, args) < 0)
1919 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 finally:
1924 Py_XDECREF(module);
1925 Py_XDECREF(global_name);
1926 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929}
1930
Guido van Rossum60456fd1997-04-09 17:36:32 +00001931static int
Tim Peterscba30e22003-02-01 06:24:36 +00001932save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933{
1934 PyObject *pid = 0;
1935 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 Py_INCREF(args);
1940 ARG_TUP(self, args);
1941 if (self->arg) {
1942 pid = PyObject_Call(f, self->arg, NULL);
1943 FREE_ARG_TUP(self);
1944 }
1945 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 if (pid != Py_None) {
1948 if (!self->bin) {
1949 if (!PyString_Check(pid)) {
1950 PyErr_SetString(PicklingError,
1951 "persistent id must be string");
1952 goto finally;
1953 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Tim Peters0bc93f52003-02-02 18:29:33 +00001955 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if ((size = PyString_Size(pid)) < 0)
1959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001960
Tim Peters0bc93f52003-02-02 18:29:33 +00001961 if (self->write_func(self,
1962 PyString_AS_STRING(
1963 (PyStringObject *)pid),
1964 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Tim Peters0bc93f52003-02-02 18:29:33 +00001967 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970 res = 1;
1971 goto finally;
1972 }
1973 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001974 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 res = -1;
1976 else
1977 res = 1;
1978 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 goto finally;
1981 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 finally:
1986 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001989}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001990
Tim Peters71fcda52003-02-14 23:05:28 +00001991/* We're saving ob, and args is the 2-thru-5 tuple returned by the
1992 * appropriate __reduce__ method for ob.
1993 */
Tim Peters84e87f32001-03-17 04:50:51 +00001994static int
Tim Peters71fcda52003-02-14 23:05:28 +00001995save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996{
Tim Peters71fcda52003-02-14 23:05:28 +00001997 PyObject *callable;
1998 PyObject *argtup;
1999 PyObject *state = NULL;
2000 PyObject *listitems = NULL;
2001 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002002
Tim Peters71fcda52003-02-14 23:05:28 +00002003 int use_newobj = self->proto >= 2;
2004
2005 static char reduce = REDUCE;
2006 static char build = BUILD;
2007 static char newobj = NEWOBJ;
2008
2009 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2010 &callable,
2011 &argtup,
2012 &state,
2013 &listitems,
2014 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002015 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002016
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002017 if (!PyTuple_Check(argtup)) {
2018 PyErr_SetString(PicklingError,
2019 "args from reduce() should be a tuple");
2020 return -1;
2021 }
2022
Tim Peters71fcda52003-02-14 23:05:28 +00002023 if (state == Py_None)
2024 state = NULL;
2025 if (listitems == Py_None)
2026 listitems = NULL;
2027 if (dictitems == Py_None)
2028 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002029
Tim Peters71fcda52003-02-14 23:05:28 +00002030 /* Protocol 2 special case: if callable's name is __newobj__, use
2031 * NEWOBJ. This consumes a lot of code.
2032 */
2033 if (use_newobj) {
2034 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002035
Tim Peters71fcda52003-02-14 23:05:28 +00002036 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002037 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2038 PyErr_Clear();
2039 else
2040 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002041 use_newobj = 0;
2042 }
2043 else {
2044 use_newobj = PyString_Check(temp) &&
2045 strcmp(PyString_AS_STRING(temp),
2046 "__newobj__") == 0;
2047 Py_DECREF(temp);
2048 }
2049 }
2050 if (use_newobj) {
2051 PyObject *cls;
2052 PyObject *newargtup;
2053 int n, i;
2054
2055 /* Sanity checks. */
2056 n = PyTuple_Size(argtup);
2057 if (n < 1) {
2058 PyErr_SetString(PicklingError, "__newobj__ arglist "
2059 "is empty");
2060 return -1;
2061 }
2062
2063 cls = PyTuple_GET_ITEM(argtup, 0);
2064 if (! PyObject_HasAttrString(cls, "__new__")) {
2065 PyErr_SetString(PicklingError, "args[0] from "
2066 "__newobj__ args has no __new__");
2067 return -1;
2068 }
2069
2070 /* XXX How could ob be NULL? */
2071 if (ob != NULL) {
2072 PyObject *ob_dot_class;
2073
2074 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002075 if (ob_dot_class == NULL) {
2076 if (PyErr_ExceptionMatches(
2077 PyExc_AttributeError))
2078 PyErr_Clear();
2079 else
2080 return -1;
2081 }
Tim Peters71fcda52003-02-14 23:05:28 +00002082 i = ob_dot_class != cls; /* true iff a problem */
2083 Py_XDECREF(ob_dot_class);
2084 if (i) {
2085 PyErr_SetString(PicklingError, "args[0] from "
2086 "__newobj__ args has the wrong class");
2087 return -1;
2088 }
2089 }
2090
2091 /* Save the class and its __new__ arguments. */
2092 if (save(self, cls, 0) < 0)
2093 return -1;
2094
2095 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2096 if (newargtup == NULL)
2097 return -1;
2098 for (i = 1; i < n; ++i) {
2099 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2100 Py_INCREF(temp);
2101 PyTuple_SET_ITEM(newargtup, i-1, temp);
2102 }
2103 i = save(self, newargtup, 0) < 0;
2104 Py_DECREF(newargtup);
2105 if (i < 0)
2106 return -1;
2107
2108 /* Add NEWOBJ opcode. */
2109 if (self->write_func(self, &newobj, 1) < 0)
2110 return -1;
2111 }
2112 else {
2113 /* Not using NEWOBJ. */
2114 if (save(self, callable, 0) < 0 ||
2115 save(self, argtup, 0) < 0 ||
2116 self->write_func(self, &reduce, 1) < 0)
2117 return -1;
2118 }
2119
2120 /* Memoize. */
2121 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 if (ob != NULL) {
2123 if (state && !PyDict_Check(state)) {
2124 if (put2(self, ob) < 0)
2125 return -1;
2126 }
Tim Peters71fcda52003-02-14 23:05:28 +00002127 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002128 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 }
Tim Peters84e87f32001-03-17 04:50:51 +00002130
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Tim Peters71fcda52003-02-14 23:05:28 +00002132 if (listitems && batch_list(self, listitems) < 0)
2133 return -1;
2134
2135 if (dictitems && batch_dict(self, dictitems) < 0)
2136 return -1;
2137
2138 if (state) {
2139 if (save(self, state, 0) < 0 ||
2140 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 return -1;
2142 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002145}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002146
Guido van Rossum60456fd1997-04-09 17:36:32 +00002147static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002148save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149{
2150 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002151 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2152 PyObject *arg_tup;
2153 int res = -1;
2154 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002155
Martin v. Löwis5a395302002-08-04 08:20:23 +00002156 if (self->nesting++ > Py_GetRecursionLimit()){
2157 PyErr_SetString(PyExc_RuntimeError,
2158 "maximum recursion depth exceeded");
2159 goto finally;
2160 }
2161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 if (!pers_save && self->pers_func) {
2163 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2164 res = tmp;
2165 goto finally;
2166 }
2167 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002169 if (args == Py_None) {
2170 res = save_none(self, args);
2171 goto finally;
2172 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002176 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002177 case 'b':
2178 if (args == Py_False || args == Py_True) {
2179 res = save_bool(self, args);
2180 goto finally;
2181 }
2182 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002183 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 if (type == &PyInt_Type) {
2185 res = save_int(self, args);
2186 goto finally;
2187 }
2188 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002189
Guido van Rossum60456fd1997-04-09 17:36:32 +00002190 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 if (type == &PyLong_Type) {
2192 res = save_long(self, args);
2193 goto finally;
2194 }
2195 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002196
Guido van Rossum60456fd1997-04-09 17:36:32 +00002197 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 if (type == &PyFloat_Type) {
2199 res = save_float(self, args);
2200 goto finally;
2201 }
2202 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002203
Guido van Rossum60456fd1997-04-09 17:36:32 +00002204 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002205 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2206 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002207 goto finally;
2208 }
2209 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002210
Guido van Rossum60456fd1997-04-09 17:36:32 +00002211 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2213 res = save_string(self, args, 0);
2214 goto finally;
2215 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002216
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002217#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002218 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002219 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2220 res = save_unicode(self, args, 0);
2221 goto finally;
2222 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002223#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002224 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002227 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002228 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 if (PyDict_GetItem(self->memo, py_ob_id)) {
2231 if (get(self, py_ob_id) < 0)
2232 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 res = 0;
2235 goto finally;
2236 }
2237 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002240 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 if (type == &PyString_Type) {
2242 res = save_string(self, args, 1);
2243 goto finally;
2244 }
2245 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002246
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002247#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002248 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002249 if (type == &PyUnicode_Type) {
2250 res = save_unicode(self, args, 1);
2251 goto finally;
2252 }
2253 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002254#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002255
Guido van Rossum60456fd1997-04-09 17:36:32 +00002256 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 if (type == &PyTuple_Type) {
2258 res = save_tuple(self, args);
2259 goto finally;
2260 }
2261 if (type == &PyType_Type) {
2262 res = save_global(self, args, NULL);
2263 goto finally;
2264 }
2265 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002266
Guido van Rossum60456fd1997-04-09 17:36:32 +00002267 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 if (type == &PyList_Type) {
2269 res = save_list(self, args);
2270 goto finally;
2271 }
2272 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002273
2274 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 if (type == &PyDict_Type) {
2276 res = save_dict(self, args);
2277 goto finally;
2278 }
2279 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002280
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 if (type == &PyFunction_Type) {
2283 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002284 if (res && PyErr_ExceptionMatches(PickleError)) {
2285 /* fall back to reduce */
2286 PyErr_Clear();
2287 break;
2288 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 goto finally;
2290 }
2291 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292
2293 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 if (type == &PyCFunction_Type) {
2295 res = save_global(self, args, NULL);
2296 goto finally;
2297 }
2298 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 if (!pers_save && self->inst_pers_func) {
2301 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2302 res = tmp;
2303 goto finally;
2304 }
2305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
Jeremy Hylton39c61162002-07-16 19:47:43 +00002307 if (PyType_IsSubtype(type, &PyType_Type)) {
2308 res = save_global(self, args, NULL);
2309 goto finally;
2310 }
2311
Guido van Rossumb289b872003-02-19 01:45:13 +00002312 /* Get a reduction callable, and call it. This may come from
2313 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2314 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002315 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002316 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2317 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002318 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002319 Py_INCREF(args);
2320 ARG_TUP(self, args);
2321 if (self->arg) {
2322 t = PyObject_Call(__reduce__, self->arg, NULL);
2323 FREE_ARG_TUP(self);
2324 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 }
2326 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002327 /* Check for a __reduce_ex__ method. */
2328 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2329 if (__reduce__ != NULL) {
2330 t = PyInt_FromLong(self->proto);
2331 if (t != NULL) {
2332 ARG_TUP(self, t);
2333 t = NULL;
2334 if (self->arg) {
2335 t = PyObject_Call(__reduce__,
2336 self->arg, NULL);
2337 FREE_ARG_TUP(self);
2338 }
2339 }
2340 }
2341 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002342 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2343 PyErr_Clear();
2344 else
2345 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002346 /* Check for a __reduce__ method. */
2347 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2348 if (__reduce__ != NULL) {
2349 t = PyObject_Call(__reduce__,
2350 empty_tuple, NULL);
2351 }
2352 else {
2353 PyErr_SetObject(UnpickleableError, args);
2354 goto finally;
2355 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002358
Tim Peters71fcda52003-02-14 23:05:28 +00002359 if (t == NULL)
2360 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002361
Tim Peters71fcda52003-02-14 23:05:28 +00002362 if (PyString_Check(t)) {
2363 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 goto finally;
2365 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002366
Tim Peters71fcda52003-02-14 23:05:28 +00002367 if (! PyTuple_Check(t)) {
2368 cPickle_ErrFormat(PicklingError, "Value returned by "
2369 "%s must be string or tuple",
2370 "O", __reduce__);
2371 goto finally;
2372 }
2373
2374 size = PyTuple_Size(t);
2375 if (size < 2 || size > 5) {
2376 cPickle_ErrFormat(PicklingError, "tuple returned by "
2377 "%s must contain 2 through 5 elements",
2378 "O", __reduce__);
2379 goto finally;
2380 }
2381
2382 arg_tup = PyTuple_GET_ITEM(t, 1);
2383 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2384 cPickle_ErrFormat(PicklingError, "Second element of "
2385 "tuple returned by %s must be a tuple",
2386 "O", __reduce__);
2387 goto finally;
2388 }
2389
2390 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002393 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394 Py_XDECREF(py_ob_id);
2395 Py_XDECREF(__reduce__);
2396 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002399}
2400
2401
2402static int
Tim Peterscba30e22003-02-01 06:24:36 +00002403dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404{
2405 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002406
Tim Peters4190fb82003-02-02 16:09:05 +00002407 if (self->proto >= 2) {
2408 char bytes[2];
2409
2410 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002411 assert(self->proto >= 0 && self->proto < 256);
2412 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002413 if (self->write_func(self, bytes, 2) < 0)
2414 return -1;
2415 }
2416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 if (save(self, args, 0) < 0)
2418 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002419
Tim Peters4190fb82003-02-02 16:09:05 +00002420 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002422
Tim Peters4190fb82003-02-02 16:09:05 +00002423 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002426 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002427}
2428
2429static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002430Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431{
Tim Peterscba30e22003-02-01 06:24:36 +00002432 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 PyDict_Clear(self->memo);
2434 Py_INCREF(Py_None);
2435 return Py_None;
2436}
2437
2438static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002439Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440{
2441 int l, i, rsize, ssize, clear=1, lm;
2442 long ik;
2443 PyObject *k, *r;
2444 char *s, *p, *have_get;
2445 Pdata *data;
2446
2447 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002448 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 return NULL;
2450
2451 /* Check to make sure we are based on a list */
2452 if (! Pdata_Check(self->file)) {
2453 PyErr_SetString(PicklingError,
2454 "Attempt to getvalue() a non-list-based pickler");
2455 return NULL;
2456 }
2457
2458 /* flush write buffer */
2459 if (write_other(self, NULL, 0) < 0) return NULL;
2460
2461 data=(Pdata*)self->file;
2462 l=data->length;
2463
2464 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002465 lm = PyDict_Size(self->memo);
2466 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002467 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002468 have_get = malloc(lm);
2469 if (have_get == NULL) return PyErr_NoMemory();
2470 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002471
2472 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002473 for (rsize = 0, i = l; --i >= 0; ) {
2474 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475
Tim Petersac5687a2003-02-02 18:08:34 +00002476 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478
2479 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002480 ik = PyInt_AS_LONG((PyIntObject*)k);
2481 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 PyErr_SetString(PicklingError,
2483 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002484 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 }
Tim Petersac5687a2003-02-02 18:08:34 +00002486 if (have_get[ik]) /* with matching get */
2487 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 }
2489
2490 else if (! (PyTuple_Check(k) &&
2491 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002492 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 ) {
2494 PyErr_SetString(PicklingError,
2495 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002496 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 }
2498
2499 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002500 ik = PyInt_AS_LONG((PyIntObject *)k);
2501 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 PyErr_SetString(PicklingError,
2503 "Invalid get data");
2504 return NULL;
2505 }
Tim Petersac5687a2003-02-02 18:08:34 +00002506 have_get[ik] = 1;
2507 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002508 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 }
2510
2511 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002512 r = PyString_FromStringAndSize(NULL, rsize);
2513 if (r == NULL) goto err;
2514 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002515
Tim Petersac5687a2003-02-02 18:08:34 +00002516 for (i = 0; i < l; i++) {
2517 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002518
2519 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002520 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002521 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002522 p=PyString_AS_STRING((PyStringObject *)k);
2523 while (--ssize >= 0)
2524 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002525 }
2526 }
2527
2528 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002529 ik = PyInt_AS_LONG((PyIntObject *)
2530 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002531 if (ik < 256) {
2532 *s++ = BINGET;
2533 *s++ = (int)(ik & 0xff);
2534 }
2535 else {
2536 *s++ = LONG_BINGET;
2537 *s++ = (int)(ik & 0xff);
2538 *s++ = (int)((ik >> 8) & 0xff);
2539 *s++ = (int)((ik >> 16) & 0xff);
2540 *s++ = (int)((ik >> 24) & 0xff);
2541 }
2542 }
2543
2544 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002545 ik = PyInt_AS_LONG((PyIntObject*)k);
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
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 if (PyFile_Check(file)) {
2655 self->fp = PyFile_AsFile(file);
2656 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002657 PyErr_SetString(PyExc_ValueError,
2658 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 goto err;
2660 }
2661 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002662 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 else if (PycStringIO_OutputCheck(file)) {
2664 self->write_func = write_cStringIO;
2665 }
2666 else if (file == Py_None) {
2667 self->write_func = write_none;
2668 }
2669 else {
2670 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 if (! Pdata_Check(file)) {
2673 self->write = PyObject_GetAttr(file, write_str);
2674 if (!self->write) {
2675 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002676 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 "argument must have 'write' "
2678 "attribute");
2679 goto err;
2680 }
2681 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002682
Tim Peters5bd2a792003-02-01 16:45:06 +00002683 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2684 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 PyErr_NoMemory();
2686 goto err;
2687 }
2688 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 if (PyEval_GetRestricted()) {
2691 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002692 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002693
Tim Peters5b7da392003-02-04 00:21:07 +00002694 if (m == NULL)
2695 goto err;
2696 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002698 if (self->dispatch_table == NULL)
2699 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002700 }
2701 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002702 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 Py_INCREF(dispatch_table);
2704 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002705 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002710 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002712}
2713
2714
2715static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002716get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002718 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002719 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002720 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002721
Tim Peters92c8bb32003-02-13 23:00:26 +00002722 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002723 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002724 * accepts Pickler() and Pickler(integer) too. The meaning then
2725 * is clear as mud, undocumented, and not supported by pickle.py.
2726 * I'm told Zope uses this, but I haven't traced into this code
2727 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002728 */
2729 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002731 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002732 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2733 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 return NULL;
2735 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002736 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002737}
2738
2739
2740static void
Tim Peterscba30e22003-02-01 06:24:36 +00002741Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002743 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744 Py_XDECREF(self->write);
2745 Py_XDECREF(self->memo);
2746 Py_XDECREF(self->fast_memo);
2747 Py_XDECREF(self->arg);
2748 Py_XDECREF(self->file);
2749 Py_XDECREF(self->pers_func);
2750 Py_XDECREF(self->inst_pers_func);
2751 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002752 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002753 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002754}
2755
2756static int
2757Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2758{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002759 Py_VISIT(self->write);
2760 Py_VISIT(self->memo);
2761 Py_VISIT(self->fast_memo);
2762 Py_VISIT(self->arg);
2763 Py_VISIT(self->file);
2764 Py_VISIT(self->pers_func);
2765 Py_VISIT(self->inst_pers_func);
2766 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002767 return 0;
2768}
2769
2770static int
2771Pickler_clear(Picklerobject *self)
2772{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773 Py_CLEAR(self->write);
2774 Py_CLEAR(self->memo);
2775 Py_CLEAR(self->fast_memo);
2776 Py_CLEAR(self->arg);
2777 Py_CLEAR(self->file);
2778 Py_CLEAR(self->pers_func);
2779 Py_CLEAR(self->inst_pers_func);
2780 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002781 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002782}
2783
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002784static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002785Pickler_get_pers_func(Picklerobject *p)
2786{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 if (p->pers_func == NULL)
2788 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2789 else
2790 Py_INCREF(p->pers_func);
2791 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002792}
2793
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002794static int
2795Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2796{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 if (v == NULL) {
2798 PyErr_SetString(PyExc_TypeError,
2799 "attribute deletion is not supported");
2800 return -1;
2801 }
2802 Py_XDECREF(p->pers_func);
2803 Py_INCREF(v);
2804 p->pers_func = v;
2805 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002806}
2807
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002808static int
2809Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2810{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 if (v == NULL) {
2812 PyErr_SetString(PyExc_TypeError,
2813 "attribute deletion is not supported");
2814 return -1;
2815 }
2816 Py_XDECREF(p->inst_pers_func);
2817 Py_INCREF(v);
2818 p->inst_pers_func = v;
2819 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002820}
2821
2822static PyObject *
2823Pickler_get_memo(Picklerobject *p)
2824{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 if (p->memo == NULL)
2826 PyErr_SetString(PyExc_AttributeError, "memo");
2827 else
2828 Py_INCREF(p->memo);
2829 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002830}
2831
2832static int
2833Pickler_set_memo(Picklerobject *p, PyObject *v)
2834{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 if (v == NULL) {
2836 PyErr_SetString(PyExc_TypeError,
2837 "attribute deletion is not supported");
2838 return -1;
2839 }
2840 if (!PyDict_Check(v)) {
2841 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2842 return -1;
2843 }
2844 Py_XDECREF(p->memo);
2845 Py_INCREF(v);
2846 p->memo = v;
2847 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002848}
2849
2850static PyObject *
2851Pickler_get_error(Picklerobject *p)
2852{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 /* why is this an attribute on the Pickler? */
2854 Py_INCREF(PicklingError);
2855 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002856}
2857
2858static PyMemberDef Pickler_members[] = {
2859 {"binary", T_INT, offsetof(Picklerobject, bin)},
2860 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002861 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002862};
2863
2864static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002865 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002866 (setter)Pickler_set_pers_func},
2867 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2868 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002869 {"PicklingError", (getter)Pickler_get_error, NULL},
2870 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002871};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002873PyDoc_STRVAR(Picklertype__doc__,
2874"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002875
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002876static PyTypeObject Picklertype = {
2877 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002879 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002880 sizeof(Picklerobject), /*tp_basicsize*/
2881 0,
2882 (destructor)Pickler_dealloc, /* tp_dealloc */
2883 0, /* tp_print */
2884 0, /* tp_getattr */
2885 0, /* tp_setattr */
2886 0, /* tp_compare */
2887 0, /* tp_repr */
2888 0, /* tp_as_number */
2889 0, /* tp_as_sequence */
2890 0, /* tp_as_mapping */
2891 0, /* tp_hash */
2892 0, /* tp_call */
2893 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002894 PyObject_GenericGetAttr, /* tp_getattro */
2895 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002896 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002897 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002898 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002899 (traverseproc)Pickler_traverse, /* tp_traverse */
2900 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002901 0, /* tp_richcompare */
2902 0, /* tp_weaklistoffset */
2903 0, /* tp_iter */
2904 0, /* tp_iternext */
2905 Pickler_methods, /* tp_methods */
2906 Pickler_members, /* tp_members */
2907 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002908};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002909
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002910static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002911find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912{
2913 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915 if (fc) {
2916 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002917 PyErr_SetString(UnpicklingError, "Global and instance "
2918 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 return NULL;
2920 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002921 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2922 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 module = PySys_GetObject("modules");
2926 if (module == NULL)
2927 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929 module = PyDict_GetItem(module, py_module_name);
2930 if (module == NULL) {
2931 module = PyImport_Import(py_module_name);
2932 if (!module)
2933 return NULL;
2934 global = PyObject_GetAttr(module, py_global_name);
2935 Py_DECREF(module);
2936 }
2937 else
2938 global = PyObject_GetAttr(module, py_global_name);
2939 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002940}
2941
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002942static int
Tim Peterscba30e22003-02-01 06:24:36 +00002943marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944{
2945 if (self->num_marks < 1) {
2946 PyErr_SetString(UnpicklingError, "could not find MARK");
2947 return -1;
2948 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002951}
2952
Tim Peters84e87f32001-03-17 04:50:51 +00002953
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954static int
Tim Peterscba30e22003-02-01 06:24:36 +00002955load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956{
2957 PDATA_APPEND(self->stack, Py_None, -1);
2958 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959}
2960
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002961static int
Tim Peterscba30e22003-02-01 06:24:36 +00002962bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963{
2964 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2965 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002966}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
2968static int
Tim Peterscba30e22003-02-01 06:24:36 +00002969load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970{
2971 PyObject *py_int = 0;
2972 char *endptr, *s;
2973 int len, res = -1;
2974 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975
Tim Peters0bc93f52003-02-02 18:29:33 +00002976 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977 if (len < 2) return bad_readline();
2978 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 errno = 0;
2981 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2984 /* Hm, maybe we've got something long. Let's try reading
2985 it as a Python long object. */
2986 errno = 0;
2987 py_int = PyLong_FromString(s, NULL, 0);
2988 if (py_int == NULL) {
2989 PyErr_SetString(PyExc_ValueError,
2990 "could not convert string to int");
2991 goto finally;
2992 }
2993 }
2994 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002995 if (len == 3 && (l == 0 || l == 1)) {
2996 if (!( py_int = PyBool_FromLong(l))) goto finally;
2997 }
2998 else {
2999 if (!( py_int = PyInt_FromLong(l))) goto finally;
3000 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 free(s);
3004 PDATA_PUSH(self->stack, py_int, -1);
3005 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007 finally:
3008 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003010 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011}
3012
Tim Peters3c67d792003-02-02 17:59:11 +00003013static int
3014load_bool(Unpicklerobject *self, PyObject *boolean)
3015{
3016 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003017 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003018 return 0;
3019}
3020
Tim Petersee1a53c2003-02-02 02:57:53 +00003021/* s contains x bytes of a little-endian integer. Return its value as a
3022 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3023 * int, but when x is 4 it's a signed one. This is an historical source
3024 * of x-platform bugs.
3025 */
Tim Peters84e87f32001-03-17 04:50:51 +00003026static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003027calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028{
3029 unsigned char c;
3030 int i;
3031 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003033 for (i = 0, l = 0L; i < x; i++) {
3034 c = (unsigned char)s[i];
3035 l |= (long)c << (i * 8);
3036 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003037#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003038 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3039 * is signed, so on a box with longs bigger than 4 bytes we need
3040 * to extend a BININT's sign bit to the full width.
3041 */
3042 if (x == 4 && l & (1L << 31))
3043 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003044#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046}
3047
3048
3049static int
Tim Peterscba30e22003-02-01 06:24:36 +00003050load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051{
3052 PyObject *py_int = 0;
3053 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Tim Peterscba30e22003-02-01 06:24:36 +00003057 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 PDATA_PUSH(self->stack, py_int, -1);
3061 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062}
3063
3064
3065static int
Tim Peterscba30e22003-02-01 06:24:36 +00003066load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067{
3068 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069
Tim Peters0bc93f52003-02-02 18:29:33 +00003070 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074}
3075
3076
3077static int
Tim Peterscba30e22003-02-01 06:24:36 +00003078load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079{
3080 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Tim Peters0bc93f52003-02-02 18:29:33 +00003082 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086}
3087
3088
3089static int
Tim Peterscba30e22003-02-01 06:24:36 +00003090load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091{
3092 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Tim Peters0bc93f52003-02-02 18:29:33 +00003094 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098}
Tim Peters84e87f32001-03-17 04:50:51 +00003099
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100static int
Tim Peterscba30e22003-02-01 06:24:36 +00003101load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102{
3103 PyObject *l = 0;
3104 char *end, *s;
3105 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Tim Peters0bc93f52003-02-02 18:29:33 +00003107 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 if (len < 2) return bad_readline();
3109 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Tim Peterscba30e22003-02-01 06:24:36 +00003111 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003112 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114 free(s);
3115 PDATA_PUSH(self->stack, l, -1);
3116 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118 finally:
3119 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122}
3123
Tim Petersee1a53c2003-02-02 02:57:53 +00003124/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3125 * data following.
3126 */
3127static int
3128load_counted_long(Unpicklerobject *self, int size)
3129{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003130 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003131 char *nbytes;
3132 unsigned char *pdata;
3133 PyObject *along;
3134
3135 assert(size == 1 || size == 4);
3136 i = self->read_func(self, &nbytes, size);
3137 if (i < 0) return -1;
3138
3139 size = calc_binint(nbytes, size);
3140 if (size < 0) {
3141 /* Corrupt or hostile pickle -- we never write one like
3142 * this.
3143 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003144 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003145 "byte count");
3146 return -1;
3147 }
3148
3149 if (size == 0)
3150 along = PyLong_FromLong(0L);
3151 else {
3152 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003153 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003154 if (i < 0) return -1;
3155 along = _PyLong_FromByteArray(pdata, (size_t)size,
3156 1 /* little endian */, 1 /* signed */);
3157 }
3158 if (along == NULL)
3159 return -1;
3160 PDATA_PUSH(self->stack, along, -1);
3161 return 0;
3162}
Tim Peters84e87f32001-03-17 04:50:51 +00003163
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164static int
Tim Peterscba30e22003-02-01 06:24:36 +00003165load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166{
3167 PyObject *py_float = 0;
3168 char *endptr, *s;
3169 int len, res = -1;
3170 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171
Tim Peters0bc93f52003-02-02 18:29:33 +00003172 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 if (len < 2) return bad_readline();
3174 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003176 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003177 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3180 PyErr_SetString(PyExc_ValueError,
3181 "could not convert string to float");
3182 goto finally;
3183 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184
Tim Peterscba30e22003-02-01 06:24:36 +00003185 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 free(s);
3189 PDATA_PUSH(self->stack, py_float, -1);
3190 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003192 finally:
3193 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196}
3197
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198static int
Tim Peterscba30e22003-02-01 06:24:36 +00003199load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200{
Tim Peters9905b942003-03-20 20:53:32 +00003201 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 double x;
3203 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Tim Peters0bc93f52003-02-02 18:29:33 +00003205 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207
Tim Peters9905b942003-03-20 20:53:32 +00003208 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3209 if (x == -1.0 && PyErr_Occurred())
3210 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003211
Tim Peters9905b942003-03-20 20:53:32 +00003212 py_float = PyFloat_FromDouble(x);
3213 if (py_float == NULL)
3214 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 PDATA_PUSH(self->stack, py_float, -1);
3217 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
3220static int
Tim Peterscba30e22003-02-01 06:24:36 +00003221load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222{
3223 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003224 int len, res = -1;
3225 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
Tim Peters0bc93f52003-02-02 18:29:33 +00003227 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if (len < 2) return bad_readline();
3229 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003231
3232 /* Strip outermost quotes */
3233 while (s[len-1] <= ' ')
3234 len--;
3235 if(s[0]=='"' && s[len-1]=='"'){
3236 s[len-1] = '\0';
3237 p = s + 1 ;
3238 len -= 2;
3239 } else if(s[0]=='\'' && s[len-1]=='\''){
3240 s[len-1] = '\0';
3241 p = s + 1 ;
3242 len -= 2;
3243 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 goto insecure;
3245 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003246
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003247 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003248 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003249 if (str) {
3250 PDATA_PUSH(self->stack, str, -1);
3251 res = 0;
3252 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 insecure:
3256 free(s);
3257 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3258 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003259}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260
3261
3262static int
Tim Peterscba30e22003-02-01 06:24:36 +00003263load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264{
3265 PyObject *py_string = 0;
3266 long l;
3267 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268
Tim Peters0bc93f52003-02-02 18:29:33 +00003269 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003272
Tim Peters0bc93f52003-02-02 18:29:33 +00003273 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275
Tim Peterscba30e22003-02-01 06:24:36 +00003276 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003279 PDATA_PUSH(self->stack, py_string, -1);
3280 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281}
3282
3283
3284static int
Tim Peterscba30e22003-02-01 06:24:36 +00003285load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003286{
3287 PyObject *py_string = 0;
3288 unsigned char l;
3289 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290
Tim Peters0bc93f52003-02-02 18:29:33 +00003291 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003295
Tim Peters0bc93f52003-02-02 18:29:33 +00003296 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 PDATA_PUSH(self->stack, py_string, -1);
3301 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003302}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003303
3304
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003305#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003306static int
Tim Peterscba30e22003-02-01 06:24:36 +00003307load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308{
3309 PyObject *str = 0;
3310 int len, res = -1;
3311 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003312
Tim Peters0bc93f52003-02-02 18:29:33 +00003313 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003314 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003315
Tim Peterscba30e22003-02-01 06:24:36 +00003316 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003317 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319 PDATA_PUSH(self->stack, str, -1);
3320 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 finally:
3323 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003324}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003325#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003326
3327
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003328#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003329static int
Tim Peterscba30e22003-02-01 06:24:36 +00003330load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003331{
3332 PyObject *unicode;
3333 long l;
3334 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003335
Tim Peters0bc93f52003-02-02 18:29:33 +00003336 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003339
Tim Peters0bc93f52003-02-02 18:29:33 +00003340 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003342
Tim Peterscba30e22003-02-01 06:24:36 +00003343 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 PDATA_PUSH(self->stack, unicode, -1);
3347 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003348}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003349#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003350
3351
3352static int
Tim Peterscba30e22003-02-01 06:24:36 +00003353load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003354{
3355 PyObject *tup;
3356 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 if ((i = marker(self)) < 0) return -1;
3359 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3360 PDATA_PUSH(self->stack, tup, -1);
3361 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362}
3363
3364static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003365load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003367 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Tim Peters1d63c9f2003-02-02 20:29:39 +00003369 if (tup == NULL)
3370 return -1;
3371
3372 while (--len >= 0) {
3373 PyObject *element;
3374
3375 PDATA_POP(self->stack, element);
3376 if (element == NULL)
3377 return -1;
3378 PyTuple_SET_ITEM(tup, len, element);
3379 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 PDATA_PUSH(self->stack, tup, -1);
3381 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382}
3383
3384static int
Tim Peterscba30e22003-02-01 06:24:36 +00003385load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386{
3387 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 if (!( list=PyList_New(0))) return -1;
3390 PDATA_PUSH(self->stack, list, -1);
3391 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392}
3393
3394static int
Tim Peterscba30e22003-02-01 06:24:36 +00003395load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396{
3397 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 if (!( dict=PyDict_New())) return -1;
3400 PDATA_PUSH(self->stack, dict, -1);
3401 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402}
3403
3404
3405static int
Tim Peterscba30e22003-02-01 06:24:36 +00003406load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407{
3408 PyObject *list = 0;
3409 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 if ((i = marker(self)) < 0) return -1;
3412 if (!( list=Pdata_popList(self->stack, i))) return -1;
3413 PDATA_PUSH(self->stack, list, -1);
3414 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415}
3416
3417static int
Tim Peterscba30e22003-02-01 06:24:36 +00003418load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419{
3420 PyObject *dict, *key, *value;
3421 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 if ((i = marker(self)) < 0) return -1;
3424 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003428 for (k = i+1; k < j; k += 2) {
3429 key =self->stack->data[k-1];
3430 value=self->stack->data[k ];
3431 if (PyDict_SetItem(dict, key, value) < 0) {
3432 Py_DECREF(dict);
3433 return -1;
3434 }
3435 }
3436 Pdata_clear(self->stack, i);
3437 PDATA_PUSH(self->stack, dict, -1);
3438 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439}
3440
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441
3442static int
Tim Peterscba30e22003-02-01 06:24:36 +00003443load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444{
3445 PyObject *class, *tup, *obj=0;
3446 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 if ((i = marker(self)) < 0) return -1;
3449 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3450 PDATA_POP(self->stack, class);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003451 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453 if (! obj) return -1;
3454 PDATA_PUSH(self->stack, obj, -1);
3455 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456}
3457
3458
3459static int
Tim Peterscba30e22003-02-01 06:24:36 +00003460load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461{
3462 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3463 int i, len;
3464 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003467
Tim Peters0bc93f52003-02-02 18:29:33 +00003468 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 if (len < 2) return bad_readline();
3470 module_name = PyString_FromStringAndSize(s, len - 1);
3471 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003472
Tim Peters0bc93f52003-02-02 18:29:33 +00003473 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003474 if (len < 2) return bad_readline();
3475 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003476 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 self->find_class);
3478 Py_DECREF(class_name);
3479 }
3480 }
3481 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003486 PyErr_SetString(UnpicklingError, "it's dead, Jim");
3487 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 }
3489 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 PDATA_PUSH(self->stack, obj, -1);
3494 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495}
3496
Tim Peterseab7db32003-02-13 18:24:14 +00003497static int
3498load_newobj(Unpicklerobject *self)
3499{
3500 PyObject *args = NULL;
3501 PyObject *clsraw = NULL;
3502 PyTypeObject *cls; /* clsraw cast to its true type */
3503 PyObject *obj;
3504
3505 /* Stack is ... cls argtuple, and we want to call
3506 * cls.__new__(cls, *argtuple).
3507 */
3508 PDATA_POP(self->stack, args);
3509 if (args == NULL) goto Fail;
3510 if (! PyTuple_Check(args)) {
3511 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3512 "tuple.");
3513 goto Fail;
3514 }
3515
3516 PDATA_POP(self->stack, clsraw);
3517 cls = (PyTypeObject *)clsraw;
3518 if (cls == NULL) goto Fail;
3519 if (! PyType_Check(cls)) {
3520 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3521 "isn't a type object");
3522 goto Fail;
3523 }
3524 if (cls->tp_new == NULL) {
3525 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3526 "has NULL tp_new");
3527 goto Fail;
3528 }
3529
3530 /* Call __new__. */
3531 obj = cls->tp_new(cls, args, NULL);
3532 if (obj == NULL) goto Fail;
3533
3534 Py_DECREF(args);
3535 Py_DECREF(clsraw);
3536 PDATA_PUSH(self->stack, obj, -1);
3537 return 0;
3538
3539 Fail:
3540 Py_XDECREF(args);
3541 Py_XDECREF(clsraw);
3542 return -1;
3543}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
3545static int
Tim Peterscba30e22003-02-01 06:24:36 +00003546load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003547{
3548 PyObject *class = 0, *module_name = 0, *class_name = 0;
3549 int len;
3550 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Tim Peters0bc93f52003-02-02 18:29:33 +00003552 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553 if (len < 2) return bad_readline();
3554 module_name = PyString_FromStringAndSize(s, len - 1);
3555 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556
Tim Peters0bc93f52003-02-02 18:29:33 +00003557 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003558 if (len < 2) {
3559 Py_DECREF(module_name);
3560 return bad_readline();
3561 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003562 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003563 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 self->find_class);
3565 Py_DECREF(class_name);
3566 }
3567 }
3568 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003570 if (! class) return -1;
3571 PDATA_PUSH(self->stack, class, -1);
3572 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003573}
3574
3575
3576static int
Tim Peterscba30e22003-02-01 06:24:36 +00003577load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578{
3579 PyObject *pid = 0;
3580 int len;
3581 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003583 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003584 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 if (len < 2) return bad_readline();
3586
3587 pid = PyString_FromStringAndSize(s, len - 1);
3588 if (!pid) return -1;
3589
3590 if (PyList_Check(self->pers_func)) {
3591 if (PyList_Append(self->pers_func, pid) < 0) {
3592 Py_DECREF(pid);
3593 return -1;
3594 }
3595 }
3596 else {
3597 ARG_TUP(self, pid);
3598 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003599 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600 NULL);
3601 FREE_ARG_TUP(self);
3602 }
3603 }
3604
3605 if (! pid) return -1;
3606
3607 PDATA_PUSH(self->stack, pid, -1);
3608 return 0;
3609 }
3610 else {
3611 PyErr_SetString(UnpicklingError,
3612 "A load persistent id instruction was encountered,\n"
3613 "but no persistent_load function was specified.");
3614 return -1;
3615 }
3616}
3617
3618static int
Tim Peterscba30e22003-02-01 06:24:36 +00003619load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620{
3621 PyObject *pid = 0;
3622
3623 if (self->pers_func) {
3624 PDATA_POP(self->stack, pid);
3625 if (! pid) return -1;
3626
3627 if (PyList_Check(self->pers_func)) {
3628 if (PyList_Append(self->pers_func, pid) < 0) {
3629 Py_DECREF(pid);
3630 return -1;
3631 }
3632 }
3633 else {
3634 ARG_TUP(self, pid);
3635 if (self->arg) {
3636 pid = PyObject_Call(self->pers_func, self->arg,
3637 NULL);
3638 FREE_ARG_TUP(self);
3639 }
3640 if (! pid) return -1;
3641 }
3642
3643 PDATA_PUSH(self->stack, pid, -1);
3644 return 0;
3645 }
3646 else {
3647 PyErr_SetString(UnpicklingError,
3648 "A load persistent id instruction was encountered,\n"
3649 "but no persistent_load function was specified.");
3650 return -1;
3651 }
3652}
3653
3654
3655static int
Tim Peterscba30e22003-02-01 06:24:36 +00003656load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657{
3658 int len;
3659
3660 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3661
3662 /* Note that we split the (pickle.py) stack into two stacks,
3663 an object stack and a mark stack. We have to be clever and
3664 pop the right one. We do this by looking at the top of the
3665 mark stack.
3666 */
3667
3668 if ((self->num_marks > 0) &&
3669 (self->marks[self->num_marks - 1] == len))
3670 self->num_marks--;
3671 else {
3672 len--;
3673 Py_DECREF(self->stack->data[len]);
3674 self->stack->length=len;
3675 }
3676
3677 return 0;
3678}
3679
3680
3681static int
Tim Peterscba30e22003-02-01 06:24:36 +00003682load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683{
3684 int i;
3685
3686 if ((i = marker(self)) < 0)
3687 return -1;
3688
3689 Pdata_clear(self->stack, i);
3690
3691 return 0;
3692}
3693
3694
3695static int
Tim Peterscba30e22003-02-01 06:24:36 +00003696load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697{
3698 PyObject *last;
3699 int len;
3700
3701 if ((len = self->stack->length) <= 0) return stackUnderflow();
3702 last=self->stack->data[len-1];
3703 Py_INCREF(last);
3704 PDATA_PUSH(self->stack, last, -1);
3705 return 0;
3706}
3707
3708
3709static int
Tim Peterscba30e22003-02-01 06:24:36 +00003710load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711{
3712 PyObject *py_str = 0, *value = 0;
3713 int len;
3714 char *s;
3715 int rc;
3716
Tim Peters0bc93f52003-02-02 18:29:33 +00003717 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003718 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 value = PyDict_GetItem(self->memo, py_str);
3723 if (! value) {
3724 PyErr_SetObject(BadPickleGet, py_str);
3725 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003726 }
3727 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 PDATA_APPEND(self->stack, value, -1);
3729 rc = 0;
3730 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732 Py_DECREF(py_str);
3733 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734}
3735
3736
3737static int
Tim Peterscba30e22003-02-01 06:24:36 +00003738load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739{
3740 PyObject *py_key = 0, *value = 0;
3741 unsigned char key;
3742 char *s;
3743 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Tim Peters0bc93f52003-02-02 18:29:33 +00003745 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 key = (unsigned char)s[0];
3748 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750 value = PyDict_GetItem(self->memo, py_key);
3751 if (! value) {
3752 PyErr_SetObject(BadPickleGet, py_key);
3753 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003754 }
3755 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 PDATA_APPEND(self->stack, value, -1);
3757 rc = 0;
3758 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 Py_DECREF(py_key);
3761 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003762}
3763
3764
3765static int
Tim Peterscba30e22003-02-01 06:24:36 +00003766load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767{
3768 PyObject *py_key = 0, *value = 0;
3769 unsigned char c;
3770 char *s;
3771 long key;
3772 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Tim Peters0bc93f52003-02-02 18:29:33 +00003774 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003776 c = (unsigned char)s[0];
3777 key = (long)c;
3778 c = (unsigned char)s[1];
3779 key |= (long)c << 8;
3780 c = (unsigned char)s[2];
3781 key |= (long)c << 16;
3782 c = (unsigned char)s[3];
3783 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3786
3787 value = PyDict_GetItem(self->memo, py_key);
3788 if (! value) {
3789 PyErr_SetObject(BadPickleGet, py_key);
3790 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003791 }
3792 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 PDATA_APPEND(self->stack, value, -1);
3794 rc = 0;
3795 }
3796
3797 Py_DECREF(py_key);
3798 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799}
3800
Tim Peters2d629652003-02-04 05:06:17 +00003801/* Push an object from the extension registry (EXT[124]). nbytes is
3802 * the number of bytes following the opcode, holding the index (code) value.
3803 */
3804static int
3805load_extension(Unpicklerobject *self, int nbytes)
3806{
3807 char *codebytes; /* the nbytes bytes after the opcode */
3808 long code; /* calc_binint returns long */
3809 PyObject *py_code; /* code as a Python int */
3810 PyObject *obj; /* the object to push */
3811 PyObject *pair; /* (module_name, class_name) */
3812 PyObject *module_name, *class_name;
3813
3814 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3815 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3816 code = calc_binint(codebytes, nbytes);
3817 if (code <= 0) { /* note that 0 is forbidden */
3818 /* Corrupt or hostile pickle. */
3819 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3820 return -1;
3821 }
3822
3823 /* Look for the code in the cache. */
3824 py_code = PyInt_FromLong(code);
3825 if (py_code == NULL) return -1;
3826 obj = PyDict_GetItem(extension_cache, py_code);
3827 if (obj != NULL) {
3828 /* Bingo. */
3829 Py_DECREF(py_code);
3830 PDATA_APPEND(self->stack, obj, -1);
3831 return 0;
3832 }
3833
3834 /* Look up the (module_name, class_name) pair. */
3835 pair = PyDict_GetItem(inverted_registry, py_code);
3836 if (pair == NULL) {
3837 Py_DECREF(py_code);
3838 PyErr_Format(PyExc_ValueError, "unregistered extension "
3839 "code %ld", code);
3840 return -1;
3841 }
3842 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003843 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003844 */
3845 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3846 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3847 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3848 Py_DECREF(py_code);
3849 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3850 "isn't a 2-tuple of strings", code);
3851 return -1;
3852 }
3853 /* Load the object. */
3854 obj = find_class(module_name, class_name, self->find_class);
3855 if (obj == NULL) {
3856 Py_DECREF(py_code);
3857 return -1;
3858 }
3859 /* Cache code -> obj. */
3860 code = PyDict_SetItem(extension_cache, py_code, obj);
3861 Py_DECREF(py_code);
3862 if (code < 0) {
3863 Py_DECREF(obj);
3864 return -1;
3865 }
3866 PDATA_PUSH(self->stack, obj, -1);
3867 return 0;
3868}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869
3870static int
Tim Peterscba30e22003-02-01 06:24:36 +00003871load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872{
3873 PyObject *py_str = 0, *value = 0;
3874 int len, l;
3875 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Tim Peters0bc93f52003-02-02 18:29:33 +00003877 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003878 if (l < 2) return bad_readline();
3879 if (!( len=self->stack->length )) return stackUnderflow();
3880 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3881 value=self->stack->data[len-1];
3882 l=PyDict_SetItem(self->memo, py_str, value);
3883 Py_DECREF(py_str);
3884 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003885}
3886
3887
3888static int
Tim Peterscba30e22003-02-01 06:24:36 +00003889load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890{
3891 PyObject *py_key = 0, *value = 0;
3892 unsigned char key;
3893 char *s;
3894 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003895
Tim Peters0bc93f52003-02-02 18:29:33 +00003896 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003899 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3902 value=self->stack->data[len-1];
3903 len=PyDict_SetItem(self->memo, py_key, value);
3904 Py_DECREF(py_key);
3905 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003906}
3907
3908
3909static int
Tim Peterscba30e22003-02-01 06:24:36 +00003910load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911{
3912 PyObject *py_key = 0, *value = 0;
3913 long key;
3914 unsigned char c;
3915 char *s;
3916 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003917
Tim Peters0bc93f52003-02-02 18:29:33 +00003918 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 c = (unsigned char)s[0];
3922 key = (long)c;
3923 c = (unsigned char)s[1];
3924 key |= (long)c << 8;
3925 c = (unsigned char)s[2];
3926 key |= (long)c << 16;
3927 c = (unsigned char)s[3];
3928 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 if (!( py_key = PyInt_FromLong(key))) return -1;
3931 value=self->stack->data[len-1];
3932 len=PyDict_SetItem(self->memo, py_key, value);
3933 Py_DECREF(py_key);
3934 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003935}
3936
3937
3938static int
Tim Peterscba30e22003-02-01 06:24:36 +00003939do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940{
3941 PyObject *value = 0, *list = 0, *append_method = 0;
3942 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 len=self->stack->length;
3945 if (!( len >= x && x > 0 )) return stackUnderflow();
3946 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003947 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 if (PyList_Check(list)) {
3952 PyObject *slice;
3953 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003956 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 list_len = PyList_GET_SIZE(list);
3958 i=PyList_SetSlice(list, list_len, list_len, slice);
3959 Py_DECREF(slice);
3960 return i;
3961 }
3962 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Tim Peterscba30e22003-02-01 06:24:36 +00003964 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 return -1;
3966
3967 for (i = x; i < len; i++) {
3968 PyObject *junk;
3969
3970 value=self->stack->data[i];
3971 junk=0;
3972 ARG_TUP(self, value);
3973 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003974 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 NULL);
3976 FREE_ARG_TUP(self);
3977 }
3978 if (! junk) {
3979 Pdata_clear(self->stack, i+1);
3980 self->stack->length=x;
3981 Py_DECREF(append_method);
3982 return -1;
3983 }
3984 Py_DECREF(junk);
3985 }
3986 self->stack->length=x;
3987 Py_DECREF(append_method);
3988 }
3989
3990 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003991}
3992
3993
3994static int
Tim Peterscba30e22003-02-01 06:24:36 +00003995load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996{
3997 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003998}
3999
4000
4001static int
Tim Peterscba30e22003-02-01 06:24:36 +00004002load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003{
4004 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004005}
4006
4007
4008static int
Tim Peterscba30e22003-02-01 06:24:36 +00004009do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010{
4011 PyObject *value = 0, *key = 0, *dict = 0;
4012 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 if (!( (len=self->stack->length) >= x
4015 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 for (i = x+1; i < len; i += 2) {
4020 key =self->stack->data[i-1];
4021 value=self->stack->data[i ];
4022 if (PyObject_SetItem(dict, key, value) < 0) {
4023 r=-1;
4024 break;
4025 }
4026 }
4027
4028 Pdata_clear(self->stack, x);
4029
4030 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004031}
4032
4033
Tim Peters84e87f32001-03-17 04:50:51 +00004034static int
Tim Peterscba30e22003-02-01 06:24:36 +00004035load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004036{
4037 return do_setitems(self, self->stack->length - 2);
4038}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004040static int
Tim Peterscba30e22003-02-01 06:24:36 +00004041load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042{
4043 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004044}
4045
Tim Peters84e87f32001-03-17 04:50:51 +00004046
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047static int
Tim Peterscba30e22003-02-01 06:24:36 +00004048load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049{
Tim Peters080c88b2003-02-15 03:01:11 +00004050 PyObject *state, *inst, *slotstate;
4051 PyObject *__setstate__;
4052 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004053 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004054 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055
Tim Peters080c88b2003-02-15 03:01:11 +00004056 /* Stack is ... instance, state. We want to leave instance at
4057 * the stack top, possibly mutated via instance.__setstate__(state).
4058 */
4059 if (self->stack->length < 2)
4060 return stackUnderflow();
4061 PDATA_POP(self->stack, state);
4062 if (state == NULL)
4063 return -1;
4064 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065
Tim Peters080c88b2003-02-15 03:01:11 +00004066 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4067 if (__setstate__ != NULL) {
4068 PyObject *junk = NULL;
4069
4070 /* The explicit __setstate__ is responsible for everything. */
4071 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 if (self->arg) {
4073 junk = PyObject_Call(__setstate__, self->arg, NULL);
4074 FREE_ARG_TUP(self);
4075 }
4076 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004077 if (junk == NULL)
4078 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079 Py_DECREF(junk);
4080 return 0;
4081 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004082 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4083 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004085
4086 /* A default __setstate__. First see whether state embeds a
4087 * slot state dict too (a proto 2 addition).
4088 */
4089 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4090 PyObject *temp = state;
4091 state = PyTuple_GET_ITEM(temp, 0);
4092 slotstate = PyTuple_GET_ITEM(temp, 1);
4093 Py_INCREF(state);
4094 Py_INCREF(slotstate);
4095 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096 }
Tim Peters080c88b2003-02-15 03:01:11 +00004097 else
4098 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099
Tim Peters080c88b2003-02-15 03:01:11 +00004100 /* Set inst.__dict__ from the state dict (if any). */
4101 if (state != Py_None) {
4102 PyObject *dict;
4103 if (! PyDict_Check(state)) {
4104 PyErr_SetString(UnpicklingError, "state is not a "
4105 "dictionary");
4106 goto finally;
4107 }
4108 dict = PyObject_GetAttr(inst, __dict___str);
4109 if (dict == NULL)
4110 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004111
Tim Peters080c88b2003-02-15 03:01:11 +00004112 i = 0;
4113 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4114 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4115 goto finally;
4116 }
4117 Py_DECREF(dict);
4118 }
4119
4120 /* Also set instance attributes from the slotstate dict (if any). */
4121 if (slotstate != NULL) {
4122 if (! PyDict_Check(slotstate)) {
4123 PyErr_SetString(UnpicklingError, "slot state is not "
4124 "a dictionary");
4125 goto finally;
4126 }
4127 i = 0;
4128 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4129 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4130 goto finally;
4131 }
4132 }
4133 res = 0;
4134
4135 finally:
4136 Py_DECREF(state);
4137 Py_XDECREF(slotstate);
4138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139}
4140
4141
4142static int
Tim Peterscba30e22003-02-01 06:24:36 +00004143load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144{
4145 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 /* Note that we split the (pickle.py) stack into two stacks, an
4148 object stack and a mark stack. Here we push a mark onto the
4149 mark stack.
4150 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 if ((self->num_marks + 1) >= self->marks_size) {
4153 s=self->marks_size+20;
4154 if (s <= self->num_marks) s=self->num_marks + 1;
4155 if (self->marks == NULL)
4156 self->marks=(int *)malloc(s * sizeof(int));
4157 else
Tim Peterscba30e22003-02-01 06:24:36 +00004158 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 s * sizeof(int));
4160 if (! self->marks) {
4161 PyErr_NoMemory();
4162 return -1;
4163 }
4164 self->marks_size = s;
4165 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004170}
4171
Guido van Rossum60456fd1997-04-09 17:36:32 +00004172static int
Tim Peterscba30e22003-02-01 06:24:36 +00004173load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174{
4175 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 PDATA_POP(self->stack, arg_tup);
4178 if (! arg_tup) return -1;
4179 PDATA_POP(self->stack, callable);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 PDATA_PUSH(self->stack, ob, -1);
4185 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004186}
Tim Peters84e87f32001-03-17 04:50:51 +00004187
Tim Peters4190fb82003-02-02 16:09:05 +00004188/* Just raises an error if we don't know the protocol specified. PROTO
4189 * is the first opcode for protocols >= 2.
4190 */
4191static int
4192load_proto(Unpicklerobject *self)
4193{
4194 int i;
4195 char *protobyte;
4196
4197 i = self->read_func(self, &protobyte, 1);
4198 if (i < 0)
4199 return -1;
4200
4201 i = calc_binint(protobyte, 1);
4202 /* No point checking for < 0, since calc_binint returns an unsigned
4203 * int when chewing on 1 byte.
4204 */
4205 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004206 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004207 return 0;
4208
4209 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4210 return -1;
4211}
4212
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004214load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215{
4216 PyObject *err = 0, *val = 0;
4217 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 self->num_marks = 0;
4220 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004223 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 switch (s[0]) {
4227 case NONE:
4228 if (load_none(self) < 0)
4229 break;
4230 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 case BININT:
4233 if (load_binint(self) < 0)
4234 break;
4235 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case BININT1:
4238 if (load_binint1(self) < 0)
4239 break;
4240 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case BININT2:
4243 if (load_binint2(self) < 0)
4244 break;
4245 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case INT:
4248 if (load_int(self) < 0)
4249 break;
4250 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 case LONG:
4253 if (load_long(self) < 0)
4254 break;
4255 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256
Tim Petersee1a53c2003-02-02 02:57:53 +00004257 case LONG1:
4258 if (load_counted_long(self, 1) < 0)
4259 break;
4260 continue;
4261
4262 case LONG4:
4263 if (load_counted_long(self, 4) < 0)
4264 break;
4265 continue;
4266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 case FLOAT:
4268 if (load_float(self) < 0)
4269 break;
4270 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 case BINFLOAT:
4273 if (load_binfloat(self) < 0)
4274 break;
4275 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 case BINSTRING:
4278 if (load_binstring(self) < 0)
4279 break;
4280 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 case SHORT_BINSTRING:
4283 if (load_short_binstring(self) < 0)
4284 break;
4285 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 case STRING:
4288 if (load_string(self) < 0)
4289 break;
4290 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004291
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004292#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 case UNICODE:
4294 if (load_unicode(self) < 0)
4295 break;
4296 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298 case BINUNICODE:
4299 if (load_binunicode(self) < 0)
4300 break;
4301 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004302#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004305 if (load_counted_tuple(self, 0) < 0)
4306 break;
4307 continue;
4308
4309 case TUPLE1:
4310 if (load_counted_tuple(self, 1) < 0)
4311 break;
4312 continue;
4313
4314 case TUPLE2:
4315 if (load_counted_tuple(self, 2) < 0)
4316 break;
4317 continue;
4318
4319 case TUPLE3:
4320 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 break;
4322 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 case TUPLE:
4325 if (load_tuple(self) < 0)
4326 break;
4327 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 case EMPTY_LIST:
4330 if (load_empty_list(self) < 0)
4331 break;
4332 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 case LIST:
4335 if (load_list(self) < 0)
4336 break;
4337 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 case EMPTY_DICT:
4340 if (load_empty_dict(self) < 0)
4341 break;
4342 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004344 case DICT:
4345 if (load_dict(self) < 0)
4346 break;
4347 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004349 case OBJ:
4350 if (load_obj(self) < 0)
4351 break;
4352 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004354 case INST:
4355 if (load_inst(self) < 0)
4356 break;
4357 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358
Tim Peterseab7db32003-02-13 18:24:14 +00004359 case NEWOBJ:
4360 if (load_newobj(self) < 0)
4361 break;
4362 continue;
4363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 case GLOBAL:
4365 if (load_global(self) < 0)
4366 break;
4367 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 case APPEND:
4370 if (load_append(self) < 0)
4371 break;
4372 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 case APPENDS:
4375 if (load_appends(self) < 0)
4376 break;
4377 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 case BUILD:
4380 if (load_build(self) < 0)
4381 break;
4382 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 case DUP:
4385 if (load_dup(self) < 0)
4386 break;
4387 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389 case BINGET:
4390 if (load_binget(self) < 0)
4391 break;
4392 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 case LONG_BINGET:
4395 if (load_long_binget(self) < 0)
4396 break;
4397 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004399 case GET:
4400 if (load_get(self) < 0)
4401 break;
4402 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004403
Tim Peters2d629652003-02-04 05:06:17 +00004404 case EXT1:
4405 if (load_extension(self, 1) < 0)
4406 break;
4407 continue;
4408
4409 case EXT2:
4410 if (load_extension(self, 2) < 0)
4411 break;
4412 continue;
4413
4414 case EXT4:
4415 if (load_extension(self, 4) < 0)
4416 break;
4417 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 case MARK:
4419 if (load_mark(self) < 0)
4420 break;
4421 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 case BINPUT:
4424 if (load_binput(self) < 0)
4425 break;
4426 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 case LONG_BINPUT:
4429 if (load_long_binput(self) < 0)
4430 break;
4431 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 case PUT:
4434 if (load_put(self) < 0)
4435 break;
4436 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 case POP:
4439 if (load_pop(self) < 0)
4440 break;
4441 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 case POP_MARK:
4444 if (load_pop_mark(self) < 0)
4445 break;
4446 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 case SETITEM:
4449 if (load_setitem(self) < 0)
4450 break;
4451 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 case SETITEMS:
4454 if (load_setitems(self) < 0)
4455 break;
4456 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 case STOP:
4459 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 case PERSID:
4462 if (load_persid(self) < 0)
4463 break;
4464 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 case BINPERSID:
4467 if (load_binpersid(self) < 0)
4468 break;
4469 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 case REDUCE:
4472 if (load_reduce(self) < 0)
4473 break;
4474 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475
Tim Peters4190fb82003-02-02 16:09:05 +00004476 case PROTO:
4477 if (load_proto(self) < 0)
4478 break;
4479 continue;
4480
Tim Peters3c67d792003-02-02 17:59:11 +00004481 case NEWTRUE:
4482 if (load_bool(self, Py_True) < 0)
4483 break;
4484 continue;
4485
4486 case NEWFALSE:
4487 if (load_bool(self, Py_False) < 0)
4488 break;
4489 continue;
4490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 case '\0':
4492 /* end of file */
4493 PyErr_SetNone(PyExc_EOFError);
4494 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004497 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004498 "invalid load key, '%s'.",
4499 "c", s[0]);
4500 return NULL;
4501 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 break;
4504 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 if ((err = PyErr_Occurred())) {
4507 if (err == PyExc_EOFError) {
4508 PyErr_SetNone(PyExc_EOFError);
4509 }
4510 return NULL;
4511 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 PDATA_POP(self->stack, val);
4514 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515}
Tim Peters84e87f32001-03-17 04:50:51 +00004516
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004518/* No-load functions to support noload, which is used to
4519 find persistent references. */
4520
4521static int
Tim Peterscba30e22003-02-01 06:24:36 +00004522noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523{
4524 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 if ((i = marker(self)) < 0) return -1;
4527 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004528}
4529
4530
4531static int
Tim Peterscba30e22003-02-01 06:24:36 +00004532noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533{
4534 int i;
4535 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 if ((i = marker(self)) < 0) return -1;
4538 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004539 if (self->readline_func(self, &s) < 0) return -1;
4540 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004541 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004543}
4544
4545static int
Tim Peterseab7db32003-02-13 18:24:14 +00004546noload_newobj(Unpicklerobject *self)
4547{
4548 PyObject *obj;
4549
4550 PDATA_POP(self->stack, obj); /* pop argtuple */
4551 if (obj == NULL) return -1;
4552 Py_DECREF(obj);
4553
4554 PDATA_POP(self->stack, obj); /* pop cls */
4555 if (obj == NULL) return -1;
4556 Py_DECREF(obj);
4557
4558 PDATA_APPEND(self->stack, Py_None, -1);
4559 return 0;
4560}
4561
4562static int
Tim Peterscba30e22003-02-01 06:24:36 +00004563noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564{
4565 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004566
Tim Peters0bc93f52003-02-02 18:29:33 +00004567 if (self->readline_func(self, &s) < 0) return -1;
4568 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 PDATA_APPEND(self->stack, Py_None,-1);
4570 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004571}
4572
4573static int
Tim Peterscba30e22003-02-01 06:24:36 +00004574noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 if (self->stack->length < 2) return stackUnderflow();
4578 Pdata_clear(self->stack, self->stack->length-2);
4579 PDATA_APPEND(self->stack, Py_None,-1);
4580 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004581}
4582
4583static int
4584noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004585
Guido van Rossum053b8df1998-11-25 16:18:00 +00004586 if (self->stack->length < 1) return stackUnderflow();
4587 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004588 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004589}
4590
Tim Peters2d629652003-02-04 05:06:17 +00004591static int
4592noload_extension(Unpicklerobject *self, int nbytes)
4593{
4594 char *codebytes;
4595
4596 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4597 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4598 PDATA_APPEND(self->stack, Py_None, -1);
4599 return 0;
4600}
4601
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004602
4603static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004604noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605{
4606 PyObject *err = 0, *val = 0;
4607 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 self->num_marks = 0;
4610 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004613 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 switch (s[0]) {
4617 case NONE:
4618 if (load_none(self) < 0)
4619 break;
4620 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 case BININT:
4623 if (load_binint(self) < 0)
4624 break;
4625 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 case BININT1:
4628 if (load_binint1(self) < 0)
4629 break;
4630 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 case BININT2:
4633 if (load_binint2(self) < 0)
4634 break;
4635 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 case INT:
4638 if (load_int(self) < 0)
4639 break;
4640 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 case LONG:
4643 if (load_long(self) < 0)
4644 break;
4645 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004646
Tim Peters4190fb82003-02-02 16:09:05 +00004647 case LONG1:
4648 if (load_counted_long(self, 1) < 0)
4649 break;
4650 continue;
4651
4652 case LONG4:
4653 if (load_counted_long(self, 4) < 0)
4654 break;
4655 continue;
4656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004657 case FLOAT:
4658 if (load_float(self) < 0)
4659 break;
4660 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662 case BINFLOAT:
4663 if (load_binfloat(self) < 0)
4664 break;
4665 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 case BINSTRING:
4668 if (load_binstring(self) < 0)
4669 break;
4670 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 case SHORT_BINSTRING:
4673 if (load_short_binstring(self) < 0)
4674 break;
4675 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 case STRING:
4678 if (load_string(self) < 0)
4679 break;
4680 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004681
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004682#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 case UNICODE:
4684 if (load_unicode(self) < 0)
4685 break;
4686 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 case BINUNICODE:
4689 if (load_binunicode(self) < 0)
4690 break;
4691 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004692#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004695 if (load_counted_tuple(self, 0) < 0)
4696 break;
4697 continue;
4698
4699 case TUPLE1:
4700 if (load_counted_tuple(self, 1) < 0)
4701 break;
4702 continue;
4703
4704 case TUPLE2:
4705 if (load_counted_tuple(self, 2) < 0)
4706 break;
4707 continue;
4708
4709 case TUPLE3:
4710 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 break;
4712 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 case TUPLE:
4715 if (load_tuple(self) < 0)
4716 break;
4717 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 case EMPTY_LIST:
4720 if (load_empty_list(self) < 0)
4721 break;
4722 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 case LIST:
4725 if (load_list(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_DICT:
4730 if (load_empty_dict(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 DICT:
4735 if (load_dict(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 OBJ:
4740 if (noload_obj(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 INST:
4745 if (noload_inst(self) < 0)
4746 break;
4747 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Tim Peterseab7db32003-02-13 18:24:14 +00004749 case NEWOBJ:
4750 if (noload_newobj(self) < 0)
4751 break;
4752 continue;
4753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 case GLOBAL:
4755 if (noload_global(self) < 0)
4756 break;
4757 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 case APPEND:
4760 if (load_append(self) < 0)
4761 break;
4762 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 case APPENDS:
4765 if (load_appends(self) < 0)
4766 break;
4767 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case BUILD:
4770 if (noload_build(self) < 0)
4771 break;
4772 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 case DUP:
4775 if (load_dup(self) < 0)
4776 break;
4777 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 case BINGET:
4780 if (load_binget(self) < 0)
4781 break;
4782 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case LONG_BINGET:
4785 if (load_long_binget(self) < 0)
4786 break;
4787 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case GET:
4790 if (load_get(self) < 0)
4791 break;
4792 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004793
Tim Peters2d629652003-02-04 05:06:17 +00004794 case EXT1:
4795 if (noload_extension(self, 1) < 0)
4796 break;
4797 continue;
4798
4799 case EXT2:
4800 if (noload_extension(self, 2) < 0)
4801 break;
4802 continue;
4803
4804 case EXT4:
4805 if (noload_extension(self, 4) < 0)
4806 break;
4807 continue;
4808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case MARK:
4810 if (load_mark(self) < 0)
4811 break;
4812 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case BINPUT:
4815 if (load_binput(self) < 0)
4816 break;
4817 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case LONG_BINPUT:
4820 if (load_long_binput(self) < 0)
4821 break;
4822 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case PUT:
4825 if (load_put(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 POP:
4830 if (load_pop(self) < 0)
4831 break;
4832 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case POP_MARK:
4835 if (load_pop_mark(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 SETITEM:
4840 if (load_setitem(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 SETITEMS:
4845 if (load_setitems(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 STOP:
4850 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 case PERSID:
4853 if (load_persid(self) < 0)
4854 break;
4855 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004857 case BINPERSID:
4858 if (load_binpersid(self) < 0)
4859 break;
4860 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case REDUCE:
4863 if (noload_reduce(self) < 0)
4864 break;
4865 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004866
Tim Peters4190fb82003-02-02 16:09:05 +00004867 case PROTO:
4868 if (load_proto(self) < 0)
4869 break;
4870 continue;
4871
Tim Peters3c67d792003-02-02 17:59:11 +00004872 case NEWTRUE:
4873 if (load_bool(self, Py_True) < 0)
4874 break;
4875 continue;
4876
4877 case NEWFALSE:
4878 if (load_bool(self, Py_False) < 0)
4879 break;
4880 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004881 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004882 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 "invalid load key, '%s'.",
4884 "c", s[0]);
4885 return NULL;
4886 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 break;
4889 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004891 if ((err = PyErr_Occurred())) {
4892 if (err == PyExc_EOFError) {
4893 PyErr_SetNone(PyExc_EOFError);
4894 }
4895 return NULL;
4896 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 PDATA_POP(self->stack, val);
4899 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900}
Tim Peters84e87f32001-03-17 04:50:51 +00004901
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004902
Guido van Rossum60456fd1997-04-09 17:36:32 +00004903static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004904Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004905{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004907}
4908
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004909static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004910Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004913}
4914
Guido van Rossum60456fd1997-04-09 17:36:32 +00004915
4916static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004917 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004918 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004920 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004921 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004922 "noload() -- not load a pickle, but go through most of the motions\n"
4923 "\n"
4924 "This function can be used to read past a pickle without instantiating\n"
4925 "any objects or importing any modules. It can also be used to find all\n"
4926 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004927 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004928 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004929 {NULL, NULL} /* sentinel */
4930};
4931
4932
4933static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004934newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935{
4936 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004937
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004938 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 self->file = NULL;
4942 self->arg = NULL;
4943 self->stack = (Pdata*)Pdata_New();
4944 self->pers_func = NULL;
4945 self->last_string = NULL;
4946 self->marks = NULL;
4947 self->num_marks = 0;
4948 self->marks_size = 0;
4949 self->buf_size = 0;
4950 self->read = NULL;
4951 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004953
Tim Peterscba30e22003-02-01 06:24:36 +00004954 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004957 if (!self->stack)
4958 goto err;
4959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960 Py_INCREF(f);
4961 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 /* Set read, readline based on type of f */
4964 if (PyFile_Check(f)) {
4965 self->fp = PyFile_AsFile(f);
4966 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004967 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968 "I/O operation on closed file");
4969 goto err;
4970 }
4971 self->read_func = read_file;
4972 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004973 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004974 else if (PycStringIO_InputCheck(f)) {
4975 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 Rossum60456fd1997-04-09 17:36:32 +00005204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 finally:
5206 Py_XDECREF(pickler);
5207 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005209 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005210}
5211
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005212
Tim Peters5bd2a792003-02-01 16:45:06 +00005213/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005214static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005215cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005216{
5217 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005218 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005219
Tim Peterscba30e22003-02-01 06:24:36 +00005220 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005223 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 finally:
5226 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005229}
5230
5231
Tim Peters5bd2a792003-02-01 16:45:06 +00005232/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005233static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005234cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235{
5236 PyObject *ob, *file = 0, *res = NULL;
5237 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005238
Tim Peterscba30e22003-02-01 06:24:36 +00005239 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005240 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005241
Tim Peterscba30e22003-02-01 06:24:36 +00005242 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005244
Tim Peterscba30e22003-02-01 06:24:36 +00005245 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005246 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005250 finally:
5251 Py_XDECREF(file);
5252 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005255}
5256
5257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005258PyDoc_STRVAR(Unpicklertype__doc__,
5259"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005260
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005261static PyTypeObject Unpicklertype = {
5262 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005263 0, /*ob_size*/
5264 "cPickle.Unpickler", /*tp_name*/
5265 sizeof(Unpicklerobject), /*tp_basicsize*/
5266 0,
5267 (destructor)Unpickler_dealloc, /* tp_dealloc */
5268 0, /* tp_print */
5269 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5270 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5271 0, /* tp_compare */
5272 0, /* tp_repr */
5273 0, /* tp_as_number */
5274 0, /* tp_as_sequence */
5275 0, /* tp_as_mapping */
5276 0, /* tp_hash */
5277 0, /* tp_call */
5278 0, /* tp_str */
5279 0, /* tp_getattro */
5280 0, /* tp_setattro */
5281 0, /* tp_as_buffer */
5282 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5283 Unpicklertype__doc__, /* tp_doc */
5284 (traverseproc)Unpickler_traverse, /* tp_traverse */
5285 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005286};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005287
Guido van Rossum60456fd1997-04-09 17:36:32 +00005288static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005289 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5290 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005291 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005292 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005293 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005294 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005295
Martin v. Löwis544f1192004-07-27 05:22:33 +00005296 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5297 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005298 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005299 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005300 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005301 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005302
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005303 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005304 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005305
Neal Norwitzb0493252002-03-31 14:44:22 +00005306 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005307 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005308
Martin v. Löwis544f1192004-07-27 05:22:33 +00005309 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5310 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005311 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005312 "This takes a file-like object for writing a pickle data stream.\n"
5313 "The optional proto argument tells the pickler to use the given\n"
5314 "protocol; supported protocols are 0, 1, 2. The default\n"
5315 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5316 "only protocol that can be written to a file opened in text\n"
5317 "mode and read back successfully. When using a protocol higher\n"
5318 "than 0, make sure the file is opened in binary mode, both when\n"
5319 "pickling and unpickling.)\n"
5320 "\n"
5321 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5322 "more efficient than protocol 1.\n"
5323 "\n"
5324 "Specifying a negative protocol version selects the highest\n"
5325 "protocol version supported. The higher the protocol used, the\n"
5326 "more recent the version of Python needed to read the pickle\n"
5327 "produced.\n"
5328 "\n"
5329 "The file parameter must have a write() method that accepts a single\n"
5330 "string argument. It can thus be an open file object, a StringIO\n"
5331 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005332 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005333
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005334 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005335 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5336
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005337 { NULL, NULL }
5338};
5339
Guido van Rossum60456fd1997-04-09 17:36:32 +00005340static int
Tim Peterscba30e22003-02-01 06:24:36 +00005341init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005342{
5343 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005344
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005345#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005346
Tim Peters3cfe7542003-05-21 21:29:48 +00005347 if (PyType_Ready(&Unpicklertype) < 0)
5348 return -1;
5349 if (PyType_Ready(&Picklertype) < 0)
5350 return -1;
5351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005352 INIT_STR(__class__);
5353 INIT_STR(__getinitargs__);
5354 INIT_STR(__dict__);
5355 INIT_STR(__getstate__);
5356 INIT_STR(__setstate__);
5357 INIT_STR(__name__);
5358 INIT_STR(__main__);
5359 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005360 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005361 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005362 INIT_STR(append);
5363 INIT_STR(read);
5364 INIT_STR(readline);
5365 INIT_STR(copy_reg);
5366 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005367
Tim Peterscba30e22003-02-01 06:24:36 +00005368 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005369 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005370
Tim Peters1f1b2d22003-02-01 02:16:37 +00005371 /* This is special because we want to use a different
5372 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005374 if (!dispatch_table) return -1;
5375
5376 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005377 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005378 if (!extension_registry) return -1;
5379
5380 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005381 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005382 if (!inverted_registry) return -1;
5383
5384 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005385 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005386 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005388 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005389
Tim Peters731098b2003-02-04 20:56:09 +00005390 if (!(empty_tuple = PyTuple_New(0)))
5391 return -1;
5392
5393 two_tuple = PyTuple_New(2);
5394 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005396 /* We use this temp container with no regard to refcounts, or to
5397 * keeping containees alive. Exempt from GC, because we don't
5398 * want anything looking at two_tuple() by magic.
5399 */
5400 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402 /* Ugh */
5403 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5404 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5405 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005407 if (!( t=PyDict_New())) return -1;
5408 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005409 "def __str__(self):\n"
5410 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5411 Py_file_input,
5412 module_dict, t) )) return -1;
5413 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005415 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005416 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005419 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005420
Tim Peterscba30e22003-02-01 06:24:36 +00005421 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005423 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 if (!( t=PyDict_New())) return -1;
5427 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 "def __str__(self):\n"
5429 " a=self.args\n"
5430 " a=a and type(a[0]) or '(what)'\n"
5431 " return 'Cannot pickle %s objects' % a\n"
5432 , Py_file_input,
5433 module_dict, t) )) return -1;
5434 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005436 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005437 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005438 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005440 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005442 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005443 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005444 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005445
Martin v. Löwis658009a2002-09-16 17:26:24 +00005446 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5447 UnpicklingError, NULL)))
5448 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 if (PyDict_SetItemString(module_dict, "PickleError",
5451 PickleError) < 0)
5452 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454 if (PyDict_SetItemString(module_dict, "PicklingError",
5455 PicklingError) < 0)
5456 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5459 UnpicklingError) < 0)
5460 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005462 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5463 UnpickleableError) < 0)
5464 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005466 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5467 BadPickleGet) < 0)
5468 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005473}
5474
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005475#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5476#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005477#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005478PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005479initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480{
5481 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005482 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005483 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005484 PyObject *format_version;
5485 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005488 Unpicklertype.ob_type = &PyType_Type;
5489 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005491 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005492 * so we're forced to use a temporary dictionary. :(
5493 */
5494 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005495 if (!di) return;
5496 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 /* Create the module and add the functions */
5499 m = Py_InitModule4("cPickle", cPickle_methods,
5500 cPickle_module_documentation,
5501 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005502 if (m == NULL)
5503 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005505 /* Add some symbolic constants to the module */
5506 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005507 v = PyString_FromString(rev);
5508 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005509 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005511 /* Copy data from di. Waaa. */
5512 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5513 if (PyObject_SetItem(d, k, v) < 0) {
5514 Py_DECREF(di);
5515 return;
5516 }
5517 }
5518 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005519
Tim Peters8587b3c2003-02-13 15:44:41 +00005520 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5521 if (i < 0)
5522 return;
5523
Tim Peters5b7da392003-02-04 00:21:07 +00005524 /* These are purely informational; no code uses them. */
5525 /* File format version we write. */
5526 format_version = PyString_FromString("2.0");
5527 /* Format versions we can read. */
5528 compatible_formats = Py_BuildValue("[sssss]",
5529 "1.0", /* Original protocol 0 */
5530 "1.1", /* Protocol 0 + INST */
5531 "1.2", /* Original protocol 1 */
5532 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005533 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 PyDict_SetItemString(d, "format_version", format_version);
5535 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5536 Py_XDECREF(format_version);
5537 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005538}