blob: f0b3c8a5d68bafdd43e03306e3c568ff99c10721 [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_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 if (s == NULL) {
424 return 0;
425 }
Tim Peterscba30e22003-02-01 06:24:36 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
428 return -1;
429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000432}
433
Tim Peters84e87f32001-03-17 04:50:51 +0000434static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000435write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436{
437 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000438 if (n > INT_MAX) return -1;
439 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444{
445 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000447
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448 if (_n > INT_MAX)
449 return -1;
450 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451 if (s == NULL) {
452 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000453 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000455 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456 return -1;
457 }
458 else {
459 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
460 if (write_other(self, NULL, 0) < 0)
461 return -1;
462 }
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (n > WRITE_BUF_SIZE) {
465 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000466 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 return -1;
468 }
469 else {
470 memcpy(self->write_buf + self->buf_size, s, n);
471 self->buf_size += n;
472 return n;
473 }
474 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (self->write) {
477 /* object with write method */
478 ARG_TUP(self, py_str);
479 if (self->arg) {
480 junk = PyObject_Call(self->write, self->arg, NULL);
481 FREE_ARG_TUP(self);
482 }
483 if (junk) Py_DECREF(junk);
484 else return -1;
485 }
486 else
487 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 self->buf_size = 0;
490 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491}
492
493
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494static Py_ssize_t
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496{
497 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
500 PyErr_SetNone(PyExc_EOFError);
501 return -1;
502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000513 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
517 return -1;
518 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523}
524
525
Martin v. Löwis18e16552006-02-15 17:27:45 +0000526static Py_ssize_t
527read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528{
529 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000530
Martin v. Löwis18e16552006-02-15 17:27:45 +0000531 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 ARG_TUP(self, bytes);
534 if (self->arg) {
535 str = PyObject_Call(self->read, self->arg, NULL);
536 FREE_ARG_TUP(self);
537 }
538 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 Py_XDECREF(self->last_string);
541 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 if (! (*s = PyString_AsString(str))) return -1;
544 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545}
546
547
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000549readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550{
551 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 if ((str_size = PyString_Size(str)) < 0)
559 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 Py_XDECREF(self->last_string);
562 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 if (! (*s = PyString_AsString(str)))
565 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568}
569
Tim Petersee1a53c2003-02-02 02:57:53 +0000570/* Copy the first n bytes from s into newly malloc'ed memory, plus a
571 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
572 * The caller is responsible for free()'ing the return value.
573 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000575pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576{
Tim Petersee1a53c2003-02-02 02:57:53 +0000577 char *r = (char *)malloc(n+1);
578 if (r == NULL)
579 return (char*)PyErr_NoMemory();
580 memcpy(r, s, n);
581 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583}
584
585
586static int
Tim Peterscba30e22003-02-01 06:24:36 +0000587get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588{
589 PyObject *value, *mv;
590 long c_value;
591 char s[30];
592 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 if (!( mv = PyDict_GetItem(self->memo, id))) {
595 PyErr_SetObject(PyExc_KeyError, id);
596 return -1;
597 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Tim Peterscba30e22003-02-01 06:24:36 +0000599 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if (!( PyInt_Check(value))) {
603 PyErr_SetString(PicklingError, "no int where int expected in memo");
604 return -1;
605 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000606 c_value = PyInt_AsLong(value);
607 if (c_value == -1 && PyErr_Occurred())
608 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (!self->bin) {
611 s[0] = GET;
612 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
613 len = strlen(s);
614 }
615 else if (Pdata_Check(self->file)) {
616 if (write_other(self, NULL, 0) < 0) return -1;
617 PDATA_APPEND(self->file, mv, -1);
618 return 0;
619 }
620 else {
621 if (c_value < 256) {
622 s[0] = BINGET;
623 s[1] = (int)(c_value & 0xff);
624 len = 2;
625 }
626 else {
627 s[0] = LONG_BINGET;
628 s[1] = (int)(c_value & 0xff);
629 s[2] = (int)((c_value >> 8) & 0xff);
630 s[3] = (int)((c_value >> 16) & 0xff);
631 s[4] = (int)((c_value >> 24) & 0xff);
632 len = 5;
633 }
634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Tim Peters0bc93f52003-02-02 18:29:33 +0000636 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000638
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000639 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000641
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643static int
Tim Peterscba30e22003-02-01 06:24:36 +0000644put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645{
Tim Peterscba30e22003-02-01 06:24:36 +0000646 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 return put2(self, ob);
650}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000651
Guido van Rossum053b8df1998-11-25 16:18:00 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653static int
Tim Peterscba30e22003-02-01 06:24:36 +0000654put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655{
656 char c_str[30];
657 int p;
658 size_t len;
659 int res = -1;
660 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (self->fast)
663 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if ((p = PyDict_Size(self->memo)) < 0)
666 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000669 /* XXX Why?
670 * XXX And does "positive" really mean non-negative?
671 * XXX pickle.py starts with PUT index 0, not 1. This makes for
672 * XXX gratuitous differences between the pickling modules.
673 */
Tim Peterscba30e22003-02-01 06:24:36 +0000674 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Tim Peterscba30e22003-02-01 06:24:36 +0000676 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000678
Tim Peterscba30e22003-02-01 06:24:36 +0000679 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681
Tim Peterscba30e22003-02-01 06:24:36 +0000682 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685 PyTuple_SET_ITEM(t, 0, memo_len);
686 Py_INCREF(memo_len);
687 PyTuple_SET_ITEM(t, 1, ob);
688 Py_INCREF(ob);
689
690 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
691 goto finally;
692
693 if (!self->bin) {
694 c_str[0] = PUT;
695 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
696 len = strlen(c_str);
697 }
698 else if (Pdata_Check(self->file)) {
699 if (write_other(self, NULL, 0) < 0) return -1;
700 PDATA_APPEND(self->file, memo_len, -1);
701 res=0; /* Job well done ;) */
702 goto finally;
703 }
704 else {
705 if (p >= 256) {
706 c_str[0] = LONG_BINPUT;
707 c_str[1] = (int)(p & 0xff);
708 c_str[2] = (int)((p >> 8) & 0xff);
709 c_str[3] = (int)((p >> 16) & 0xff);
710 c_str[4] = (int)((p >> 24) & 0xff);
711 len = 5;
712 }
713 else {
714 c_str[0] = BINPUT;
715 c_str[1] = p;
716 len = 2;
717 }
718 }
719
Tim Peters0bc93f52003-02-02 18:29:33 +0000720 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 goto finally;
722
723 res = 0;
724
725 finally:
726 Py_XDECREF(py_ob_id);
727 Py_XDECREF(memo_len);
728 Py_XDECREF(t);
729
730 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000731}
732
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000733static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000734whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 PyObject *module = 0, *modules_dict = 0,
738 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000741 if (module)
742 return module;
743 if (PyErr_ExceptionMatches(PyExc_AttributeError))
744 PyErr_Clear();
745 else
746 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000747
Tim Peterscba30e22003-02-01 06:24:36 +0000748 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751 i = 0;
752 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 global_name_attr = PyObject_GetAttr(module, global_name);
757 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000758 if (PyErr_ExceptionMatches(PyExc_AttributeError))
759 PyErr_Clear();
760 else
761 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 continue;
763 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 if (global_name_attr != global) {
766 Py_DECREF(global_name_attr);
767 continue;
768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 break;
773 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 /* The following implements the rule in pickle.py added in 1.5
776 that used __main__ if no module is found. I don't actually
777 like this rule. jlf
778 */
779 if (!j) {
780 j=1;
781 name=__main___str;
782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 Py_INCREF(name);
785 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000786}
787
788
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000790fast_save_enter(Picklerobject *self, PyObject *obj)
791{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 /* if fast_container < 0, we're doing an error exit. */
793 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
794 PyObject *key = NULL;
795 if (self->fast_memo == NULL) {
796 self->fast_memo = PyDict_New();
797 if (self->fast_memo == NULL) {
798 self->fast_container = -1;
799 return 0;
800 }
801 }
802 key = PyLong_FromVoidPtr(obj);
803 if (key == NULL)
804 return 0;
805 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000806 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000808 "fast mode: can't pickle cyclic objects "
809 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 obj->ob_type->tp_name, obj);
811 self->fast_container = -1;
812 return 0;
813 }
814 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000815 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 self->fast_container = -1;
817 return 0;
818 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000819 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000820 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000822}
823
Tim Peterscba30e22003-02-01 06:24:36 +0000824int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000825fast_save_leave(Picklerobject *self, PyObject *obj)
826{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
828 PyObject *key = PyLong_FromVoidPtr(obj);
829 if (key == NULL)
830 return 0;
831 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000832 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 return 0;
834 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000835 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000836 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000838}
839
840static int
Tim Peterscba30e22003-02-01 06:24:36 +0000841save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842{
843 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000844 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848}
849
Guido van Rossum77f6a652002-04-03 22:41:51 +0000850static int
Tim Peterscba30e22003-02-01 06:24:36 +0000851save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000852{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000853 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000854 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000855 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000856
Tim Peters3c67d792003-02-02 17:59:11 +0000857 if (self->proto >= 2) {
858 char opcode = l ? NEWTRUE : NEWFALSE;
859 if (self->write_func(self, &opcode, 1) < 0)
860 return -1;
861 }
862 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000863 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000864 return 0;
865}
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Guido van Rossum60456fd1997-04-09 17:36:32 +0000867static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000868save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869{
870 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000874#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 || l > 0x7fffffffL
876 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000877#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 ) {
879 /* Text-mode pickle, or long too big to fit in the 4-byte
880 * signed BININT format: store as a string.
881 */
882 c_str[0] = INT;
883 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000884 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 return -1;
886 }
887 else {
888 /* Binary pickle and l fits in a signed 4-byte int. */
889 c_str[1] = (int)( l & 0xff);
890 c_str[2] = (int)((l >> 8) & 0xff);
891 c_str[3] = (int)((l >> 16) & 0xff);
892 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 if ((c_str[4] == 0) && (c_str[3] == 0)) {
895 if (c_str[2] == 0) {
896 c_str[0] = BININT1;
897 len = 2;
898 }
899 else {
900 c_str[0] = BININT2;
901 len = 3;
902 }
903 }
904 else {
905 c_str[0] = BININT;
906 len = 5;
907 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Tim Peters0bc93f52003-02-02 18:29:33 +0000909 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return -1;
911 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914}
915
916
917static int
Tim Peterscba30e22003-02-01 06:24:36 +0000918save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +0000921 int res = -1;
922 PyObject *repr = NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000923 long val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925
Guido van Rossumddefaf32007-01-14 03:31:43 +0000926 if (val == -1 && PyErr_Occurred()) {
927 /* out of range for int pickling */
928 PyErr_Clear();
929 }
930 else
931 return save_int(self, val);
932
Tim Petersee1a53c2003-02-02 02:57:53 +0000933 if (self->proto >= 2) {
934 /* Linear-time pickling. */
935 size_t nbits;
936 size_t nbytes;
937 unsigned char *pdata;
938 char c_str[5];
939 int i;
940 int sign = _PyLong_Sign(args);
941
942 if (sign == 0) {
943 /* It's 0 -- an empty bytestring. */
944 c_str[0] = LONG1;
945 c_str[1] = 0;
946 i = self->write_func(self, c_str, 2);
947 if (i < 0) goto finally;
948 res = 0;
949 goto finally;
950 }
951 nbits = _PyLong_NumBits(args);
952 if (nbits == (size_t)-1 && PyErr_Occurred())
953 goto finally;
954 /* How many bytes do we need? There are nbits >> 3 full
955 * bytes of data, and nbits & 7 leftover bits. If there
956 * are any leftover bits, then we clearly need another
957 * byte. Wnat's not so obvious is that we *probably*
958 * need another byte even if there aren't any leftovers:
959 * the most-significant bit of the most-significant byte
960 * acts like a sign bit, and it's usually got a sense
961 * opposite of the one we need. The exception is longs
962 * of the form -(2**(8*j-1)) for j > 0. Such a long is
963 * its own 256's-complement, so has the right sign bit
964 * even without the extra byte. That's a pain to check
965 * for in advance, though, so we always grab an extra
966 * byte at the start, and cut it back later if possible.
967 */
968 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000970 PyErr_SetString(PyExc_OverflowError, "long too large "
971 "to pickle");
972 goto finally;
973 }
974 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
975 if (repr == NULL) goto finally;
976 pdata = (unsigned char *)PyString_AS_STRING(repr);
977 i = _PyLong_AsByteArray((PyLongObject *)args,
978 pdata, nbytes,
979 1 /* little endian */, 1 /* signed */);
980 if (i < 0) goto finally;
981 /* If the long is negative, this may be a byte more than
982 * needed. This is so iff the MSB is all redundant sign
983 * bits.
984 */
985 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
986 (pdata[nbytes - 2] & 0x80) != 0)
987 --nbytes;
988
989 if (nbytes < 256) {
990 c_str[0] = LONG1;
991 c_str[1] = (char)nbytes;
992 size = 2;
993 }
994 else {
995 c_str[0] = LONG4;
996 size = (int)nbytes;
997 for (i = 1; i < 5; i++) {
998 c_str[i] = (char)(size & 0xff);
999 size >>= 8;
1000 }
1001 size = 5;
1002 }
1003 i = self->write_func(self, c_str, size);
1004 if (i < 0) goto finally;
1005 i = self->write_func(self, (char *)pdata, (int)nbytes);
1006 if (i < 0) goto finally;
1007 res = 0;
1008 goto finally;
1009 }
1010
1011 /* proto < 2: write the repr and newline. This is quadratic-time
1012 * (in the number of digits), in both directions.
1013 */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001014 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((size = PyString_Size(repr)) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Tim Peters0bc93f52003-02-02 18:29:33 +00001023 if (self->write_func(self,
1024 PyString_AS_STRING((PyStringObject *)repr),
1025 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Tim Peters0bc93f52003-02-02 18:29:33 +00001028 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 finally:
1034 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036}
1037
1038
1039static int
Tim Peterscba30e22003-02-01 06:24:36 +00001040save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041{
1042 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001046 str[0] = BINFLOAT;
1047 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001049 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 return -1;
1051 }
1052 else {
1053 char c_str[250];
1054 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1056 /* Extend the formatted string with a newline character */
1057 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Tim Peters0bc93f52003-02-02 18:29:33 +00001059 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 return -1;
1061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064}
1065
1066
1067static int
Tim Peterscba30e22003-02-01 06:24:36 +00001068save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069{
1070 int size, len;
1071 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if ((size = PyString_Size(args)) < 0)
1074 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001076 if (!self->bin) {
1077 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001079 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001080
Walter Dörwald1ab83302007-05-18 17:15:44 +00001081 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001084 if ((len = PyString_Size(repr)) < 0)
1085 goto err;
1086 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Tim Peters0bc93f52003-02-02 18:29:33 +00001088 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001089 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001090
Tim Peters0bc93f52003-02-02 18:29:33 +00001091 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001092 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001093
Tim Peters0bc93f52003-02-02 18:29:33 +00001094 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001095 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001097 Py_XDECREF(repr);
1098 }
1099 else {
1100 int i;
1101 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 if ((size = PyString_Size(args)) < 0)
1104 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001106 if (size < 256) {
1107 c_str[0] = SHORT_BINSTRING;
1108 c_str[1] = size;
1109 len = 2;
1110 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001111 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 c_str[0] = BINSTRING;
1113 for (i = 1; i < 5; i++)
1114 c_str[i] = (int)(size >> ((i - 1) * 8));
1115 len = 5;
1116 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117 else
1118 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Tim Peters0bc93f52003-02-02 18:29:33 +00001120 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 if (size > 128 && Pdata_Check(self->file)) {
1124 if (write_other(self, NULL, 0) < 0) return -1;
1125 PDATA_APPEND(self->file, args, -1);
1126 }
1127 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001128 if (self->write_func(self,
1129 PyString_AS_STRING(
1130 (PyStringObject *)args),
1131 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 return -1;
1133 }
1134 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 if (doput)
1137 if (put(self, args) < 0)
1138 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 err:
1143 Py_XDECREF(repr);
1144 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145}
1146
1147
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001148/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1149 backslash and newline characters to \uXXXX escapes. */
1150static PyObject *
1151modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1152{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 PyObject *repr;
1154 char *p;
1155 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 repr = PyString_FromStringAndSize(NULL, 6 * size);
1160 if (repr == NULL)
1161 return NULL;
1162 if (size == 0)
1163 return repr;
1164
1165 p = q = PyString_AS_STRING(repr);
1166 while (size-- > 0) {
1167 Py_UNICODE ch = *s++;
1168 /* Map 16-bit characters to '\uxxxx' */
1169 if (ch >= 256 || ch == '\\' || ch == '\n') {
1170 *p++ = '\\';
1171 *p++ = 'u';
1172 *p++ = hexdigit[(ch >> 12) & 0xf];
1173 *p++ = hexdigit[(ch >> 8) & 0xf];
1174 *p++ = hexdigit[(ch >> 4) & 0xf];
1175 *p++ = hexdigit[ch & 15];
1176 }
1177 /* Copy everything else as-is */
1178 else
1179 *p++ = (char) ch;
1180 }
1181 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001182 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001183 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001184}
1185
1186
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187static int
Tim Peterscba30e22003-02-01 06:24:36 +00001188save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001190 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 if (!PyUnicode_Check(args))
1194 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 if (!self->bin) {
1197 char *repr_str;
1198 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 repr = modified_EncodeRawUnicodeEscape(
1201 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001202 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001205 if ((len = PyString_Size(repr)) < 0)
1206 goto err;
1207 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001208
Tim Peters0bc93f52003-02-02 18:29:33 +00001209 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001211
Tim Peters0bc93f52003-02-02 18:29:33 +00001212 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001214
Tim Peters0bc93f52003-02-02 18:29:33 +00001215 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001218 Py_XDECREF(repr);
1219 }
1220 else {
1221 int i;
1222 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001223
Tim Peterscba30e22003-02-01 06:24:36 +00001224 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001226
Guido van Rossum617dbc42007-05-07 23:57:08 +00001227 assert(PyBytes_Check(repr));
1228 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001230 if (size > INT_MAX)
1231 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 c_str[0] = BINUNICODE;
1234 for (i = 1; i < 5; i++)
1235 c_str[i] = (int)(size >> ((i - 1) * 8));
1236 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001237
Tim Peters0bc93f52003-02-02 18:29:33 +00001238 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 if (size > 128 && Pdata_Check(self->file)) {
1242 if (write_other(self, NULL, 0) < 0)
1243 goto err;
1244 PDATA_APPEND(self->file, repr, -1);
1245 }
1246 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001247 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001248 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001249 goto err;
1250 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001252 Py_DECREF(repr);
1253 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 if (doput)
1256 if (put(self, args) < 0)
1257 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 err:
1262 Py_XDECREF(repr);
1263 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001264}
1265
Tim Peters1d63c9f2003-02-02 20:29:39 +00001266/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1267static int
Tim Peters67920142003-02-05 03:46:17 +00001268store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001269{
1270 int i;
1271 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001272
Tim Peters1d63c9f2003-02-02 20:29:39 +00001273 assert(PyTuple_Size(t) == len);
1274
1275 for (i = 0; i < len; i++) {
1276 PyObject *element = PyTuple_GET_ITEM(t, i);
1277
1278 if (element == NULL)
1279 goto finally;
1280 if (save(self, element, 0) < 0)
1281 goto finally;
1282 }
1283 res = 0;
1284
1285 finally:
1286 return res;
1287}
1288
1289/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1290 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001291 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001292 * (a tuple can be reached from itself), and that requires some subtle
1293 * magic so that it works in all cases. IOW, this is a long routine.
1294 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001295static int
Tim Peterscba30e22003-02-01 06:24:36 +00001296save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001298 PyObject *py_tuple_id = NULL;
1299 int len, i;
1300 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001303 static char pop = POP;
1304 static char pop_mark = POP_MARK;
1305 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if ((len = PyTuple_Size(args)) < 0)
1308 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001309
Tim Peters1d63c9f2003-02-02 20:29:39 +00001310 if (len == 0) {
1311 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001312
Tim Peters1d63c9f2003-02-02 20:29:39 +00001313 if (self->proto) {
1314 c_str[0] = EMPTY_TUPLE;
1315 len = 1;
1316 }
1317 else {
1318 c_str[0] = MARK;
1319 c_str[1] = TUPLE;
1320 len = 2;
1321 }
1322 if (self->write_func(self, c_str, len) >= 0)
1323 res = 0;
1324 /* Don't memoize an empty tuple. */
1325 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001327
Tim Peters1d63c9f2003-02-02 20:29:39 +00001328 /* A non-empty tuple. */
1329
1330 /* id(tuple) isn't in the memo now. If it shows up there after
1331 * saving the tuple elements, the tuple must be recursive, in
1332 * which case we'll pop everything we put on the stack, and fetch
1333 * its value from the memo.
1334 */
1335 py_tuple_id = PyLong_FromVoidPtr(args);
1336 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001338
Tim Peters1d63c9f2003-02-02 20:29:39 +00001339 if (len <= 3 && self->proto >= 2) {
1340 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001341 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001342 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001344 /* pop the len elements */
1345 for (i = 0; i < len; ++i)
1346 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001348 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if (get(self, py_tuple_id) < 0)
1350 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 res = 0;
1352 goto finally;
1353 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001354 /* Not recursive. */
1355 if (self->write_func(self, len2opcode + len, 1) < 0)
1356 goto finally;
1357 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001359
Tim Peters1d63c9f2003-02-02 20:29:39 +00001360 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1361 * Generate MARK elt1 elt2 ... TUPLE
1362 */
1363 if (self->write_func(self, &MARKv, 1) < 0)
1364 goto finally;
1365
Tim Peters67920142003-02-05 03:46:17 +00001366 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001367 goto finally;
1368
1369 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1370 /* pop the stack stuff we pushed */
1371 if (self->bin) {
1372 if (self->write_func(self, &pop_mark, 1) < 0)
1373 goto finally;
1374 }
1375 else {
1376 /* Note that we pop one more than len, to remove
1377 * the MARK too.
1378 */
1379 for (i = 0; i <= len; i++)
1380 if (self->write_func(self, &pop, 1) < 0)
1381 goto finally;
1382 }
1383 /* fetch from memo */
1384 if (get(self, py_tuple_id) >= 0)
1385 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 goto finally;
1387 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001388
Tim Peters1d63c9f2003-02-02 20:29:39 +00001389 /* Not recursive. */
1390 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001392
Tim Peters1d63c9f2003-02-02 20:29:39 +00001393 memoize:
1394 if (put(self, args) >= 0)
1395 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 finally:
1398 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400}
1401
Tim Peters1092d642003-02-11 21:06:20 +00001402/* iter is an iterator giving items, and we batch up chunks of
1403 * MARK item item ... item APPENDS
1404 * opcode sequences. Calling code should have arranged to first create an
1405 * empty list, or list-like object, for the APPENDS to operate on.
1406 * Returns 0 on success, <0 on error.
1407 */
1408static int
1409batch_list(Picklerobject *self, PyObject *iter)
1410{
1411 PyObject *obj;
1412 PyObject *slice[BATCHSIZE];
1413 int i, n;
1414
1415 static char append = APPEND;
1416 static char appends = APPENDS;
1417
1418 assert(iter != NULL);
1419
1420 if (self->proto == 0) {
1421 /* APPENDS isn't available; do one at a time. */
1422 for (;;) {
1423 obj = PyIter_Next(iter);
1424 if (obj == NULL) {
1425 if (PyErr_Occurred())
1426 return -1;
1427 break;
1428 }
1429 i = save(self, obj, 0);
1430 Py_DECREF(obj);
1431 if (i < 0)
1432 return -1;
1433 if (self->write_func(self, &append, 1) < 0)
1434 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001435 }
1436 return 0;
1437 }
1438
1439 /* proto > 0: write in batches of BATCHSIZE. */
1440 do {
1441 /* Get next group of (no more than) BATCHSIZE elements. */
1442 for (n = 0; n < BATCHSIZE; ++n) {
1443 obj = PyIter_Next(iter);
1444 if (obj == NULL) {
1445 if (PyErr_Occurred())
1446 goto BatchFailed;
1447 break;
1448 }
1449 slice[n] = obj;
1450 }
1451
1452 if (n > 1) {
1453 /* Pump out MARK, slice[0:n], APPENDS. */
1454 if (self->write_func(self, &MARKv, 1) < 0)
1455 goto BatchFailed;
1456 for (i = 0; i < n; ++i) {
1457 if (save(self, slice[i], 0) < 0)
1458 goto BatchFailed;
1459 }
1460 if (self->write_func(self, &appends, 1) < 0)
1461 goto BatchFailed;
1462 }
1463 else if (n == 1) {
1464 if (save(self, slice[0], 0) < 0)
1465 goto BatchFailed;
1466 if (self->write_func(self, &append, 1) < 0)
1467 goto BatchFailed;
1468 }
1469
1470 for (i = 0; i < n; ++i) {
1471 Py_DECREF(slice[i]);
1472 }
Tim Peters90975f12003-02-12 05:28:58 +00001473 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001474 return 0;
1475
1476BatchFailed:
1477 while (--n >= 0) {
1478 Py_DECREF(slice[n]);
1479 }
1480 return -1;
1481}
1482
Guido van Rossum60456fd1997-04-09 17:36:32 +00001483static int
Tim Peterscba30e22003-02-01 06:24:36 +00001484save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001485{
Tim Peters1092d642003-02-11 21:06:20 +00001486 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001488 int len;
1489 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 if (self->fast && !fast_save_enter(self, args))
1492 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001493
Tim Peters1092d642003-02-11 21:06:20 +00001494 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 if (self->bin) {
1496 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001497 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001498 }
1499 else {
1500 s[0] = MARK;
1501 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001502 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504
Tim Peters1092d642003-02-11 21:06:20 +00001505 if (self->write_func(self, s, len) < 0)
1506 goto finally;
1507
1508 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 if ((len = PyList_Size(args)) < 0)
1510 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511
Tim Peters1092d642003-02-11 21:06:20 +00001512 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001514 if (put(self, args) >= 0)
1515 res = 0;
1516 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001517 }
Tim Peters90975f12003-02-12 05:28:58 +00001518 if (put2(self, args) < 0)
1519 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001520
Tim Peters1092d642003-02-11 21:06:20 +00001521 /* Materialize the list elements. */
1522 iter = PyObject_GetIter(args);
1523 if (iter == NULL)
1524 goto finally;
1525 res = batch_list(self, iter);
1526 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 finally:
1529 if (self->fast && !fast_save_leave(self, args))
1530 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001533}
1534
1535
Tim Peters42f08ac2003-02-11 22:43:24 +00001536/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1537 * MARK key value ... key value SETITEMS
1538 * opcode sequences. Calling code should have arranged to first create an
1539 * empty dict, or dict-like object, for the SETITEMS to operate on.
1540 * Returns 0 on success, <0 on error.
1541 *
1542 * This is very much like batch_list(). The difference between saving
1543 * elements directly, and picking apart two-tuples, is so long-winded at
1544 * the C level, though, that attempts to combine these routines were too
1545 * ugly to bear.
1546 */
1547static int
1548batch_dict(Picklerobject *self, PyObject *iter)
1549{
1550 PyObject *p;
1551 PyObject *slice[BATCHSIZE];
1552 int i, n;
1553
1554 static char setitem = SETITEM;
1555 static char setitems = SETITEMS;
1556
1557 assert(iter != NULL);
1558
1559 if (self->proto == 0) {
1560 /* SETITEMS isn't available; do one at a time. */
1561 for (;;) {
1562 p = PyIter_Next(iter);
1563 if (p == NULL) {
1564 if (PyErr_Occurred())
1565 return -1;
1566 break;
1567 }
1568 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1569 PyErr_SetString(PyExc_TypeError, "dict items "
1570 "iterator must return 2-tuples");
1571 return -1;
1572 }
1573 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1574 if (i >= 0)
1575 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1576 Py_DECREF(p);
1577 if (i < 0)
1578 return -1;
1579 if (self->write_func(self, &setitem, 1) < 0)
1580 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001581 }
1582 return 0;
1583 }
1584
1585 /* proto > 0: write in batches of BATCHSIZE. */
1586 do {
1587 /* Get next group of (no more than) BATCHSIZE elements. */
1588 for (n = 0; n < BATCHSIZE; ++n) {
1589 p = PyIter_Next(iter);
1590 if (p == NULL) {
1591 if (PyErr_Occurred())
1592 goto BatchFailed;
1593 break;
1594 }
1595 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1596 PyErr_SetString(PyExc_TypeError, "dict items "
1597 "iterator must return 2-tuples");
1598 goto BatchFailed;
1599 }
1600 slice[n] = p;
1601 }
1602
1603 if (n > 1) {
1604 /* Pump out MARK, slice[0:n], SETITEMS. */
1605 if (self->write_func(self, &MARKv, 1) < 0)
1606 goto BatchFailed;
1607 for (i = 0; i < n; ++i) {
1608 p = slice[i];
1609 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1610 goto BatchFailed;
1611 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1612 goto BatchFailed;
1613 }
1614 if (self->write_func(self, &setitems, 1) < 0)
1615 goto BatchFailed;
1616 }
1617 else if (n == 1) {
1618 p = slice[0];
1619 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1620 goto BatchFailed;
1621 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1622 goto BatchFailed;
1623 if (self->write_func(self, &setitem, 1) < 0)
1624 goto BatchFailed;
1625 }
1626
1627 for (i = 0; i < n; ++i) {
1628 Py_DECREF(slice[i]);
1629 }
Tim Peters90975f12003-02-12 05:28:58 +00001630 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001631 return 0;
1632
1633BatchFailed:
1634 while (--n >= 0) {
1635 Py_DECREF(slice[n]);
1636 }
1637 return -1;
1638}
1639
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640static int
Tim Peterscba30e22003-02-01 06:24:36 +00001641save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001642{
Tim Peters42f08ac2003-02-11 22:43:24 +00001643 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001645 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001646 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 if (self->fast && !fast_save_enter(self, args))
1649 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001650
Tim Peters42f08ac2003-02-11 22:43:24 +00001651 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (self->bin) {
1653 s[0] = EMPTY_DICT;
1654 len = 1;
1655 }
1656 else {
1657 s[0] = MARK;
1658 s[1] = DICT;
1659 len = 2;
1660 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001661
Tim Peters0bc93f52003-02-02 18:29:33 +00001662 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001664
Tim Peters42f08ac2003-02-11 22:43:24 +00001665 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001666 if ((len = PyDict_Size(args)) < 0)
1667 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001670 if (put(self, args) >= 0)
1671 res = 0;
1672 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 }
Tim Peters90975f12003-02-12 05:28:58 +00001674 if (put2(self, args) < 0)
1675 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001676
Tim Peters42f08ac2003-02-11 22:43:24 +00001677 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001678 items = PyObject_CallMethod(args, "items", "()");
1679 if (items == NULL)
1680 goto finally;
1681 iter = PyObject_GetIter(items);
1682 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001683 if (iter == NULL)
1684 goto finally;
1685 res = batch_dict(self, iter);
1686 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001688 finally:
1689 if (self->fast && !fast_save_leave(self, args))
1690 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001693}
1694
1695
Guido van Rossum60456fd1997-04-09 17:36:32 +00001696static int
Tim Peterscba30e22003-02-01 06:24:36 +00001697save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001699 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 char *name_str, *module_str;
1701 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 if (name) {
1706 global_name = name;
1707 Py_INCREF(global_name);
1708 }
1709 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001710 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 goto finally;
1712 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001713
Tim Peterscba30e22003-02-01 06:24:36 +00001714 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 if ((module_size = PyString_Size(module)) < 0 ||
1718 (name_size = PyString_Size(global_name)) < 0)
1719 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001720
Martin v. Löwis5b222132007-06-10 09:51:05 +00001721 module_str = PyUnicode_AsString(module);
1722 name_str = PyUnicode_AsString(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Guido van Rossum75bfd052002-12-24 18:10:07 +00001724 /* XXX This can be doing a relative import. Clearly it shouldn't,
1725 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 mod = PyImport_ImportModule(module_str);
1727 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001729 "Can't pickle %s: import of module %s "
1730 "failed",
1731 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 goto finally;
1733 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001734 klass = PyObject_GetAttr(mod, global_name);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 if (klass == NULL) {
1736 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001737 "Can't pickle %s: attribute lookup %s.%s "
1738 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 "OSS", args, module, global_name);
1740 goto finally;
1741 }
1742 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001743 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001744 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001745 "Can't pickle %s: it's not the same object "
1746 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001747 "OSS", args, module, global_name);
1748 goto finally;
1749 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001750 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001751
Tim Peters731098b2003-02-04 20:56:09 +00001752 if (self->proto >= 2) {
1753 /* See whether this is in the extension registry, and if
1754 * so generate an EXT opcode.
1755 */
1756 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001757 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001758 char c_str[5];
1759 int n;
1760
1761 PyTuple_SET_ITEM(two_tuple, 0, module);
1762 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1763 py_code = PyDict_GetItem(extension_registry, two_tuple);
1764 if (py_code == NULL)
1765 goto gen_global; /* not registered */
1766
1767 /* Verify py_code has the right type and value. */
1768 if (!PyInt_Check(py_code)) {
1769 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001770 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001771 "OO", args, py_code);
1772 goto finally;
1773 }
1774 code = PyInt_AS_LONG(py_code);
1775 if (code <= 0 || code > 0x7fffffffL) {
1776 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1777 "extension code %ld is out of range",
1778 "Ol", args, code);
1779 goto finally;
1780 }
1781
1782 /* Generate an EXT opcode. */
1783 if (code <= 0xff) {
1784 c_str[0] = EXT1;
1785 c_str[1] = (char)code;
1786 n = 2;
1787 }
1788 else if (code <= 0xffff) {
1789 c_str[0] = EXT2;
1790 c_str[1] = (char)(code & 0xff);
1791 c_str[2] = (char)((code >> 8) & 0xff);
1792 n = 3;
1793 }
1794 else {
1795 c_str[0] = EXT4;
1796 c_str[1] = (char)(code & 0xff);
1797 c_str[2] = (char)((code >> 8) & 0xff);
1798 c_str[3] = (char)((code >> 16) & 0xff);
1799 c_str[4] = (char)((code >> 24) & 0xff);
1800 n = 5;
1801 }
1802
1803 if (self->write_func(self, c_str, n) >= 0)
1804 res = 0;
1805 goto finally; /* and don't memoize */
1806 }
1807
1808 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001809 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Tim Peters0bc93f52003-02-02 18:29:33 +00001812 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Tim Peters0bc93f52003-02-02 18:29:33 +00001815 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001817
Tim Peters0bc93f52003-02-02 18:29:33 +00001818 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Tim Peters0bc93f52003-02-02 18:29:33 +00001821 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 if (put(self, args) < 0)
1825 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 finally:
1830 Py_XDECREF(module);
1831 Py_XDECREF(global_name);
1832 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835}
1836
Guido van Rossum60456fd1997-04-09 17:36:32 +00001837static int
Tim Peterscba30e22003-02-01 06:24:36 +00001838save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839{
1840 PyObject *pid = 0;
1841 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845 Py_INCREF(args);
1846 ARG_TUP(self, args);
1847 if (self->arg) {
1848 pid = PyObject_Call(f, self->arg, NULL);
1849 FREE_ARG_TUP(self);
1850 }
1851 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 if (pid != Py_None) {
1854 if (!self->bin) {
1855 if (!PyString_Check(pid)) {
1856 PyErr_SetString(PicklingError,
1857 "persistent id must be string");
1858 goto finally;
1859 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Tim Peters0bc93f52003-02-02 18:29:33 +00001861 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 if ((size = PyString_Size(pid)) < 0)
1865 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self,
1868 PyString_AS_STRING(
1869 (PyStringObject *)pid),
1870 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Tim Peters0bc93f52003-02-02 18:29:33 +00001873 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 res = 1;
1877 goto finally;
1878 }
1879 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001880 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001881 res = -1;
1882 else
1883 res = 1;
1884 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 goto finally;
1887 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 finally:
1892 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001895}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Tim Peters71fcda52003-02-14 23:05:28 +00001897/* We're saving ob, and args is the 2-thru-5 tuple returned by the
1898 * appropriate __reduce__ method for ob.
1899 */
Tim Peters84e87f32001-03-17 04:50:51 +00001900static int
Tim Peters71fcda52003-02-14 23:05:28 +00001901save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902{
Tim Peters71fcda52003-02-14 23:05:28 +00001903 PyObject *callable;
1904 PyObject *argtup;
1905 PyObject *state = NULL;
1906 PyObject *listitems = NULL;
1907 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001908
Tim Peters71fcda52003-02-14 23:05:28 +00001909 int use_newobj = self->proto >= 2;
1910
1911 static char reduce = REDUCE;
1912 static char build = BUILD;
1913 static char newobj = NEWOBJ;
1914
1915 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
1916 &callable,
1917 &argtup,
1918 &state,
1919 &listitems,
1920 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00001923 if (!PyTuple_Check(argtup)) {
1924 PyErr_SetString(PicklingError,
1925 "args from reduce() should be a tuple");
1926 return -1;
1927 }
1928
Tim Peters71fcda52003-02-14 23:05:28 +00001929 if (state == Py_None)
1930 state = NULL;
1931 if (listitems == Py_None)
1932 listitems = NULL;
1933 if (dictitems == Py_None)
1934 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Tim Peters71fcda52003-02-14 23:05:28 +00001936 /* Protocol 2 special case: if callable's name is __newobj__, use
1937 * NEWOBJ. This consumes a lot of code.
1938 */
1939 if (use_newobj) {
1940 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Tim Peters71fcda52003-02-14 23:05:28 +00001942 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001943 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1944 PyErr_Clear();
1945 else
1946 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00001947 use_newobj = 0;
1948 }
1949 else {
1950 use_newobj = PyString_Check(temp) &&
1951 strcmp(PyString_AS_STRING(temp),
1952 "__newobj__") == 0;
1953 Py_DECREF(temp);
1954 }
1955 }
1956 if (use_newobj) {
1957 PyObject *cls;
1958 PyObject *newargtup;
1959 int n, i;
1960
1961 /* Sanity checks. */
1962 n = PyTuple_Size(argtup);
1963 if (n < 1) {
1964 PyErr_SetString(PicklingError, "__newobj__ arglist "
1965 "is empty");
1966 return -1;
1967 }
1968
1969 cls = PyTuple_GET_ITEM(argtup, 0);
1970 if (! PyObject_HasAttrString(cls, "__new__")) {
1971 PyErr_SetString(PicklingError, "args[0] from "
1972 "__newobj__ args has no __new__");
1973 return -1;
1974 }
1975
1976 /* XXX How could ob be NULL? */
1977 if (ob != NULL) {
1978 PyObject *ob_dot_class;
1979
1980 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001981 if (ob_dot_class == NULL) {
1982 if (PyErr_ExceptionMatches(
1983 PyExc_AttributeError))
1984 PyErr_Clear();
1985 else
1986 return -1;
1987 }
Tim Peters71fcda52003-02-14 23:05:28 +00001988 i = ob_dot_class != cls; /* true iff a problem */
1989 Py_XDECREF(ob_dot_class);
1990 if (i) {
1991 PyErr_SetString(PicklingError, "args[0] from "
1992 "__newobj__ args has the wrong class");
1993 return -1;
1994 }
1995 }
1996
1997 /* Save the class and its __new__ arguments. */
1998 if (save(self, cls, 0) < 0)
1999 return -1;
2000
2001 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2002 if (newargtup == NULL)
2003 return -1;
2004 for (i = 1; i < n; ++i) {
2005 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2006 Py_INCREF(temp);
2007 PyTuple_SET_ITEM(newargtup, i-1, temp);
2008 }
2009 i = save(self, newargtup, 0) < 0;
2010 Py_DECREF(newargtup);
2011 if (i < 0)
2012 return -1;
2013
2014 /* Add NEWOBJ opcode. */
2015 if (self->write_func(self, &newobj, 1) < 0)
2016 return -1;
2017 }
2018 else {
2019 /* Not using NEWOBJ. */
2020 if (save(self, callable, 0) < 0 ||
2021 save(self, argtup, 0) < 0 ||
2022 self->write_func(self, &reduce, 1) < 0)
2023 return -1;
2024 }
2025
2026 /* Memoize. */
2027 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002028 if (ob != NULL) {
2029 if (state && !PyDict_Check(state)) {
2030 if (put2(self, ob) < 0)
2031 return -1;
2032 }
Tim Peters71fcda52003-02-14 23:05:28 +00002033 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002035 }
Tim Peters84e87f32001-03-17 04:50:51 +00002036
Guido van Rossum60456fd1997-04-09 17:36:32 +00002037
Tim Peters71fcda52003-02-14 23:05:28 +00002038 if (listitems && batch_list(self, listitems) < 0)
2039 return -1;
2040
2041 if (dictitems && batch_dict(self, dictitems) < 0)
2042 return -1;
2043
2044 if (state) {
2045 if (save(self, state, 0) < 0 ||
2046 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 return -1;
2048 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002051}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Guido van Rossum60456fd1997-04-09 17:36:32 +00002053static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002054save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055{
2056 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002057 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2058 PyObject *arg_tup;
2059 int res = -1;
2060 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Martin v. Löwis5a395302002-08-04 08:20:23 +00002062 if (self->nesting++ > Py_GetRecursionLimit()){
2063 PyErr_SetString(PyExc_RuntimeError,
2064 "maximum recursion depth exceeded");
2065 goto finally;
2066 }
2067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if (!pers_save && self->pers_func) {
2069 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2070 res = tmp;
2071 goto finally;
2072 }
2073 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 if (args == Py_None) {
2076 res = save_none(self, args);
2077 goto finally;
2078 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002083 case 'b':
2084 if (args == Py_False || args == Py_True) {
2085 res = save_bool(self, args);
2086 goto finally;
2087 }
2088 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002089 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002090 if (type == &PyLong_Type) {
2091 res = save_long(self, args);
2092 goto finally;
2093 }
2094 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 if (type == &PyFloat_Type) {
2098 res = save_float(self, args);
2099 goto finally;
2100 }
2101 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002102
Guido van Rossum60456fd1997-04-09 17:36:32 +00002103 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002104 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2105 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002106 goto finally;
2107 }
2108 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002109
Guido van Rossum32c38e72007-05-07 17:15:57 +00002110 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2112 res = save_string(self, args, 0);
2113 goto finally;
2114 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002115 if ((type == &PyUnicode_Type) && (PyUnicode_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 res = save_unicode(self, args, 0);
2117 goto finally;
2118 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002122 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 if (PyDict_GetItem(self->memo, py_ob_id)) {
2126 if (get(self, py_ob_id) < 0)
2127 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 res = 0;
2130 goto finally;
2131 }
2132 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002135 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 if (type == &PyString_Type) {
2137 res = save_string(self, args, 1);
2138 goto finally;
2139 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (type == &PyUnicode_Type) {
2141 res = save_unicode(self, args, 1);
2142 goto finally;
2143 }
2144 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002145
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 if (type == &PyTuple_Type) {
2148 res = save_tuple(self, args);
2149 goto finally;
2150 }
2151 if (type == &PyType_Type) {
2152 res = save_global(self, args, NULL);
2153 goto finally;
2154 }
2155 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002156
Guido van Rossum60456fd1997-04-09 17:36:32 +00002157 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 if (type == &PyList_Type) {
2159 res = save_list(self, args);
2160 goto finally;
2161 }
2162 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163
2164 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002165 if (type == &PyDict_Type) {
2166 res = save_dict(self, args);
2167 goto finally;
2168 }
2169 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002170
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002171 case 'i':
2172 break;
2173
2174 case 'c':
2175 break;
2176
Guido van Rossum60456fd1997-04-09 17:36:32 +00002177 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 if (type == &PyFunction_Type) {
2179 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002180 if (res && PyErr_ExceptionMatches(PickleError)) {
2181 /* fall back to reduce */
2182 PyErr_Clear();
2183 break;
2184 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002185 goto finally;
2186 }
2187 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002188
2189 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 if (type == &PyCFunction_Type) {
2191 res = save_global(self, args, NULL);
2192 goto finally;
2193 }
2194 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002196 if (!pers_save && self->inst_pers_func) {
2197 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2198 res = tmp;
2199 goto finally;
2200 }
2201 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002202
Jeremy Hylton39c61162002-07-16 19:47:43 +00002203 if (PyType_IsSubtype(type, &PyType_Type)) {
2204 res = save_global(self, args, NULL);
2205 goto finally;
2206 }
2207
Guido van Rossumb289b872003-02-19 01:45:13 +00002208 /* Get a reduction callable, and call it. This may come from
2209 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2210 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002211 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002212 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2213 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002214 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002215 Py_INCREF(args);
2216 ARG_TUP(self, args);
2217 if (self->arg) {
2218 t = PyObject_Call(__reduce__, self->arg, NULL);
2219 FREE_ARG_TUP(self);
2220 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 }
2222 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002223 /* Check for a __reduce_ex__ method. */
2224 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2225 if (__reduce__ != NULL) {
2226 t = PyInt_FromLong(self->proto);
2227 if (t != NULL) {
2228 ARG_TUP(self, t);
2229 t = NULL;
2230 if (self->arg) {
2231 t = PyObject_Call(__reduce__,
2232 self->arg, NULL);
2233 FREE_ARG_TUP(self);
2234 }
2235 }
2236 }
2237 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002238 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2239 PyErr_Clear();
2240 else
2241 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002242 /* Check for a __reduce__ method. */
2243 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2244 if (__reduce__ != NULL) {
2245 t = PyObject_Call(__reduce__,
2246 empty_tuple, NULL);
2247 }
2248 else {
2249 PyErr_SetObject(UnpickleableError, args);
2250 goto finally;
2251 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002252 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002253 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002254
Tim Peters71fcda52003-02-14 23:05:28 +00002255 if (t == NULL)
2256 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002257
Tim Peters71fcda52003-02-14 23:05:28 +00002258 if (PyString_Check(t)) {
2259 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002260 goto finally;
2261 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002262
Tim Peters71fcda52003-02-14 23:05:28 +00002263 if (! PyTuple_Check(t)) {
2264 cPickle_ErrFormat(PicklingError, "Value returned by "
2265 "%s must be string or tuple",
2266 "O", __reduce__);
2267 goto finally;
2268 }
2269
2270 size = PyTuple_Size(t);
2271 if (size < 2 || size > 5) {
2272 cPickle_ErrFormat(PicklingError, "tuple returned by "
2273 "%s must contain 2 through 5 elements",
2274 "O", __reduce__);
2275 goto finally;
2276 }
2277
2278 arg_tup = PyTuple_GET_ITEM(t, 1);
2279 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2280 cPickle_ErrFormat(PicklingError, "Second element of "
2281 "tuple returned by %s must be a tuple",
2282 "O", __reduce__);
2283 goto finally;
2284 }
2285
2286 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002289 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290 Py_XDECREF(py_ob_id);
2291 Py_XDECREF(__reduce__);
2292 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002295}
2296
2297
2298static int
Tim Peterscba30e22003-02-01 06:24:36 +00002299dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300{
2301 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302
Tim Peters4190fb82003-02-02 16:09:05 +00002303 if (self->proto >= 2) {
2304 char bytes[2];
2305
2306 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002307 assert(self->proto >= 0 && self->proto < 256);
2308 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002309 if (self->write_func(self, bytes, 2) < 0)
2310 return -1;
2311 }
2312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 if (save(self, args, 0) < 0)
2314 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002315
Tim Peters4190fb82003-02-02 16:09:05 +00002316 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002318
Tim Peters4190fb82003-02-02 16:09:05 +00002319 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002323}
2324
2325static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002326Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327{
Tim Peterscba30e22003-02-01 06:24:36 +00002328 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 PyDict_Clear(self->memo);
2330 Py_INCREF(Py_None);
2331 return Py_None;
2332}
2333
2334static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002335Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336{
2337 int l, i, rsize, ssize, clear=1, lm;
2338 long ik;
2339 PyObject *k, *r;
2340 char *s, *p, *have_get;
2341 Pdata *data;
2342
2343 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002344 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002345 return NULL;
2346
2347 /* Check to make sure we are based on a list */
2348 if (! Pdata_Check(self->file)) {
2349 PyErr_SetString(PicklingError,
2350 "Attempt to getvalue() a non-list-based pickler");
2351 return NULL;
2352 }
2353
2354 /* flush write buffer */
2355 if (write_other(self, NULL, 0) < 0) return NULL;
2356
2357 data=(Pdata*)self->file;
2358 l=data->length;
2359
2360 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002361 lm = PyDict_Size(self->memo);
2362 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002364 have_get = malloc(lm);
2365 if (have_get == NULL) return PyErr_NoMemory();
2366 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367
2368 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002369 for (rsize = 0, i = l; --i >= 0; ) {
2370 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371
Tim Petersac5687a2003-02-02 18:08:34 +00002372 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374
2375 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002376 ik = PyInt_AsLong(k);
2377 if (ik == -1 && PyErr_Occurred())
2378 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002379 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 PyErr_SetString(PicklingError,
2381 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002382 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 }
Tim Petersac5687a2003-02-02 18:08:34 +00002384 if (have_get[ik]) /* with matching get */
2385 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 }
2387
2388 else if (! (PyTuple_Check(k) &&
2389 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002390 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 ) {
2392 PyErr_SetString(PicklingError,
2393 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002394 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 }
2396
2397 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002398 ik = PyInt_AsLong(k);
2399 if (ik == -1 && PyErr_Occurred())
2400 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002401 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 PyErr_SetString(PicklingError,
2403 "Invalid get data");
2404 return NULL;
2405 }
Tim Petersac5687a2003-02-02 18:08:34 +00002406 have_get[ik] = 1;
2407 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 }
2410
2411 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002412 r = PyString_FromStringAndSize(NULL, rsize);
2413 if (r == NULL) goto err;
2414 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415
Tim Petersac5687a2003-02-02 18:08:34 +00002416 for (i = 0; i < l; i++) {
2417 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418
2419 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002420 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002422 p=PyString_AS_STRING((PyStringObject *)k);
2423 while (--ssize >= 0)
2424 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425 }
2426 }
2427
2428 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002429 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2430 if (ik == -1 && PyErr_Occurred())
2431 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 if (ik < 256) {
2433 *s++ = BINGET;
2434 *s++ = (int)(ik & 0xff);
2435 }
2436 else {
2437 *s++ = LONG_BINGET;
2438 *s++ = (int)(ik & 0xff);
2439 *s++ = (int)((ik >> 8) & 0xff);
2440 *s++ = (int)((ik >> 16) & 0xff);
2441 *s++ = (int)((ik >> 24) & 0xff);
2442 }
2443 }
2444
2445 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002446 ik = PyLong_AsLong(k);
2447 if (ik == -1 && PyErr_Occurred())
2448 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449
2450 if (have_get[ik]) { /* with matching get */
2451 if (ik < 256) {
2452 *s++ = BINPUT;
2453 *s++ = (int)(ik & 0xff);
2454 }
2455 else {
2456 *s++ = LONG_BINPUT;
2457 *s++ = (int)(ik & 0xff);
2458 *s++ = (int)((ik >> 8) & 0xff);
2459 *s++ = (int)((ik >> 16) & 0xff);
2460 *s++ = (int)((ik >> 24) & 0xff);
2461 }
2462 }
2463 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 }
2465
2466 if (clear) {
2467 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002468 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 }
2470
2471 free(have_get);
2472 return r;
2473 err:
2474 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002475 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002476}
2477
2478static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002479Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002480{
2481 PyObject *ob;
2482 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002483
Tim Peterscba30e22003-02-01 06:24:36 +00002484 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (dump(self, ob) < 0)
2488 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002490 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492 /* XXX Why does dump() return self? */
2493 Py_INCREF(self);
2494 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002495}
2496
2497
Tim Peterscba30e22003-02-01 06:24:36 +00002498static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499{
Neal Norwitzb0493252002-03-31 14:44:22 +00002500 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002501 PyDoc_STR("dump(object) -- "
2502 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002503 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002504 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002505 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002506 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002507 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002508};
2509
2510
2511static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002512newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513{
2514 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002515
Tim Peters5bd2a792003-02-01 16:45:06 +00002516 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002517 proto = HIGHEST_PROTOCOL;
2518 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002519 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2520 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002521 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002523 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002525 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002526 if (self == NULL)
2527 return NULL;
2528 self->proto = proto;
2529 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 self->fp = NULL;
2531 self->write = NULL;
2532 self->memo = NULL;
2533 self->arg = NULL;
2534 self->pers_func = NULL;
2535 self->inst_pers_func = NULL;
2536 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002538 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 self->fast_container = 0;
2540 self->fast_memo = NULL;
2541 self->buf_size = 0;
2542 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002543
Tim Peters5bd2a792003-02-01 16:45:06 +00002544 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 if (file)
2546 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002547 else {
2548 file = Pdata_New();
2549 if (file == NULL)
2550 goto err;
2551 }
2552 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002553
Tim Peterscba30e22003-02-01 06:24:36 +00002554 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002557 if (PycStringIO_OutputCheck(file)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 self->write_func = write_cStringIO;
2559 }
2560 else if (file == Py_None) {
2561 self->write_func = write_none;
2562 }
2563 else {
2564 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 if (! Pdata_Check(file)) {
2567 self->write = PyObject_GetAttr(file, write_str);
2568 if (!self->write) {
2569 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002570 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002571 "argument must have 'write' "
2572 "attribute");
2573 goto err;
2574 }
2575 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002576
Tim Peters5bd2a792003-02-01 16:45:06 +00002577 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2578 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 PyErr_NoMemory();
2580 goto err;
2581 }
2582 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002583
Guido van Rossuma8add0e2007-05-14 22:03:55 +00002584 self->dispatch_table = dispatch_table;
2585 Py_INCREF(dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002586 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002591 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002593}
2594
2595
2596static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002597get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002599 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002601 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002602
Tim Peters92c8bb32003-02-13 23:00:26 +00002603 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002604 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002605 * accepts Pickler() and Pickler(integer) too. The meaning then
2606 * is clear as mud, undocumented, and not supported by pickle.py.
2607 * I'm told Zope uses this, but I haven't traced into this code
2608 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002609 */
2610 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002612 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002613 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2614 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002615 return NULL;
2616 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002617 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002618}
2619
2620
2621static void
Tim Peterscba30e22003-02-01 06:24:36 +00002622Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002623{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002624 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 Py_XDECREF(self->write);
2626 Py_XDECREF(self->memo);
2627 Py_XDECREF(self->fast_memo);
2628 Py_XDECREF(self->arg);
2629 Py_XDECREF(self->file);
2630 Py_XDECREF(self->pers_func);
2631 Py_XDECREF(self->inst_pers_func);
2632 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002633 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002634 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002635}
2636
2637static int
2638Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2639{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002640 Py_VISIT(self->write);
2641 Py_VISIT(self->memo);
2642 Py_VISIT(self->fast_memo);
2643 Py_VISIT(self->arg);
2644 Py_VISIT(self->file);
2645 Py_VISIT(self->pers_func);
2646 Py_VISIT(self->inst_pers_func);
2647 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002648 return 0;
2649}
2650
2651static int
2652Pickler_clear(Picklerobject *self)
2653{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002654 Py_CLEAR(self->write);
2655 Py_CLEAR(self->memo);
2656 Py_CLEAR(self->fast_memo);
2657 Py_CLEAR(self->arg);
2658 Py_CLEAR(self->file);
2659 Py_CLEAR(self->pers_func);
2660 Py_CLEAR(self->inst_pers_func);
2661 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002662 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002663}
2664
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002665static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002666Pickler_get_pers_func(Picklerobject *p)
2667{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (p->pers_func == NULL)
2669 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2670 else
2671 Py_INCREF(p->pers_func);
2672 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002673}
2674
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002675static int
2676Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2677{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 if (v == NULL) {
2679 PyErr_SetString(PyExc_TypeError,
2680 "attribute deletion is not supported");
2681 return -1;
2682 }
2683 Py_XDECREF(p->pers_func);
2684 Py_INCREF(v);
2685 p->pers_func = v;
2686 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002687}
2688
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002689static int
2690Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2691{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002692 if (v == NULL) {
2693 PyErr_SetString(PyExc_TypeError,
2694 "attribute deletion is not supported");
2695 return -1;
2696 }
2697 Py_XDECREF(p->inst_pers_func);
2698 Py_INCREF(v);
2699 p->inst_pers_func = v;
2700 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002701}
2702
2703static PyObject *
2704Pickler_get_memo(Picklerobject *p)
2705{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706 if (p->memo == NULL)
2707 PyErr_SetString(PyExc_AttributeError, "memo");
2708 else
2709 Py_INCREF(p->memo);
2710 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002711}
2712
2713static int
2714Pickler_set_memo(Picklerobject *p, PyObject *v)
2715{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716 if (v == NULL) {
2717 PyErr_SetString(PyExc_TypeError,
2718 "attribute deletion is not supported");
2719 return -1;
2720 }
2721 if (!PyDict_Check(v)) {
2722 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2723 return -1;
2724 }
2725 Py_XDECREF(p->memo);
2726 Py_INCREF(v);
2727 p->memo = v;
2728 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002729}
2730
2731static PyObject *
2732Pickler_get_error(Picklerobject *p)
2733{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 /* why is this an attribute on the Pickler? */
2735 Py_INCREF(PicklingError);
2736 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002737}
2738
2739static PyMemberDef Pickler_members[] = {
2740 {"binary", T_INT, offsetof(Picklerobject, bin)},
2741 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002742 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002743};
2744
2745static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002746 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002747 (setter)Pickler_set_pers_func},
2748 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2749 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002750 {"PicklingError", (getter)Pickler_get_error, NULL},
2751 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002752};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002753
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002754PyDoc_STRVAR(Picklertype__doc__,
2755"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002756
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002757static PyTypeObject Picklertype = {
2758 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002759 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002760 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002761 sizeof(Picklerobject), /*tp_basicsize*/
2762 0,
2763 (destructor)Pickler_dealloc, /* tp_dealloc */
2764 0, /* tp_print */
2765 0, /* tp_getattr */
2766 0, /* tp_setattr */
2767 0, /* tp_compare */
2768 0, /* tp_repr */
2769 0, /* tp_as_number */
2770 0, /* tp_as_sequence */
2771 0, /* tp_as_mapping */
2772 0, /* tp_hash */
2773 0, /* tp_call */
2774 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002775 PyObject_GenericGetAttr, /* tp_getattro */
2776 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002777 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002778 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002779 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002780 (traverseproc)Pickler_traverse, /* tp_traverse */
2781 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002782 0, /* tp_richcompare */
2783 0, /* tp_weaklistoffset */
2784 0, /* tp_iter */
2785 0, /* tp_iternext */
2786 Pickler_methods, /* tp_methods */
2787 Pickler_members, /* tp_members */
2788 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002789};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002790
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002791static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002792find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793{
2794 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 if (fc) {
2797 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002798 PyErr_SetString(UnpicklingError, "Global and instance "
2799 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 return NULL;
2801 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002802 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2803 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 module = PySys_GetObject("modules");
2807 if (module == NULL)
2808 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 module = PyDict_GetItem(module, py_module_name);
2811 if (module == NULL) {
2812 module = PyImport_Import(py_module_name);
2813 if (!module)
2814 return NULL;
2815 global = PyObject_GetAttr(module, py_global_name);
2816 Py_DECREF(module);
2817 }
2818 else
2819 global = PyObject_GetAttr(module, py_global_name);
2820 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002821}
2822
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002823static int
Tim Peterscba30e22003-02-01 06:24:36 +00002824marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825{
2826 if (self->num_marks < 1) {
2827 PyErr_SetString(UnpicklingError, "could not find MARK");
2828 return -1;
2829 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002832}
2833
Tim Peters84e87f32001-03-17 04:50:51 +00002834
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835static int
Tim Peterscba30e22003-02-01 06:24:36 +00002836load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837{
2838 PDATA_APPEND(self->stack, Py_None, -1);
2839 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840}
2841
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002842static int
Tim Peterscba30e22003-02-01 06:24:36 +00002843bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844{
2845 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2846 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002847}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002848
2849static int
Tim Peterscba30e22003-02-01 06:24:36 +00002850load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851{
2852 PyObject *py_int = 0;
2853 char *endptr, *s;
2854 int len, res = -1;
2855 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Tim Peters0bc93f52003-02-02 18:29:33 +00002857 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 if (len < 2) return bad_readline();
2859 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 errno = 0;
2862 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2865 /* Hm, maybe we've got something long. Let's try reading
2866 it as a Python long object. */
2867 errno = 0;
2868 py_int = PyLong_FromString(s, NULL, 0);
2869 if (py_int == NULL) {
2870 PyErr_SetString(PyExc_ValueError,
2871 "could not convert string to int");
2872 goto finally;
2873 }
2874 }
2875 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002876 if (len == 3 && (l == 0 || l == 1)) {
2877 if (!( py_int = PyBool_FromLong(l))) goto finally;
2878 }
2879 else {
2880 if (!( py_int = PyInt_FromLong(l))) goto finally;
2881 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 free(s);
2885 PDATA_PUSH(self->stack, py_int, -1);
2886 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 finally:
2889 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002892}
2893
Tim Peters3c67d792003-02-02 17:59:11 +00002894static int
2895load_bool(Unpicklerobject *self, PyObject *boolean)
2896{
2897 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002898 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002899 return 0;
2900}
2901
Tim Petersee1a53c2003-02-02 02:57:53 +00002902/* s contains x bytes of a little-endian integer. Return its value as a
2903 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2904 * int, but when x is 4 it's a signed one. This is an historical source
2905 * of x-platform bugs.
2906 */
Tim Peters84e87f32001-03-17 04:50:51 +00002907static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002908calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002909{
2910 unsigned char c;
2911 int i;
2912 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 for (i = 0, l = 0L; i < x; i++) {
2915 c = (unsigned char)s[i];
2916 l |= (long)c << (i * 8);
2917 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002918#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002919 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2920 * is signed, so on a box with longs bigger than 4 bytes we need
2921 * to extend a BININT's sign bit to the full width.
2922 */
2923 if (x == 4 && l & (1L << 31))
2924 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002925#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002927}
2928
2929
2930static int
Tim Peterscba30e22003-02-01 06:24:36 +00002931load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932{
2933 PyObject *py_int = 0;
2934 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Tim Peterscba30e22003-02-01 06:24:36 +00002938 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 PDATA_PUSH(self->stack, py_int, -1);
2942 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943}
2944
2945
2946static int
Tim Peterscba30e22003-02-01 06:24:36 +00002947load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948{
2949 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Tim Peters0bc93f52003-02-02 18:29:33 +00002951 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955}
2956
2957
2958static int
Tim Peterscba30e22003-02-01 06:24:36 +00002959load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960{
2961 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Tim Peters0bc93f52003-02-02 18:29:33 +00002963 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967}
2968
2969
2970static int
Tim Peterscba30e22003-02-01 06:24:36 +00002971load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972{
2973 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Tim Peters0bc93f52003-02-02 18:29:33 +00002975 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979}
Tim Peters84e87f32001-03-17 04:50:51 +00002980
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981static int
Tim Peterscba30e22003-02-01 06:24:36 +00002982load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002983{
2984 PyObject *l = 0;
2985 char *end, *s;
2986 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987
Tim Peters0bc93f52003-02-02 18:29:33 +00002988 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 if (len < 2) return bad_readline();
2990 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002991
Tim Peterscba30e22003-02-01 06:24:36 +00002992 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 free(s);
2996 PDATA_PUSH(self->stack, l, -1);
2997 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 finally:
3000 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003}
3004
Tim Petersee1a53c2003-02-02 02:57:53 +00003005/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3006 * data following.
3007 */
3008static int
3009load_counted_long(Unpicklerobject *self, int size)
3010{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003011 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003012 char *nbytes;
3013 unsigned char *pdata;
3014 PyObject *along;
3015
3016 assert(size == 1 || size == 4);
3017 i = self->read_func(self, &nbytes, size);
3018 if (i < 0) return -1;
3019
3020 size = calc_binint(nbytes, size);
3021 if (size < 0) {
3022 /* Corrupt or hostile pickle -- we never write one like
3023 * this.
3024 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003025 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003026 "byte count");
3027 return -1;
3028 }
3029
3030 if (size == 0)
3031 along = PyLong_FromLong(0L);
3032 else {
3033 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003034 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003035 if (i < 0) return -1;
3036 along = _PyLong_FromByteArray(pdata, (size_t)size,
3037 1 /* little endian */, 1 /* signed */);
3038 }
3039 if (along == NULL)
3040 return -1;
3041 PDATA_PUSH(self->stack, along, -1);
3042 return 0;
3043}
Tim Peters84e87f32001-03-17 04:50:51 +00003044
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045static int
Tim Peterscba30e22003-02-01 06:24:36 +00003046load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047{
3048 PyObject *py_float = 0;
3049 char *endptr, *s;
3050 int len, res = -1;
3051 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003052
Tim Peters0bc93f52003-02-02 18:29:33 +00003053 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 if (len < 2) return bad_readline();
3055 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003058 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3061 PyErr_SetString(PyExc_ValueError,
3062 "could not convert string to float");
3063 goto finally;
3064 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
Tim Peterscba30e22003-02-01 06:24:36 +00003066 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 free(s);
3070 PDATA_PUSH(self->stack, py_float, -1);
3071 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 finally:
3074 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077}
3078
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079static int
Tim Peterscba30e22003-02-01 06:24:36 +00003080load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081{
Tim Peters9905b942003-03-20 20:53:32 +00003082 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 double x;
3084 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Tim Peters0bc93f52003-02-02 18:29:33 +00003086 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Tim Peters9905b942003-03-20 20:53:32 +00003089 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3090 if (x == -1.0 && PyErr_Occurred())
3091 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
Tim Peters9905b942003-03-20 20:53:32 +00003093 py_float = PyFloat_FromDouble(x);
3094 if (py_float == NULL)
3095 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 PDATA_PUSH(self->stack, py_float, -1);
3098 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
3101static int
Tim Peterscba30e22003-02-01 06:24:36 +00003102load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103{
3104 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003105 int len, res = -1;
3106 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Tim Peters0bc93f52003-02-02 18:29:33 +00003108 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 if (len < 2) return bad_readline();
3110 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003112
3113 /* Strip outermost quotes */
3114 while (s[len-1] <= ' ')
3115 len--;
3116 if(s[0]=='"' && s[len-1]=='"'){
3117 s[len-1] = '\0';
3118 p = s + 1 ;
3119 len -= 2;
3120 } else if(s[0]=='\'' && s[len-1]=='\''){
3121 s[len-1] = '\0';
3122 p = s + 1 ;
3123 len -= 2;
3124 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 goto insecure;
3126 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003127
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003128 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003129 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003130 if (str) {
3131 PDATA_PUSH(self->stack, str, -1);
3132 res = 0;
3133 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 insecure:
3137 free(s);
3138 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3139 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003140}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
3142
3143static int
Tim Peterscba30e22003-02-01 06:24:36 +00003144load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145{
3146 PyObject *py_string = 0;
3147 long l;
3148 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Tim Peters0bc93f52003-02-02 18:29:33 +00003150 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003152 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Tim Peters0bc93f52003-02-02 18:29:33 +00003154 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003156
Tim Peterscba30e22003-02-01 06:24:36 +00003157 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003160 PDATA_PUSH(self->stack, py_string, -1);
3161 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162}
3163
3164
3165static int
Tim Peterscba30e22003-02-01 06:24:36 +00003166load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167{
3168 PyObject *py_string = 0;
3169 unsigned char l;
3170 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171
Tim Peters0bc93f52003-02-02 18:29:33 +00003172 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176
Tim Peters0bc93f52003-02-02 18:29:33 +00003177 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 PDATA_PUSH(self->stack, py_string, -1);
3182 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003183}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184
3185
3186static int
Tim Peterscba30e22003-02-01 06:24:36 +00003187load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188{
3189 PyObject *str = 0;
3190 int len, res = -1;
3191 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003192
Tim Peters0bc93f52003-02-02 18:29:33 +00003193 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003195
Tim Peterscba30e22003-02-01 06:24:36 +00003196 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003199 PDATA_PUSH(self->stack, str, -1);
3200 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 finally:
3203 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003204}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003205
3206
3207static int
Tim Peterscba30e22003-02-01 06:24:36 +00003208load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209{
3210 PyObject *unicode;
3211 long l;
3212 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003213
Tim Peters0bc93f52003-02-02 18:29:33 +00003214 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003217
Tim Peters0bc93f52003-02-02 18:29:33 +00003218 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003220
Tim Peterscba30e22003-02-01 06:24:36 +00003221 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224 PDATA_PUSH(self->stack, unicode, -1);
3225 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003226}
3227
3228
3229static int
Tim Peterscba30e22003-02-01 06:24:36 +00003230load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231{
3232 PyObject *tup;
3233 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235 if ((i = marker(self)) < 0) return -1;
3236 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3237 PDATA_PUSH(self->stack, tup, -1);
3238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239}
3240
3241static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003242load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003244 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245
Tim Peters1d63c9f2003-02-02 20:29:39 +00003246 if (tup == NULL)
3247 return -1;
3248
3249 while (--len >= 0) {
3250 PyObject *element;
3251
3252 PDATA_POP(self->stack, element);
3253 if (element == NULL)
3254 return -1;
3255 PyTuple_SET_ITEM(tup, len, element);
3256 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003257 PDATA_PUSH(self->stack, tup, -1);
3258 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259}
3260
3261static int
Tim Peterscba30e22003-02-01 06:24:36 +00003262load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263{
3264 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003266 if (!( list=PyList_New(0))) return -1;
3267 PDATA_PUSH(self->stack, list, -1);
3268 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269}
3270
3271static int
Tim Peterscba30e22003-02-01 06:24:36 +00003272load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003273{
3274 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 if (!( dict=PyDict_New())) return -1;
3277 PDATA_PUSH(self->stack, dict, -1);
3278 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279}
3280
3281
3282static int
Tim Peterscba30e22003-02-01 06:24:36 +00003283load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284{
3285 PyObject *list = 0;
3286 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 if ((i = marker(self)) < 0) return -1;
3289 if (!( list=Pdata_popList(self->stack, i))) return -1;
3290 PDATA_PUSH(self->stack, list, -1);
3291 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292}
3293
3294static int
Tim Peterscba30e22003-02-01 06:24:36 +00003295load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003296{
3297 PyObject *dict, *key, *value;
3298 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 if ((i = marker(self)) < 0) return -1;
3301 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003305 for (k = i+1; k < j; k += 2) {
3306 key =self->stack->data[k-1];
3307 value=self->stack->data[k ];
3308 if (PyDict_SetItem(dict, key, value) < 0) {
3309 Py_DECREF(dict);
3310 return -1;
3311 }
3312 }
3313 Pdata_clear(self->stack, i);
3314 PDATA_PUSH(self->stack, dict, -1);
3315 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316}
3317
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003318static PyObject *
3319Instance_New(PyObject *cls, PyObject *args)
3320{
3321 PyObject *r = 0;
3322
3323 if ((r=PyObject_CallObject(cls, args))) return r;
3324
3325 {
3326 PyObject *tp, *v, *tb, *tmp_value;
3327
3328 PyErr_Fetch(&tp, &v, &tb);
3329 tmp_value = v;
3330 /* NULL occurs when there was a KeyboardInterrupt */
3331 if (tmp_value == NULL)
3332 tmp_value = Py_None;
3333 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3334 Py_XDECREF(v);
3335 v=r;
3336 }
3337 PyErr_Restore(tp,v,tb);
3338 }
3339 return NULL;
3340}
3341
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
3343static int
Tim Peterscba30e22003-02-01 06:24:36 +00003344load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345{
3346 PyObject *class, *tup, *obj=0;
3347 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 if ((i = marker(self)) < 0) return -1;
3350 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3351 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003352 if (class) {
3353 obj = Instance_New(class, tup);
3354 Py_DECREF(class);
3355 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 if (! obj) return -1;
3359 PDATA_PUSH(self->stack, obj, -1);
3360 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361}
3362
3363
3364static int
Tim Peterscba30e22003-02-01 06:24:36 +00003365load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366{
3367 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3368 int i, len;
3369 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003372
Tim Peters0bc93f52003-02-02 18:29:33 +00003373 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 if (len < 2) return bad_readline();
3375 module_name = PyString_FromStringAndSize(s, len - 1);
3376 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003377
Tim Peters0bc93f52003-02-02 18:29:33 +00003378 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 if (len < 2) return bad_readline();
3380 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003381 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 self->find_class);
3383 Py_DECREF(class_name);
3384 }
3385 }
3386 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003388 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003391 obj = Instance_New(class, tup);
3392 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393 }
3394 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 PDATA_PUSH(self->stack, obj, -1);
3399 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003400}
3401
Tim Peterseab7db32003-02-13 18:24:14 +00003402static int
3403load_newobj(Unpicklerobject *self)
3404{
3405 PyObject *args = NULL;
3406 PyObject *clsraw = NULL;
3407 PyTypeObject *cls; /* clsraw cast to its true type */
3408 PyObject *obj;
3409
3410 /* Stack is ... cls argtuple, and we want to call
3411 * cls.__new__(cls, *argtuple).
3412 */
3413 PDATA_POP(self->stack, args);
3414 if (args == NULL) goto Fail;
3415 if (! PyTuple_Check(args)) {
3416 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3417 "tuple.");
3418 goto Fail;
3419 }
3420
3421 PDATA_POP(self->stack, clsraw);
3422 cls = (PyTypeObject *)clsraw;
3423 if (cls == NULL) goto Fail;
3424 if (! PyType_Check(cls)) {
3425 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3426 "isn't a type object");
3427 goto Fail;
3428 }
3429 if (cls->tp_new == NULL) {
3430 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3431 "has NULL tp_new");
3432 goto Fail;
3433 }
3434
3435 /* Call __new__. */
3436 obj = cls->tp_new(cls, args, NULL);
3437 if (obj == NULL) goto Fail;
3438
3439 Py_DECREF(args);
3440 Py_DECREF(clsraw);
3441 PDATA_PUSH(self->stack, obj, -1);
3442 return 0;
3443
3444 Fail:
3445 Py_XDECREF(args);
3446 Py_XDECREF(clsraw);
3447 return -1;
3448}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449
3450static int
Tim Peterscba30e22003-02-01 06:24:36 +00003451load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452{
3453 PyObject *class = 0, *module_name = 0, *class_name = 0;
3454 int len;
3455 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456
Tim Peters0bc93f52003-02-02 18:29:33 +00003457 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 if (len < 2) return bad_readline();
3459 module_name = PyString_FromStringAndSize(s, len - 1);
3460 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461
Tim Peters0bc93f52003-02-02 18:29:33 +00003462 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003463 if (len < 2) {
3464 Py_DECREF(module_name);
3465 return bad_readline();
3466 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00003467 if ((class_name = PyUnicode_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003468 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 self->find_class);
3470 Py_DECREF(class_name);
3471 }
3472 }
3473 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003475 if (! class) return -1;
3476 PDATA_PUSH(self->stack, class, -1);
3477 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003478}
3479
3480
3481static int
Tim Peterscba30e22003-02-01 06:24:36 +00003482load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483{
3484 PyObject *pid = 0;
3485 int len;
3486 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003489 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 if (len < 2) return bad_readline();
3491
3492 pid = PyString_FromStringAndSize(s, len - 1);
3493 if (!pid) return -1;
3494
3495 if (PyList_Check(self->pers_func)) {
3496 if (PyList_Append(self->pers_func, pid) < 0) {
3497 Py_DECREF(pid);
3498 return -1;
3499 }
3500 }
3501 else {
3502 ARG_TUP(self, pid);
3503 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003504 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 NULL);
3506 FREE_ARG_TUP(self);
3507 }
3508 }
3509
3510 if (! pid) return -1;
3511
3512 PDATA_PUSH(self->stack, pid, -1);
3513 return 0;
3514 }
3515 else {
3516 PyErr_SetString(UnpicklingError,
3517 "A load persistent id instruction was encountered,\n"
3518 "but no persistent_load function was specified.");
3519 return -1;
3520 }
3521}
3522
3523static int
Tim Peterscba30e22003-02-01 06:24:36 +00003524load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525{
3526 PyObject *pid = 0;
3527
3528 if (self->pers_func) {
3529 PDATA_POP(self->stack, pid);
3530 if (! pid) return -1;
3531
3532 if (PyList_Check(self->pers_func)) {
3533 if (PyList_Append(self->pers_func, pid) < 0) {
3534 Py_DECREF(pid);
3535 return -1;
3536 }
3537 }
3538 else {
3539 ARG_TUP(self, pid);
3540 if (self->arg) {
3541 pid = PyObject_Call(self->pers_func, self->arg,
3542 NULL);
3543 FREE_ARG_TUP(self);
3544 }
3545 if (! pid) return -1;
3546 }
3547
3548 PDATA_PUSH(self->stack, pid, -1);
3549 return 0;
3550 }
3551 else {
3552 PyErr_SetString(UnpicklingError,
3553 "A load persistent id instruction was encountered,\n"
3554 "but no persistent_load function was specified.");
3555 return -1;
3556 }
3557}
3558
3559
3560static int
Tim Peterscba30e22003-02-01 06:24:36 +00003561load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003562{
3563 int len;
3564
3565 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3566
3567 /* Note that we split the (pickle.py) stack into two stacks,
3568 an object stack and a mark stack. We have to be clever and
3569 pop the right one. We do this by looking at the top of the
3570 mark stack.
3571 */
3572
3573 if ((self->num_marks > 0) &&
3574 (self->marks[self->num_marks - 1] == len))
3575 self->num_marks--;
3576 else {
3577 len--;
3578 Py_DECREF(self->stack->data[len]);
3579 self->stack->length=len;
3580 }
3581
3582 return 0;
3583}
3584
3585
3586static int
Tim Peterscba30e22003-02-01 06:24:36 +00003587load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588{
3589 int i;
3590
3591 if ((i = marker(self)) < 0)
3592 return -1;
3593
3594 Pdata_clear(self->stack, i);
3595
3596 return 0;
3597}
3598
3599
3600static int
Tim Peterscba30e22003-02-01 06:24:36 +00003601load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602{
3603 PyObject *last;
3604 int len;
3605
3606 if ((len = self->stack->length) <= 0) return stackUnderflow();
3607 last=self->stack->data[len-1];
3608 Py_INCREF(last);
3609 PDATA_PUSH(self->stack, last, -1);
3610 return 0;
3611}
3612
3613
3614static int
Tim Peterscba30e22003-02-01 06:24:36 +00003615load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616{
3617 PyObject *py_str = 0, *value = 0;
3618 int len;
3619 char *s;
3620 int rc;
3621
Tim Peters0bc93f52003-02-02 18:29:33 +00003622 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003623 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 value = PyDict_GetItem(self->memo, py_str);
3628 if (! value) {
3629 PyErr_SetObject(BadPickleGet, py_str);
3630 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003631 }
3632 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633 PDATA_APPEND(self->stack, value, -1);
3634 rc = 0;
3635 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637 Py_DECREF(py_str);
3638 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639}
3640
3641
3642static int
Tim Peterscba30e22003-02-01 06:24:36 +00003643load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644{
3645 PyObject *py_key = 0, *value = 0;
3646 unsigned char key;
3647 char *s;
3648 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003649
Tim Peters0bc93f52003-02-02 18:29:33 +00003650 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652 key = (unsigned char)s[0];
3653 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003655 value = PyDict_GetItem(self->memo, py_key);
3656 if (! value) {
3657 PyErr_SetObject(BadPickleGet, py_key);
3658 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003659 }
3660 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 PDATA_APPEND(self->stack, value, -1);
3662 rc = 0;
3663 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665 Py_DECREF(py_key);
3666 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667}
3668
3669
3670static int
Tim Peterscba30e22003-02-01 06:24:36 +00003671load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003672{
3673 PyObject *py_key = 0, *value = 0;
3674 unsigned char c;
3675 char *s;
3676 long key;
3677 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678
Tim Peters0bc93f52003-02-02 18:29:33 +00003679 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 c = (unsigned char)s[0];
3682 key = (long)c;
3683 c = (unsigned char)s[1];
3684 key |= (long)c << 8;
3685 c = (unsigned char)s[2];
3686 key |= (long)c << 16;
3687 c = (unsigned char)s[3];
3688 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3691
3692 value = PyDict_GetItem(self->memo, py_key);
3693 if (! value) {
3694 PyErr_SetObject(BadPickleGet, py_key);
3695 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003696 }
3697 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 PDATA_APPEND(self->stack, value, -1);
3699 rc = 0;
3700 }
3701
3702 Py_DECREF(py_key);
3703 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003704}
3705
Tim Peters2d629652003-02-04 05:06:17 +00003706/* Push an object from the extension registry (EXT[124]). nbytes is
3707 * the number of bytes following the opcode, holding the index (code) value.
3708 */
3709static int
3710load_extension(Unpicklerobject *self, int nbytes)
3711{
3712 char *codebytes; /* the nbytes bytes after the opcode */
3713 long code; /* calc_binint returns long */
3714 PyObject *py_code; /* code as a Python int */
3715 PyObject *obj; /* the object to push */
3716 PyObject *pair; /* (module_name, class_name) */
3717 PyObject *module_name, *class_name;
3718
3719 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3720 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3721 code = calc_binint(codebytes, nbytes);
3722 if (code <= 0) { /* note that 0 is forbidden */
3723 /* Corrupt or hostile pickle. */
3724 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3725 return -1;
3726 }
3727
3728 /* Look for the code in the cache. */
3729 py_code = PyInt_FromLong(code);
3730 if (py_code == NULL) return -1;
3731 obj = PyDict_GetItem(extension_cache, py_code);
3732 if (obj != NULL) {
3733 /* Bingo. */
3734 Py_DECREF(py_code);
3735 PDATA_APPEND(self->stack, obj, -1);
3736 return 0;
3737 }
3738
3739 /* Look up the (module_name, class_name) pair. */
3740 pair = PyDict_GetItem(inverted_registry, py_code);
3741 if (pair == NULL) {
3742 Py_DECREF(py_code);
3743 PyErr_Format(PyExc_ValueError, "unregistered extension "
3744 "code %ld", code);
3745 return -1;
3746 }
3747 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003748 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003749 */
3750 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3751 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3752 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3753 Py_DECREF(py_code);
3754 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3755 "isn't a 2-tuple of strings", code);
3756 return -1;
3757 }
3758 /* Load the object. */
3759 obj = find_class(module_name, class_name, self->find_class);
3760 if (obj == NULL) {
3761 Py_DECREF(py_code);
3762 return -1;
3763 }
3764 /* Cache code -> obj. */
3765 code = PyDict_SetItem(extension_cache, py_code, obj);
3766 Py_DECREF(py_code);
3767 if (code < 0) {
3768 Py_DECREF(obj);
3769 return -1;
3770 }
3771 PDATA_PUSH(self->stack, obj, -1);
3772 return 0;
3773}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
3775static int
Tim Peterscba30e22003-02-01 06:24:36 +00003776load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777{
3778 PyObject *py_str = 0, *value = 0;
3779 int len, l;
3780 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Tim Peters0bc93f52003-02-02 18:29:33 +00003782 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 if (l < 2) return bad_readline();
3784 if (!( len=self->stack->length )) return stackUnderflow();
3785 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3786 value=self->stack->data[len-1];
3787 l=PyDict_SetItem(self->memo, py_str, value);
3788 Py_DECREF(py_str);
3789 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790}
3791
3792
3793static int
Tim Peterscba30e22003-02-01 06:24:36 +00003794load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795{
3796 PyObject *py_key = 0, *value = 0;
3797 unsigned char key;
3798 char *s;
3799 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800
Tim Peters0bc93f52003-02-02 18:29:33 +00003801 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3807 value=self->stack->data[len-1];
3808 len=PyDict_SetItem(self->memo, py_key, value);
3809 Py_DECREF(py_key);
3810 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811}
3812
3813
3814static int
Tim Peterscba30e22003-02-01 06:24:36 +00003815load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816{
3817 PyObject *py_key = 0, *value = 0;
3818 long key;
3819 unsigned char c;
3820 char *s;
3821 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003822
Tim Peters0bc93f52003-02-02 18:29:33 +00003823 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 c = (unsigned char)s[0];
3827 key = (long)c;
3828 c = (unsigned char)s[1];
3829 key |= (long)c << 8;
3830 c = (unsigned char)s[2];
3831 key |= (long)c << 16;
3832 c = (unsigned char)s[3];
3833 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 if (!( py_key = PyInt_FromLong(key))) return -1;
3836 value=self->stack->data[len-1];
3837 len=PyDict_SetItem(self->memo, py_key, value);
3838 Py_DECREF(py_key);
3839 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003840}
3841
3842
3843static int
Tim Peterscba30e22003-02-01 06:24:36 +00003844do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845{
3846 PyObject *value = 0, *list = 0, *append_method = 0;
3847 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 len=self->stack->length;
3850 if (!( len >= x && x > 0 )) return stackUnderflow();
3851 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003852 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 if (PyList_Check(list)) {
3857 PyObject *slice;
3858 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003861 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 list_len = PyList_GET_SIZE(list);
3863 i=PyList_SetSlice(list, list_len, list_len, slice);
3864 Py_DECREF(slice);
3865 return i;
3866 }
3867 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
Tim Peterscba30e22003-02-01 06:24:36 +00003869 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 return -1;
3871
3872 for (i = x; i < len; i++) {
3873 PyObject *junk;
3874
3875 value=self->stack->data[i];
3876 junk=0;
3877 ARG_TUP(self, value);
3878 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003879 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 NULL);
3881 FREE_ARG_TUP(self);
3882 }
3883 if (! junk) {
3884 Pdata_clear(self->stack, i+1);
3885 self->stack->length=x;
3886 Py_DECREF(append_method);
3887 return -1;
3888 }
3889 Py_DECREF(junk);
3890 }
3891 self->stack->length=x;
3892 Py_DECREF(append_method);
3893 }
3894
3895 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896}
3897
3898
3899static int
Tim Peterscba30e22003-02-01 06:24:36 +00003900load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003901{
3902 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903}
3904
3905
3906static int
Tim Peterscba30e22003-02-01 06:24:36 +00003907load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908{
3909 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910}
3911
3912
3913static int
Tim Peterscba30e22003-02-01 06:24:36 +00003914do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915{
3916 PyObject *value = 0, *key = 0, *dict = 0;
3917 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 if (!( (len=self->stack->length) >= x
3920 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 for (i = x+1; i < len; i += 2) {
3925 key =self->stack->data[i-1];
3926 value=self->stack->data[i ];
3927 if (PyObject_SetItem(dict, key, value) < 0) {
3928 r=-1;
3929 break;
3930 }
3931 }
3932
3933 Pdata_clear(self->stack, x);
3934
3935 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936}
3937
3938
Tim Peters84e87f32001-03-17 04:50:51 +00003939static int
Tim Peterscba30e22003-02-01 06:24:36 +00003940load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941{
3942 return do_setitems(self, self->stack->length - 2);
3943}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945static int
Tim Peterscba30e22003-02-01 06:24:36 +00003946load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947{
3948 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003949}
3950
Tim Peters84e87f32001-03-17 04:50:51 +00003951
Guido van Rossum60456fd1997-04-09 17:36:32 +00003952static int
Tim Peterscba30e22003-02-01 06:24:36 +00003953load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954{
Tim Peters080c88b2003-02-15 03:01:11 +00003955 PyObject *state, *inst, *slotstate;
3956 PyObject *__setstate__;
3957 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003958 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00003959 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960
Tim Peters080c88b2003-02-15 03:01:11 +00003961 /* Stack is ... instance, state. We want to leave instance at
3962 * the stack top, possibly mutated via instance.__setstate__(state).
3963 */
3964 if (self->stack->length < 2)
3965 return stackUnderflow();
3966 PDATA_POP(self->stack, state);
3967 if (state == NULL)
3968 return -1;
3969 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970
Tim Peters080c88b2003-02-15 03:01:11 +00003971 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
3972 if (__setstate__ != NULL) {
3973 PyObject *junk = NULL;
3974
3975 /* The explicit __setstate__ is responsible for everything. */
3976 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 if (self->arg) {
3978 junk = PyObject_Call(__setstate__, self->arg, NULL);
3979 FREE_ARG_TUP(self);
3980 }
3981 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00003982 if (junk == NULL)
3983 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 Py_DECREF(junk);
3985 return 0;
3986 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003987 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3988 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00003990
3991 /* A default __setstate__. First see whether state embeds a
3992 * slot state dict too (a proto 2 addition).
3993 */
3994 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
3995 PyObject *temp = state;
3996 state = PyTuple_GET_ITEM(temp, 0);
3997 slotstate = PyTuple_GET_ITEM(temp, 1);
3998 Py_INCREF(state);
3999 Py_INCREF(slotstate);
4000 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 }
Tim Peters080c88b2003-02-15 03:01:11 +00004002 else
4003 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004
Tim Peters080c88b2003-02-15 03:01:11 +00004005 /* Set inst.__dict__ from the state dict (if any). */
4006 if (state != Py_None) {
4007 PyObject *dict;
4008 if (! PyDict_Check(state)) {
4009 PyErr_SetString(UnpicklingError, "state is not a "
4010 "dictionary");
4011 goto finally;
4012 }
4013 dict = PyObject_GetAttr(inst, __dict___str);
4014 if (dict == NULL)
4015 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016
Tim Peters080c88b2003-02-15 03:01:11 +00004017 i = 0;
4018 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4019 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4020 goto finally;
4021 }
4022 Py_DECREF(dict);
4023 }
4024
4025 /* Also set instance attributes from the slotstate dict (if any). */
4026 if (slotstate != NULL) {
4027 if (! PyDict_Check(slotstate)) {
4028 PyErr_SetString(UnpicklingError, "slot state is not "
4029 "a dictionary");
4030 goto finally;
4031 }
4032 i = 0;
4033 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4034 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4035 goto finally;
4036 }
4037 }
4038 res = 0;
4039
4040 finally:
4041 Py_DECREF(state);
4042 Py_XDECREF(slotstate);
4043 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004044}
4045
4046
4047static int
Tim Peterscba30e22003-02-01 06:24:36 +00004048load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049{
4050 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 /* Note that we split the (pickle.py) stack into two stacks, an
4053 object stack and a mark stack. Here we push a mark onto the
4054 mark stack.
4055 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004058 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 s=self->marks_size+20;
4060 if (s <= self->num_marks) s=self->num_marks + 1;
4061 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004062 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004064 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004066 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 PyErr_NoMemory();
4068 return -1;
4069 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004070 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 self->marks_size = s;
4072 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004076 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077}
4078
Guido van Rossum60456fd1997-04-09 17:36:32 +00004079static int
Tim Peterscba30e22003-02-01 06:24:36 +00004080load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081{
4082 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 PDATA_POP(self->stack, arg_tup);
4085 if (! arg_tup) return -1;
4086 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004087 if (callable) {
4088 ob = Instance_New(callable, arg_tup);
4089 Py_DECREF(callable);
4090 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 PDATA_PUSH(self->stack, ob, -1);
4096 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004097}
Tim Peters84e87f32001-03-17 04:50:51 +00004098
Tim Peters4190fb82003-02-02 16:09:05 +00004099/* Just raises an error if we don't know the protocol specified. PROTO
4100 * is the first opcode for protocols >= 2.
4101 */
4102static int
4103load_proto(Unpicklerobject *self)
4104{
4105 int i;
4106 char *protobyte;
4107
4108 i = self->read_func(self, &protobyte, 1);
4109 if (i < 0)
4110 return -1;
4111
4112 i = calc_binint(protobyte, 1);
4113 /* No point checking for < 0, since calc_binint returns an unsigned
4114 * int when chewing on 1 byte.
4115 */
4116 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004117 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004118 return 0;
4119
4120 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4121 return -1;
4122}
4123
Guido van Rossum60456fd1997-04-09 17:36:32 +00004124static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004125load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126{
4127 PyObject *err = 0, *val = 0;
4128 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130 self->num_marks = 0;
4131 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004134 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 switch (s[0]) {
4138 case NONE:
4139 if (load_none(self) < 0)
4140 break;
4141 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 case BININT:
4144 if (load_binint(self) < 0)
4145 break;
4146 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 case BININT1:
4149 if (load_binint1(self) < 0)
4150 break;
4151 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 case BININT2:
4154 if (load_binint2(self) < 0)
4155 break;
4156 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 case INT:
4159 if (load_int(self) < 0)
4160 break;
4161 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 case LONG:
4164 if (load_long(self) < 0)
4165 break;
4166 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Tim Petersee1a53c2003-02-02 02:57:53 +00004168 case LONG1:
4169 if (load_counted_long(self, 1) < 0)
4170 break;
4171 continue;
4172
4173 case LONG4:
4174 if (load_counted_long(self, 4) < 0)
4175 break;
4176 continue;
4177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 case FLOAT:
4179 if (load_float(self) < 0)
4180 break;
4181 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 case BINFLOAT:
4184 if (load_binfloat(self) < 0)
4185 break;
4186 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 case BINSTRING:
4189 if (load_binstring(self) < 0)
4190 break;
4191 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 case SHORT_BINSTRING:
4194 if (load_short_binstring(self) < 0)
4195 break;
4196 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 case STRING:
4199 if (load_string(self) < 0)
4200 break;
4201 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203 case UNICODE:
4204 if (load_unicode(self) < 0)
4205 break;
4206 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 case BINUNICODE:
4209 if (load_binunicode(self) < 0)
4210 break;
4211 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004214 if (load_counted_tuple(self, 0) < 0)
4215 break;
4216 continue;
4217
4218 case TUPLE1:
4219 if (load_counted_tuple(self, 1) < 0)
4220 break;
4221 continue;
4222
4223 case TUPLE2:
4224 if (load_counted_tuple(self, 2) < 0)
4225 break;
4226 continue;
4227
4228 case TUPLE3:
4229 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 break;
4231 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 case TUPLE:
4234 if (load_tuple(self) < 0)
4235 break;
4236 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 case EMPTY_LIST:
4239 if (load_empty_list(self) < 0)
4240 break;
4241 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 case LIST:
4244 if (load_list(self) < 0)
4245 break;
4246 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 case EMPTY_DICT:
4249 if (load_empty_dict(self) < 0)
4250 break;
4251 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 case DICT:
4254 if (load_dict(self) < 0)
4255 break;
4256 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 case OBJ:
4259 if (load_obj(self) < 0)
4260 break;
4261 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 case INST:
4264 if (load_inst(self) < 0)
4265 break;
4266 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Tim Peterseab7db32003-02-13 18:24:14 +00004268 case NEWOBJ:
4269 if (load_newobj(self) < 0)
4270 break;
4271 continue;
4272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 case GLOBAL:
4274 if (load_global(self) < 0)
4275 break;
4276 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 case APPEND:
4279 if (load_append(self) < 0)
4280 break;
4281 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 case APPENDS:
4284 if (load_appends(self) < 0)
4285 break;
4286 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004288 case BUILD:
4289 if (load_build(self) < 0)
4290 break;
4291 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 case DUP:
4294 if (load_dup(self) < 0)
4295 break;
4296 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298 case BINGET:
4299 if (load_binget(self) < 0)
4300 break;
4301 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004303 case LONG_BINGET:
4304 if (load_long_binget(self) < 0)
4305 break;
4306 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308 case GET:
4309 if (load_get(self) < 0)
4310 break;
4311 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Tim Peters2d629652003-02-04 05:06:17 +00004313 case EXT1:
4314 if (load_extension(self, 1) < 0)
4315 break;
4316 continue;
4317
4318 case EXT2:
4319 if (load_extension(self, 2) < 0)
4320 break;
4321 continue;
4322
4323 case EXT4:
4324 if (load_extension(self, 4) < 0)
4325 break;
4326 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 case MARK:
4328 if (load_mark(self) < 0)
4329 break;
4330 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 case BINPUT:
4333 if (load_binput(self) < 0)
4334 break;
4335 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case LONG_BINPUT:
4338 if (load_long_binput(self) < 0)
4339 break;
4340 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case PUT:
4343 if (load_put(self) < 0)
4344 break;
4345 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case POP:
4348 if (load_pop(self) < 0)
4349 break;
4350 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 case POP_MARK:
4353 if (load_pop_mark(self) < 0)
4354 break;
4355 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 case SETITEM:
4358 if (load_setitem(self) < 0)
4359 break;
4360 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 case SETITEMS:
4363 if (load_setitems(self) < 0)
4364 break;
4365 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 case STOP:
4368 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 case PERSID:
4371 if (load_persid(self) < 0)
4372 break;
4373 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 case BINPERSID:
4376 if (load_binpersid(self) < 0)
4377 break;
4378 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 case REDUCE:
4381 if (load_reduce(self) < 0)
4382 break;
4383 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384
Tim Peters4190fb82003-02-02 16:09:05 +00004385 case PROTO:
4386 if (load_proto(self) < 0)
4387 break;
4388 continue;
4389
Tim Peters3c67d792003-02-02 17:59:11 +00004390 case NEWTRUE:
4391 if (load_bool(self, Py_True) < 0)
4392 break;
4393 continue;
4394
4395 case NEWFALSE:
4396 if (load_bool(self, Py_False) < 0)
4397 break;
4398 continue;
4399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 case '\0':
4401 /* end of file */
4402 PyErr_SetNone(PyExc_EOFError);
4403 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004406 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 "invalid load key, '%s'.",
4408 "c", s[0]);
4409 return NULL;
4410 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 break;
4413 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 if ((err = PyErr_Occurred())) {
4416 if (err == PyExc_EOFError) {
4417 PyErr_SetNone(PyExc_EOFError);
4418 }
4419 return NULL;
4420 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 PDATA_POP(self->stack, val);
4423 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004424}
Tim Peters84e87f32001-03-17 04:50:51 +00004425
Guido van Rossum60456fd1997-04-09 17:36:32 +00004426
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004427/* No-load functions to support noload, which is used to
4428 find persistent references. */
4429
4430static int
Tim Peterscba30e22003-02-01 06:24:36 +00004431noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432{
4433 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 if ((i = marker(self)) < 0) return -1;
4436 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004437}
4438
4439
4440static int
Tim Peterscba30e22003-02-01 06:24:36 +00004441noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442{
4443 int i;
4444 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446 if ((i = marker(self)) < 0) return -1;
4447 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004448 if (self->readline_func(self, &s) < 0) return -1;
4449 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004450 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004452}
4453
4454static int
Tim Peterseab7db32003-02-13 18:24:14 +00004455noload_newobj(Unpicklerobject *self)
4456{
4457 PyObject *obj;
4458
4459 PDATA_POP(self->stack, obj); /* pop argtuple */
4460 if (obj == NULL) return -1;
4461 Py_DECREF(obj);
4462
4463 PDATA_POP(self->stack, obj); /* pop cls */
4464 if (obj == NULL) return -1;
4465 Py_DECREF(obj);
4466
4467 PDATA_APPEND(self->stack, Py_None, -1);
4468 return 0;
4469}
4470
4471static int
Tim Peterscba30e22003-02-01 06:24:36 +00004472noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473{
4474 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004475
Tim Peters0bc93f52003-02-02 18:29:33 +00004476 if (self->readline_func(self, &s) < 0) return -1;
4477 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 PDATA_APPEND(self->stack, Py_None,-1);
4479 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004480}
4481
4482static int
Tim Peterscba30e22003-02-01 06:24:36 +00004483noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 if (self->stack->length < 2) return stackUnderflow();
4487 Pdata_clear(self->stack, self->stack->length-2);
4488 PDATA_APPEND(self->stack, Py_None,-1);
4489 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004490}
4491
4492static int
4493noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004494
Guido van Rossum053b8df1998-11-25 16:18:00 +00004495 if (self->stack->length < 1) return stackUnderflow();
4496 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004497 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004498}
4499
Tim Peters2d629652003-02-04 05:06:17 +00004500static int
4501noload_extension(Unpicklerobject *self, int nbytes)
4502{
4503 char *codebytes;
4504
4505 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4506 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4507 PDATA_APPEND(self->stack, Py_None, -1);
4508 return 0;
4509}
4510
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004511
4512static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004513noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514{
4515 PyObject *err = 0, *val = 0;
4516 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 self->num_marks = 0;
4519 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004522 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 switch (s[0]) {
4526 case NONE:
4527 if (load_none(self) < 0)
4528 break;
4529 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 case BININT:
4532 if (load_binint(self) < 0)
4533 break;
4534 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 case BININT1:
4537 if (load_binint1(self) < 0)
4538 break;
4539 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 case BININT2:
4542 if (load_binint2(self) < 0)
4543 break;
4544 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 case INT:
4547 if (load_int(self) < 0)
4548 break;
4549 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 case LONG:
4552 if (load_long(self) < 0)
4553 break;
4554 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004555
Tim Peters4190fb82003-02-02 16:09:05 +00004556 case LONG1:
4557 if (load_counted_long(self, 1) < 0)
4558 break;
4559 continue;
4560
4561 case LONG4:
4562 if (load_counted_long(self, 4) < 0)
4563 break;
4564 continue;
4565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 case FLOAT:
4567 if (load_float(self) < 0)
4568 break;
4569 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 case BINFLOAT:
4572 if (load_binfloat(self) < 0)
4573 break;
4574 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 case BINSTRING:
4577 if (load_binstring(self) < 0)
4578 break;
4579 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 case SHORT_BINSTRING:
4582 if (load_short_binstring(self) < 0)
4583 break;
4584 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 case STRING:
4587 if (load_string(self) < 0)
4588 break;
4589 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 case UNICODE:
4592 if (load_unicode(self) < 0)
4593 break;
4594 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 case BINUNICODE:
4597 if (load_binunicode(self) < 0)
4598 break;
4599 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004602 if (load_counted_tuple(self, 0) < 0)
4603 break;
4604 continue;
4605
4606 case TUPLE1:
4607 if (load_counted_tuple(self, 1) < 0)
4608 break;
4609 continue;
4610
4611 case TUPLE2:
4612 if (load_counted_tuple(self, 2) < 0)
4613 break;
4614 continue;
4615
4616 case TUPLE3:
4617 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 break;
4619 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621 case TUPLE:
4622 if (load_tuple(self) < 0)
4623 break;
4624 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 case EMPTY_LIST:
4627 if (load_empty_list(self) < 0)
4628 break;
4629 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 case LIST:
4632 if (load_list(self) < 0)
4633 break;
4634 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 case EMPTY_DICT:
4637 if (load_empty_dict(self) < 0)
4638 break;
4639 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 case DICT:
4642 if (load_dict(self) < 0)
4643 break;
4644 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 case OBJ:
4647 if (noload_obj(self) < 0)
4648 break;
4649 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 case INST:
4652 if (noload_inst(self) < 0)
4653 break;
4654 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655
Tim Peterseab7db32003-02-13 18:24:14 +00004656 case NEWOBJ:
4657 if (noload_newobj(self) < 0)
4658 break;
4659 continue;
4660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 case GLOBAL:
4662 if (noload_global(self) < 0)
4663 break;
4664 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 case APPEND:
4667 if (load_append(self) < 0)
4668 break;
4669 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 case APPENDS:
4672 if (load_appends(self) < 0)
4673 break;
4674 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 case BUILD:
4677 if (noload_build(self) < 0)
4678 break;
4679 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 case DUP:
4682 if (load_dup(self) < 0)
4683 break;
4684 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 case BINGET:
4687 if (load_binget(self) < 0)
4688 break;
4689 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 case LONG_BINGET:
4692 if (load_long_binget(self) < 0)
4693 break;
4694 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 case GET:
4697 if (load_get(self) < 0)
4698 break;
4699 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004700
Tim Peters2d629652003-02-04 05:06:17 +00004701 case EXT1:
4702 if (noload_extension(self, 1) < 0)
4703 break;
4704 continue;
4705
4706 case EXT2:
4707 if (noload_extension(self, 2) < 0)
4708 break;
4709 continue;
4710
4711 case EXT4:
4712 if (noload_extension(self, 4) < 0)
4713 break;
4714 continue;
4715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case MARK:
4717 if (load_mark(self) < 0)
4718 break;
4719 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 case BINPUT:
4722 if (load_binput(self) < 0)
4723 break;
4724 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 case LONG_BINPUT:
4727 if (load_long_binput(self) < 0)
4728 break;
4729 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 case PUT:
4732 if (load_put(self) < 0)
4733 break;
4734 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 case POP:
4737 if (load_pop(self) < 0)
4738 break;
4739 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 case POP_MARK:
4742 if (load_pop_mark(self) < 0)
4743 break;
4744 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 case SETITEM:
4747 if (load_setitem(self) < 0)
4748 break;
4749 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 case SETITEMS:
4752 if (load_setitems(self) < 0)
4753 break;
4754 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 case STOP:
4757 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 case PERSID:
4760 if (load_persid(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 BINPERSID:
4765 if (load_binpersid(self) < 0)
4766 break;
4767 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case REDUCE:
4770 if (noload_reduce(self) < 0)
4771 break;
4772 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004773
Tim Peters4190fb82003-02-02 16:09:05 +00004774 case PROTO:
4775 if (load_proto(self) < 0)
4776 break;
4777 continue;
4778
Tim Peters3c67d792003-02-02 17:59:11 +00004779 case NEWTRUE:
4780 if (load_bool(self, Py_True) < 0)
4781 break;
4782 continue;
4783
4784 case NEWFALSE:
4785 if (load_bool(self, Py_False) < 0)
4786 break;
4787 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004789 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 "invalid load key, '%s'.",
4791 "c", s[0]);
4792 return NULL;
4793 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 break;
4796 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 if ((err = PyErr_Occurred())) {
4799 if (err == PyExc_EOFError) {
4800 PyErr_SetNone(PyExc_EOFError);
4801 }
4802 return NULL;
4803 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 PDATA_POP(self->stack, val);
4806 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004807}
Tim Peters84e87f32001-03-17 04:50:51 +00004808
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004809
Guido van Rossum60456fd1997-04-09 17:36:32 +00004810static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004811Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004814}
4815
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004816static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004817Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820}
4821
Guido van Rossum60456fd1997-04-09 17:36:32 +00004822
4823static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004824 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004825 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004826 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004827 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004828 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004829 "noload() -- not load a pickle, but go through most of the motions\n"
4830 "\n"
4831 "This function can be used to read past a pickle without instantiating\n"
4832 "any objects or importing any modules. It can also be used to find all\n"
4833 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004834 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004835 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004836 {NULL, NULL} /* sentinel */
4837};
4838
4839
4840static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004841newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842{
4843 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004844
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004845 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004848 self->file = NULL;
4849 self->arg = NULL;
4850 self->stack = (Pdata*)Pdata_New();
4851 self->pers_func = NULL;
4852 self->last_string = NULL;
4853 self->marks = NULL;
4854 self->num_marks = 0;
4855 self->marks_size = 0;
4856 self->buf_size = 0;
4857 self->read = NULL;
4858 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004860
Tim Peterscba30e22003-02-01 06:24:36 +00004861 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004863
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004864 if (!self->stack)
4865 goto err;
4866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 Py_INCREF(f);
4868 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004870 /* Set read, readline based on type of f */
Guido van Rossumda5b8f22007-06-12 23:30:11 +00004871 if (PycStringIO_InputCheck(f)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 self->fp = NULL;
4873 self->read_func = read_cStringIO;
4874 self->readline_func = readline_cStringIO;
4875 }
4876 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 self->fp = NULL;
4879 self->read_func = read_other;
4880 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4883 (self->read = PyObject_GetAttr(f, read_str)))) {
4884 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004885 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 "argument must have 'read' and "
4887 "'readline' attributes" );
4888 goto err;
4889 }
4890 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004891 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 err:
4896 Py_DECREF((PyObject *)self);
4897 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004898}
4899
4900
4901static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004902get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004904 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004905}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004906
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004907
Guido van Rossum60456fd1997-04-09 17:36:32 +00004908static void
Tim Peterscba30e22003-02-01 06:24:36 +00004909Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004911 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 Py_XDECREF(self->readline);
4913 Py_XDECREF(self->read);
4914 Py_XDECREF(self->file);
4915 Py_XDECREF(self->memo);
4916 Py_XDECREF(self->stack);
4917 Py_XDECREF(self->pers_func);
4918 Py_XDECREF(self->arg);
4919 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00004920 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 if (self->marks) {
4923 free(self->marks);
4924 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 if (self->buf_size) {
4927 free(self->buf);
4928 }
Tim Peters84e87f32001-03-17 04:50:51 +00004929
Tim Peters3cfe7542003-05-21 21:29:48 +00004930 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004931}
4932
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004933static int
4934Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
4935{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004936 Py_VISIT(self->readline);
4937 Py_VISIT(self->read);
4938 Py_VISIT(self->file);
4939 Py_VISIT(self->memo);
4940 Py_VISIT(self->stack);
4941 Py_VISIT(self->pers_func);
4942 Py_VISIT(self->arg);
4943 Py_VISIT(self->last_string);
4944 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004945 return 0;
4946}
4947
4948static int
4949Unpickler_clear(Unpicklerobject *self)
4950{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004951 Py_CLEAR(self->readline);
4952 Py_CLEAR(self->read);
4953 Py_CLEAR(self->file);
4954 Py_CLEAR(self->memo);
4955 Py_CLEAR(self->stack);
4956 Py_CLEAR(self->pers_func);
4957 Py_CLEAR(self->arg);
4958 Py_CLEAR(self->last_string);
4959 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004960 return 0;
4961}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004962
4963static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004964Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965{
4966 if (!strcmp(name, "persistent_load")) {
4967 if (!self->pers_func) {
4968 PyErr_SetString(PyExc_AttributeError, name);
4969 return NULL;
4970 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004972 Py_INCREF(self->pers_func);
4973 return self->pers_func;
4974 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 if (!strcmp(name, "find_global")) {
4977 if (!self->find_class) {
4978 PyErr_SetString(PyExc_AttributeError, name);
4979 return NULL;
4980 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 Py_INCREF(self->find_class);
4983 return self->find_class;
4984 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 if (!strcmp(name, "memo")) {
4987 if (!self->memo) {
4988 PyErr_SetString(PyExc_AttributeError, name);
4989 return NULL;
4990 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 Py_INCREF(self->memo);
4993 return self->memo;
4994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 if (!strcmp(name, "UnpicklingError")) {
4997 Py_INCREF(UnpicklingError);
4998 return UnpicklingError;
4999 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005002}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005003
Guido van Rossum60456fd1997-04-09 17:36:32 +00005004
5005static int
Tim Peterscba30e22003-02-01 06:24:36 +00005006Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009 if (!strcmp(name, "persistent_load")) {
5010 Py_XDECREF(self->pers_func);
5011 self->pers_func = value;
5012 Py_XINCREF(value);
5013 return 0;
5014 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 if (!strcmp(name, "find_global")) {
5017 Py_XDECREF(self->find_class);
5018 self->find_class = value;
5019 Py_XINCREF(value);
5020 return 0;
5021 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 if (! value) {
5024 PyErr_SetString(PyExc_TypeError,
5025 "attribute deletion is not supported");
5026 return -1;
5027 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 if (strcmp(name, "memo") == 0) {
5030 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005031 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005032 "memo must be a dictionary");
5033 return -1;
5034 }
5035 Py_XDECREF(self->memo);
5036 self->memo = value;
5037 Py_INCREF(value);
5038 return 0;
5039 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 PyErr_SetString(PyExc_AttributeError, name);
5042 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005043}
5044
Tim Peters5bd2a792003-02-01 16:45:06 +00005045/* ---------------------------------------------------------------------------
5046 * Module-level functions.
5047 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005048
Martin v. Löwis544f1192004-07-27 05:22:33 +00005049/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005050static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005051cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005052{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005053 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 PyObject *ob, *file, *res = NULL;
5055 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005056 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057
Martin v. Löwis544f1192004-07-27 05:22:33 +00005058 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5059 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005060 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005061
Tim Peters5bd2a792003-02-01 16:45:06 +00005062 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005063 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005065 if (dump(pickler, ob) < 0)
5066 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068 Py_INCREF(Py_None);
5069 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 finally:
5072 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005074 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005075}
5076
5077
Martin v. Löwis544f1192004-07-27 05:22:33 +00005078/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005079static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005080cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005082 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 PyObject *ob, *file = 0, *res = NULL;
5084 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005085 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005086
Martin v. Löwis544f1192004-07-27 05:22:33 +00005087 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5088 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005090
Tim Peterscba30e22003-02-01 06:24:36 +00005091 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005092 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005093
Tim Peters5bd2a792003-02-01 16:45:06 +00005094 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005097 if (dump(pickler, ob) < 0)
5098 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 res = PycStringIO->cgetvalue(file);
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005101 if (res == NULL)
5102 goto finally;
5103 if (!PyBytes_Check(res)) {
5104 PyObject *tmp = res;
5105 res = PyBytes_FromObject(res);
5106 Py_DECREF(tmp);
5107 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005109 finally:
5110 Py_XDECREF(pickler);
5111 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005113 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005114}
5115
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005116
Tim Peters5bd2a792003-02-01 16:45:06 +00005117/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005119cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005120{
5121 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005122 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005123
Tim Peterscba30e22003-02-01 06:24:36 +00005124 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005127 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 finally:
5130 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005133}
5134
5135
Tim Peters5bd2a792003-02-01 16:45:06 +00005136/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005137static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005138cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005139{
5140 PyObject *ob, *file = 0, *res = NULL;
5141 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005142
Guido van Rossum617dbc42007-05-07 23:57:08 +00005143 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5144 PyErr_Clear();
5145 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5146 goto finally;
5147 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005148
Tim Peterscba30e22003-02-01 06:24:36 +00005149 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005150 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005151
Tim Peterscba30e22003-02-01 06:24:36 +00005152 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 finally:
5158 Py_XDECREF(file);
5159 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005162}
5163
5164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005165PyDoc_STRVAR(Unpicklertype__doc__,
5166"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005167
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005168static PyTypeObject Unpicklertype = {
5169 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005170 0, /*ob_size*/
5171 "cPickle.Unpickler", /*tp_name*/
5172 sizeof(Unpicklerobject), /*tp_basicsize*/
5173 0,
5174 (destructor)Unpickler_dealloc, /* tp_dealloc */
5175 0, /* tp_print */
5176 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5177 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5178 0, /* tp_compare */
5179 0, /* tp_repr */
5180 0, /* tp_as_number */
5181 0, /* tp_as_sequence */
5182 0, /* tp_as_mapping */
5183 0, /* tp_hash */
5184 0, /* tp_call */
5185 0, /* tp_str */
5186 0, /* tp_getattro */
5187 0, /* tp_setattro */
5188 0, /* tp_as_buffer */
5189 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5190 Unpicklertype__doc__, /* tp_doc */
5191 (traverseproc)Unpickler_traverse, /* tp_traverse */
5192 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005193};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005194
Guido van Rossum60456fd1997-04-09 17:36:32 +00005195static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005196 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5197 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005198 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005199 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005200 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005201 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005202
Martin v. Löwis544f1192004-07-27 05:22:33 +00005203 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5204 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005205 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005206 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005207 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005208 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005209
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005210 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005211 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005212
Neal Norwitzb0493252002-03-31 14:44:22 +00005213 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005214 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005215
Martin v. Löwis544f1192004-07-27 05:22:33 +00005216 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5217 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005218 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005219 "This takes a file-like object for writing a pickle data stream.\n"
5220 "The optional proto argument tells the pickler to use the given\n"
5221 "protocol; supported protocols are 0, 1, 2. The default\n"
5222 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5223 "only protocol that can be written to a file opened in text\n"
5224 "mode and read back successfully. When using a protocol higher\n"
5225 "than 0, make sure the file is opened in binary mode, both when\n"
5226 "pickling and unpickling.)\n"
5227 "\n"
5228 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5229 "more efficient than protocol 1.\n"
5230 "\n"
5231 "Specifying a negative protocol version selects the highest\n"
5232 "protocol version supported. The higher the protocol used, the\n"
5233 "more recent the version of Python needed to read the pickle\n"
5234 "produced.\n"
5235 "\n"
5236 "The file parameter must have a write() method that accepts a single\n"
5237 "string argument. It can thus be an open file object, a StringIO\n"
5238 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005239 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005240
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005241 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005242 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5243
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005244 { NULL, NULL }
5245};
5246
Guido van Rossum60456fd1997-04-09 17:36:32 +00005247static int
Tim Peterscba30e22003-02-01 06:24:36 +00005248init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249{
5250 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251
Martin v. Löwis5b222132007-06-10 09:51:05 +00005252#define INIT_STR(S) if (!( S ## _str=PyUnicode_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005253
Tim Peters3cfe7542003-05-21 21:29:48 +00005254 if (PyType_Ready(&Unpicklertype) < 0)
5255 return -1;
5256 if (PyType_Ready(&Picklertype) < 0)
5257 return -1;
5258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005259 INIT_STR(__class__);
5260 INIT_STR(__getinitargs__);
5261 INIT_STR(__dict__);
5262 INIT_STR(__getstate__);
5263 INIT_STR(__setstate__);
5264 INIT_STR(__name__);
5265 INIT_STR(__main__);
5266 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005267 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005268 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 INIT_STR(append);
5270 INIT_STR(read);
5271 INIT_STR(readline);
5272 INIT_STR(copy_reg);
5273 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005274
Tim Peterscba30e22003-02-01 06:24:36 +00005275 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005276 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005277
Tim Peters1f1b2d22003-02-01 02:16:37 +00005278 /* This is special because we want to use a different
5279 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005280 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005281 if (!dispatch_table) return -1;
5282
5283 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005284 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005285 if (!extension_registry) return -1;
5286
5287 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005288 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005289 if (!inverted_registry) return -1;
5290
5291 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005292 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005293 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005295 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005296
Tim Peters731098b2003-02-04 20:56:09 +00005297 if (!(empty_tuple = PyTuple_New(0)))
5298 return -1;
5299
5300 two_tuple = PyTuple_New(2);
5301 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005302 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005303 /* We use this temp container with no regard to refcounts, or to
5304 * keeping containees alive. Exempt from GC, because we don't
5305 * want anything looking at two_tuple() by magic.
5306 */
5307 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005309 /* Ugh */
5310 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5311 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5312 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005314 if (!( t=PyDict_New())) return -1;
5315 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005316 "def __str__(self):\n"
5317 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5318 Py_file_input,
5319 module_dict, t) )) return -1;
5320 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005322 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005323 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005324 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005327
Tim Peterscba30e22003-02-01 06:24:36 +00005328 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005330 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 if (!( t=PyDict_New())) return -1;
5334 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 "def __str__(self):\n"
5336 " a=self.args\n"
5337 " a=a and type(a[0]) or '(what)'\n"
5338 " return 'Cannot pickle %s objects' % a\n"
5339 , Py_file_input,
5340 module_dict, t) )) return -1;
5341 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005343 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005344 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005345 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005347 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005350 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005352
Martin v. Löwis658009a2002-09-16 17:26:24 +00005353 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5354 UnpicklingError, NULL)))
5355 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005357 if (PyDict_SetItemString(module_dict, "PickleError",
5358 PickleError) < 0)
5359 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005361 if (PyDict_SetItemString(module_dict, "PicklingError",
5362 PicklingError) < 0)
5363 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005365 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5366 UnpicklingError) < 0)
5367 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005369 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5370 UnpickleableError) < 0)
5371 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5374 BadPickleGet) < 0)
5375 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005377 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005380}
5381
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005382#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5383#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005384#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005385PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005386initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005387{
5388 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005389 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005390 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 PyObject *format_version;
5392 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005394 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395 Unpicklertype.ob_type = &PyType_Type;
5396 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005399 * so we're forced to use a temporary dictionary. :(
5400 */
5401 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402 if (!di) return;
5403 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 /* Create the module and add the functions */
5406 m = Py_InitModule4("cPickle", cPickle_methods,
5407 cPickle_module_documentation,
5408 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005409 if (m == NULL)
5410 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005412 /* Add some symbolic constants to the module */
5413 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005414 v = PyString_FromString(rev);
5415 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005416 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 /* Copy data from di. Waaa. */
5419 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5420 if (PyObject_SetItem(d, k, v) < 0) {
5421 Py_DECREF(di);
5422 return;
5423 }
5424 }
5425 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005426
Tim Peters8587b3c2003-02-13 15:44:41 +00005427 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5428 if (i < 0)
5429 return;
5430
Tim Peters5b7da392003-02-04 00:21:07 +00005431 /* These are purely informational; no code uses them. */
5432 /* File format version we write. */
5433 format_version = PyString_FromString("2.0");
5434 /* Format versions we can read. */
5435 compatible_formats = Py_BuildValue("[sssss]",
5436 "1.0", /* Original protocol 0 */
5437 "1.1", /* Protocol 0 + INST */
5438 "1.2", /* Original protocol 1 */
5439 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005440 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005441 PyDict_SetItemString(d, "format_version", format_version);
5442 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5443 Py_XDECREF(format_version);
5444 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005445}