blob: d50c74358ac285bc4d8091bfc09074184a3850b8 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Walter Dörwald38e6a692007-06-20 12:37:01 +0000396 if (stringformat && !(retval=PyUnicode_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
Walter Dörwald38e6a692007-06-20 12:37:01 +0000402 v=PyUnicode_Format(retval, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 if (s == NULL) {
424 return 0;
425 }
Tim Peterscba30e22003-02-01 06:24:36 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
428 return -1;
429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000432}
433
Tim Peters84e87f32001-03-17 04:50:51 +0000434static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000435write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436{
437 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000438 if (n > INT_MAX) return -1;
439 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444{
445 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000447
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448 if (_n > INT_MAX)
449 return -1;
450 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451 if (s == NULL) {
452 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000453 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000455 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456 return -1;
457 }
458 else {
459 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
460 if (write_other(self, NULL, 0) < 0)
461 return -1;
462 }
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (n > WRITE_BUF_SIZE) {
465 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000466 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 return -1;
468 }
469 else {
470 memcpy(self->write_buf + self->buf_size, s, n);
471 self->buf_size += n;
472 return n;
473 }
474 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (self->write) {
477 /* object with write method */
478 ARG_TUP(self, py_str);
479 if (self->arg) {
480 junk = PyObject_Call(self->write, self->arg, NULL);
481 FREE_ARG_TUP(self);
482 }
483 if (junk) Py_DECREF(junk);
484 else return -1;
485 }
486 else
487 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 self->buf_size = 0;
490 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491}
492
493
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494static Py_ssize_t
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496{
497 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
500 PyErr_SetNone(PyExc_EOFError);
501 return -1;
502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000513 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
517 return -1;
518 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523}
524
525
Martin v. Löwis18e16552006-02-15 17:27:45 +0000526static Py_ssize_t
527read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528{
529 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000530
Martin v. Löwis18e16552006-02-15 17:27:45 +0000531 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 ARG_TUP(self, bytes);
534 if (self->arg) {
535 str = PyObject_Call(self->read, self->arg, NULL);
536 FREE_ARG_TUP(self);
537 }
538 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 Py_XDECREF(self->last_string);
541 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 if (! (*s = PyString_AsString(str))) return -1;
544 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545}
546
547
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000549readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550{
551 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 if ((str_size = PyString_Size(str)) < 0)
559 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 Py_XDECREF(self->last_string);
562 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 if (! (*s = PyString_AsString(str)))
565 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568}
569
Tim Petersee1a53c2003-02-02 02:57:53 +0000570/* Copy the first n bytes from s into newly malloc'ed memory, plus a
571 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
572 * The caller is responsible for free()'ing the return value.
573 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000575pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576{
Tim Petersee1a53c2003-02-02 02:57:53 +0000577 char *r = (char *)malloc(n+1);
578 if (r == NULL)
579 return (char*)PyErr_NoMemory();
580 memcpy(r, s, n);
581 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583}
584
585
586static int
Tim Peterscba30e22003-02-01 06:24:36 +0000587get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588{
589 PyObject *value, *mv;
590 long c_value;
591 char s[30];
592 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 if (!( mv = PyDict_GetItem(self->memo, id))) {
595 PyErr_SetObject(PyExc_KeyError, id);
596 return -1;
597 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Tim Peterscba30e22003-02-01 06:24:36 +0000599 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if (!( PyInt_Check(value))) {
603 PyErr_SetString(PicklingError, "no int where int expected in memo");
604 return -1;
605 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000606 c_value = PyInt_AsLong(value);
607 if (c_value == -1 && PyErr_Occurred())
608 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (!self->bin) {
611 s[0] = GET;
612 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
613 len = strlen(s);
614 }
615 else if (Pdata_Check(self->file)) {
616 if (write_other(self, NULL, 0) < 0) return -1;
617 PDATA_APPEND(self->file, mv, -1);
618 return 0;
619 }
620 else {
621 if (c_value < 256) {
622 s[0] = BINGET;
623 s[1] = (int)(c_value & 0xff);
624 len = 2;
625 }
626 else {
627 s[0] = LONG_BINGET;
628 s[1] = (int)(c_value & 0xff);
629 s[2] = (int)((c_value >> 8) & 0xff);
630 s[3] = (int)((c_value >> 16) & 0xff);
631 s[4] = (int)((c_value >> 24) & 0xff);
632 len = 5;
633 }
634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Tim Peters0bc93f52003-02-02 18:29:33 +0000636 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000638
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000639 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000641
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643static int
Tim Peterscba30e22003-02-01 06:24:36 +0000644put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645{
Tim Peterscba30e22003-02-01 06:24:36 +0000646 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 return put2(self, ob);
650}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000651
Guido van Rossum053b8df1998-11-25 16:18:00 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653static int
Tim Peterscba30e22003-02-01 06:24:36 +0000654put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655{
656 char c_str[30];
657 int p;
658 size_t len;
659 int res = -1;
660 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (self->fast)
663 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if ((p = PyDict_Size(self->memo)) < 0)
666 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000669 /* XXX Why?
670 * XXX And does "positive" really mean non-negative?
671 * XXX pickle.py starts with PUT index 0, not 1. This makes for
672 * XXX gratuitous differences between the pickling modules.
673 */
Tim Peterscba30e22003-02-01 06:24:36 +0000674 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Tim Peterscba30e22003-02-01 06:24:36 +0000676 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000678
Tim Peterscba30e22003-02-01 06:24:36 +0000679 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681
Tim Peterscba30e22003-02-01 06:24:36 +0000682 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685 PyTuple_SET_ITEM(t, 0, memo_len);
686 Py_INCREF(memo_len);
687 PyTuple_SET_ITEM(t, 1, ob);
688 Py_INCREF(ob);
689
690 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
691 goto finally;
692
693 if (!self->bin) {
694 c_str[0] = PUT;
695 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
696 len = strlen(c_str);
697 }
698 else if (Pdata_Check(self->file)) {
699 if (write_other(self, NULL, 0) < 0) return -1;
700 PDATA_APPEND(self->file, memo_len, -1);
701 res=0; /* Job well done ;) */
702 goto finally;
703 }
704 else {
705 if (p >= 256) {
706 c_str[0] = LONG_BINPUT;
707 c_str[1] = (int)(p & 0xff);
708 c_str[2] = (int)((p >> 8) & 0xff);
709 c_str[3] = (int)((p >> 16) & 0xff);
710 c_str[4] = (int)((p >> 24) & 0xff);
711 len = 5;
712 }
713 else {
714 c_str[0] = BINPUT;
715 c_str[1] = p;
716 len = 2;
717 }
718 }
719
Tim Peters0bc93f52003-02-02 18:29:33 +0000720 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 goto finally;
722
723 res = 0;
724
725 finally:
726 Py_XDECREF(py_ob_id);
727 Py_XDECREF(memo_len);
728 Py_XDECREF(t);
729
730 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000731}
732
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000733static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000734whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 PyObject *module = 0, *modules_dict = 0,
738 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000741 if (module)
742 return module;
743 if (PyErr_ExceptionMatches(PyExc_AttributeError))
744 PyErr_Clear();
745 else
746 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000747
Tim Peterscba30e22003-02-01 06:24:36 +0000748 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751 i = 0;
752 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 global_name_attr = PyObject_GetAttr(module, global_name);
757 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000758 if (PyErr_ExceptionMatches(PyExc_AttributeError))
759 PyErr_Clear();
760 else
761 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 continue;
763 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 if (global_name_attr != global) {
766 Py_DECREF(global_name_attr);
767 continue;
768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 break;
773 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 /* The following implements the rule in pickle.py added in 1.5
776 that used __main__ if no module is found. I don't actually
777 like this rule. jlf
778 */
779 if (!j) {
780 j=1;
781 name=__main___str;
782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 Py_INCREF(name);
785 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000786}
787
788
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000790fast_save_enter(Picklerobject *self, PyObject *obj)
791{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 /* if fast_container < 0, we're doing an error exit. */
793 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
794 PyObject *key = NULL;
795 if (self->fast_memo == NULL) {
796 self->fast_memo = PyDict_New();
797 if (self->fast_memo == NULL) {
798 self->fast_container = -1;
799 return 0;
800 }
801 }
802 key = PyLong_FromVoidPtr(obj);
803 if (key == NULL)
804 return 0;
805 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000806 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000808 "fast mode: can't pickle cyclic objects "
809 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 obj->ob_type->tp_name, obj);
811 self->fast_container = -1;
812 return 0;
813 }
814 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000815 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 self->fast_container = -1;
817 return 0;
818 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000819 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000820 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000822}
823
Tim Peterscba30e22003-02-01 06:24:36 +0000824int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000825fast_save_leave(Picklerobject *self, PyObject *obj)
826{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
828 PyObject *key = PyLong_FromVoidPtr(obj);
829 if (key == NULL)
830 return 0;
831 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000832 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 return 0;
834 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000835 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000836 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000838}
839
840static int
Tim Peterscba30e22003-02-01 06:24:36 +0000841save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842{
843 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000844 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848}
849
Guido van Rossum77f6a652002-04-03 22:41:51 +0000850static int
Tim Peterscba30e22003-02-01 06:24:36 +0000851save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000852{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000853 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000854 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000855 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000856
Tim Peters3c67d792003-02-02 17:59:11 +0000857 if (self->proto >= 2) {
858 char opcode = l ? NEWTRUE : NEWFALSE;
859 if (self->write_func(self, &opcode, 1) < 0)
860 return -1;
861 }
862 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000863 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000864 return 0;
865}
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Guido van Rossum60456fd1997-04-09 17:36:32 +0000867static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000868save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869{
870 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000874#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 || l > 0x7fffffffL
876 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000877#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 ) {
879 /* Text-mode pickle, or long too big to fit in the 4-byte
880 * signed BININT format: store as a string.
881 */
882 c_str[0] = INT;
883 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000884 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 return -1;
886 }
887 else {
888 /* Binary pickle and l fits in a signed 4-byte int. */
889 c_str[1] = (int)( l & 0xff);
890 c_str[2] = (int)((l >> 8) & 0xff);
891 c_str[3] = (int)((l >> 16) & 0xff);
892 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 if ((c_str[4] == 0) && (c_str[3] == 0)) {
895 if (c_str[2] == 0) {
896 c_str[0] = BININT1;
897 len = 2;
898 }
899 else {
900 c_str[0] = BININT2;
901 len = 3;
902 }
903 }
904 else {
905 c_str[0] = BININT;
906 len = 5;
907 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Tim Peters0bc93f52003-02-02 18:29:33 +0000909 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return -1;
911 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914}
915
916
917static int
Tim Peterscba30e22003-02-01 06:24:36 +0000918save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +0000921 int res = -1;
922 PyObject *repr = NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000923 long val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925
Guido van Rossumddefaf32007-01-14 03:31:43 +0000926 if (val == -1 && PyErr_Occurred()) {
927 /* out of range for int pickling */
928 PyErr_Clear();
929 }
930 else
931 return save_int(self, val);
932
Tim Petersee1a53c2003-02-02 02:57:53 +0000933 if (self->proto >= 2) {
934 /* Linear-time pickling. */
935 size_t nbits;
936 size_t nbytes;
937 unsigned char *pdata;
938 char c_str[5];
939 int i;
940 int sign = _PyLong_Sign(args);
941
942 if (sign == 0) {
943 /* It's 0 -- an empty bytestring. */
944 c_str[0] = LONG1;
945 c_str[1] = 0;
946 i = self->write_func(self, c_str, 2);
947 if (i < 0) goto finally;
948 res = 0;
949 goto finally;
950 }
951 nbits = _PyLong_NumBits(args);
952 if (nbits == (size_t)-1 && PyErr_Occurred())
953 goto finally;
954 /* How many bytes do we need? There are nbits >> 3 full
955 * bytes of data, and nbits & 7 leftover bits. If there
956 * are any leftover bits, then we clearly need another
957 * byte. Wnat's not so obvious is that we *probably*
958 * need another byte even if there aren't any leftovers:
959 * the most-significant bit of the most-significant byte
960 * acts like a sign bit, and it's usually got a sense
961 * opposite of the one we need. The exception is longs
962 * of the form -(2**(8*j-1)) for j > 0. Such a long is
963 * its own 256's-complement, so has the right sign bit
964 * even without the extra byte. That's a pain to check
965 * for in advance, though, so we always grab an extra
966 * byte at the start, and cut it back later if possible.
967 */
968 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000970 PyErr_SetString(PyExc_OverflowError, "long too large "
971 "to pickle");
972 goto finally;
973 }
974 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
975 if (repr == NULL) goto finally;
976 pdata = (unsigned char *)PyString_AS_STRING(repr);
977 i = _PyLong_AsByteArray((PyLongObject *)args,
978 pdata, nbytes,
979 1 /* little endian */, 1 /* signed */);
980 if (i < 0) goto finally;
981 /* If the long is negative, this may be a byte more than
982 * needed. This is so iff the MSB is all redundant sign
983 * bits.
984 */
985 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
986 (pdata[nbytes - 2] & 0x80) != 0)
987 --nbytes;
988
989 if (nbytes < 256) {
990 c_str[0] = LONG1;
991 c_str[1] = (char)nbytes;
992 size = 2;
993 }
994 else {
995 c_str[0] = LONG4;
996 size = (int)nbytes;
997 for (i = 1; i < 5; i++) {
998 c_str[i] = (char)(size & 0xff);
999 size >>= 8;
1000 }
1001 size = 5;
1002 }
1003 i = self->write_func(self, c_str, size);
1004 if (i < 0) goto finally;
1005 i = self->write_func(self, (char *)pdata, (int)nbytes);
1006 if (i < 0) goto finally;
1007 res = 0;
1008 goto finally;
1009 }
1010
1011 /* proto < 2: write the repr and newline. This is quadratic-time
1012 * (in the number of digits), in both directions.
1013 */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001014 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((size = PyString_Size(repr)) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Tim Peters0bc93f52003-02-02 18:29:33 +00001023 if (self->write_func(self,
1024 PyString_AS_STRING((PyStringObject *)repr),
1025 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Tim Peters0bc93f52003-02-02 18:29:33 +00001028 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 finally:
1034 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036}
1037
1038
1039static int
Tim Peterscba30e22003-02-01 06:24:36 +00001040save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041{
1042 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001046 str[0] = BINFLOAT;
1047 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001049 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 return -1;
1051 }
1052 else {
1053 char c_str[250];
1054 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1056 /* Extend the formatted string with a newline character */
1057 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Tim Peters0bc93f52003-02-02 18:29:33 +00001059 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 return -1;
1061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064}
1065
1066
1067static int
Tim Peterscba30e22003-02-01 06:24:36 +00001068save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069{
1070 int size, len;
1071 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if ((size = PyString_Size(args)) < 0)
1074 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001076 if (!self->bin) {
1077 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001079 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001080
Walter Dörwald1ab83302007-05-18 17:15:44 +00001081 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001084 if ((len = PyString_Size(repr)) < 0)
1085 goto err;
1086 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Guido van Rossumaa588c42007-06-15 03:35:38 +00001088 /* Strip leading 's' due to repr() of str8() returning s'...' */
Guido van Rossum1718fd12007-07-03 20:30:03 +00001089 if (repr_str[0] == 's') {
Guido van Rossumaa588c42007-06-15 03:35:38 +00001090 repr_str++;
Guido van Rossum1718fd12007-07-03 20:30:03 +00001091 len--;
1092 }
Guido van Rossumaa588c42007-06-15 03:35:38 +00001093
Tim Peters0bc93f52003-02-02 18:29:33 +00001094 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001095 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001096
Tim Peters0bc93f52003-02-02 18:29:33 +00001097 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001098 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001099
Tim Peters0bc93f52003-02-02 18:29:33 +00001100 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001103 Py_XDECREF(repr);
1104 }
1105 else {
1106 int i;
1107 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 if ((size = PyString_Size(args)) < 0)
1110 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 if (size < 256) {
1113 c_str[0] = SHORT_BINSTRING;
1114 c_str[1] = size;
1115 len = 2;
1116 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 c_str[0] = BINSTRING;
1119 for (i = 1; i < 5; i++)
1120 c_str[i] = (int)(size >> ((i - 1) * 8));
1121 len = 5;
1122 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001123 else
1124 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 if (size > 128 && Pdata_Check(self->file)) {
1130 if (write_other(self, NULL, 0) < 0) return -1;
1131 PDATA_APPEND(self->file, args, -1);
1132 }
1133 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self,
1135 PyString_AS_STRING(
1136 (PyStringObject *)args),
1137 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return -1;
1139 }
1140 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 if (doput)
1143 if (put(self, args) < 0)
1144 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 err:
1149 Py_XDECREF(repr);
1150 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151}
1152
1153
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001154/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1155 backslash and newline characters to \uXXXX escapes. */
1156static PyObject *
1157modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1158{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 PyObject *repr;
1160 char *p;
1161 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 repr = PyString_FromStringAndSize(NULL, 6 * size);
1166 if (repr == NULL)
1167 return NULL;
1168 if (size == 0)
1169 return repr;
1170
1171 p = q = PyString_AS_STRING(repr);
1172 while (size-- > 0) {
1173 Py_UNICODE ch = *s++;
1174 /* Map 16-bit characters to '\uxxxx' */
1175 if (ch >= 256 || ch == '\\' || ch == '\n') {
1176 *p++ = '\\';
1177 *p++ = 'u';
1178 *p++ = hexdigit[(ch >> 12) & 0xf];
1179 *p++ = hexdigit[(ch >> 8) & 0xf];
1180 *p++ = hexdigit[(ch >> 4) & 0xf];
1181 *p++ = hexdigit[ch & 15];
1182 }
1183 /* Copy everything else as-is */
1184 else
1185 *p++ = (char) ch;
1186 }
1187 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001188 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001189 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001190}
1191
1192
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193static int
Tim Peterscba30e22003-02-01 06:24:36 +00001194save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001196 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 if (!PyUnicode_Check(args))
1200 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001202 if (!self->bin) {
1203 char *repr_str;
1204 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 repr = modified_EncodeRawUnicodeEscape(
1207 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001208 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if ((len = PyString_Size(repr)) < 0)
1212 goto err;
1213 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001214
Tim Peters0bc93f52003-02-02 18:29:33 +00001215 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001217
Tim Peters0bc93f52003-02-02 18:29:33 +00001218 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001220
Tim Peters0bc93f52003-02-02 18:29:33 +00001221 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001222 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 Py_XDECREF(repr);
1225 }
1226 else {
1227 int i;
1228 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001229
Tim Peterscba30e22003-02-01 06:24:36 +00001230 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001232
Guido van Rossum617dbc42007-05-07 23:57:08 +00001233 assert(PyBytes_Check(repr));
1234 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001236 if (size > INT_MAX)
1237 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 c_str[0] = BINUNICODE;
1240 for (i = 1; i < 5; i++)
1241 c_str[i] = (int)(size >> ((i - 1) * 8));
1242 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001243
Tim Peters0bc93f52003-02-02 18:29:33 +00001244 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 if (size > 128 && Pdata_Check(self->file)) {
1248 if (write_other(self, NULL, 0) < 0)
1249 goto err;
1250 PDATA_APPEND(self->file, repr, -1);
1251 }
1252 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001253 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001254 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 goto err;
1256 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 Py_DECREF(repr);
1259 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 if (doput)
1262 if (put(self, args) < 0)
1263 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 err:
1268 Py_XDECREF(repr);
1269 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001270}
1271
Tim Peters1d63c9f2003-02-02 20:29:39 +00001272/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1273static int
Tim Peters67920142003-02-05 03:46:17 +00001274store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001275{
1276 int i;
1277 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001278
Tim Peters1d63c9f2003-02-02 20:29:39 +00001279 assert(PyTuple_Size(t) == len);
1280
1281 for (i = 0; i < len; i++) {
1282 PyObject *element = PyTuple_GET_ITEM(t, i);
1283
1284 if (element == NULL)
1285 goto finally;
1286 if (save(self, element, 0) < 0)
1287 goto finally;
1288 }
1289 res = 0;
1290
1291 finally:
1292 return res;
1293}
1294
1295/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1296 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001297 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001298 * (a tuple can be reached from itself), and that requires some subtle
1299 * magic so that it works in all cases. IOW, this is a long routine.
1300 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001301static int
Tim Peterscba30e22003-02-01 06:24:36 +00001302save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001304 PyObject *py_tuple_id = NULL;
1305 int len, i;
1306 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001309 static char pop = POP;
1310 static char pop_mark = POP_MARK;
1311 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 if ((len = PyTuple_Size(args)) < 0)
1314 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Tim Peters1d63c9f2003-02-02 20:29:39 +00001316 if (len == 0) {
1317 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001318
Tim Peters1d63c9f2003-02-02 20:29:39 +00001319 if (self->proto) {
1320 c_str[0] = EMPTY_TUPLE;
1321 len = 1;
1322 }
1323 else {
1324 c_str[0] = MARK;
1325 c_str[1] = TUPLE;
1326 len = 2;
1327 }
1328 if (self->write_func(self, c_str, len) >= 0)
1329 res = 0;
1330 /* Don't memoize an empty tuple. */
1331 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001333
Tim Peters1d63c9f2003-02-02 20:29:39 +00001334 /* A non-empty tuple. */
1335
1336 /* id(tuple) isn't in the memo now. If it shows up there after
1337 * saving the tuple elements, the tuple must be recursive, in
1338 * which case we'll pop everything we put on the stack, and fetch
1339 * its value from the memo.
1340 */
1341 py_tuple_id = PyLong_FromVoidPtr(args);
1342 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001344
Tim Peters1d63c9f2003-02-02 20:29:39 +00001345 if (len <= 3 && self->proto >= 2) {
1346 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001347 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001348 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001350 /* pop the len elements */
1351 for (i = 0; i < len; ++i)
1352 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001354 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if (get(self, py_tuple_id) < 0)
1356 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 res = 0;
1358 goto finally;
1359 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001360 /* Not recursive. */
1361 if (self->write_func(self, len2opcode + len, 1) < 0)
1362 goto finally;
1363 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001365
Tim Peters1d63c9f2003-02-02 20:29:39 +00001366 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1367 * Generate MARK elt1 elt2 ... TUPLE
1368 */
1369 if (self->write_func(self, &MARKv, 1) < 0)
1370 goto finally;
1371
Tim Peters67920142003-02-05 03:46:17 +00001372 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001373 goto finally;
1374
1375 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1376 /* pop the stack stuff we pushed */
1377 if (self->bin) {
1378 if (self->write_func(self, &pop_mark, 1) < 0)
1379 goto finally;
1380 }
1381 else {
1382 /* Note that we pop one more than len, to remove
1383 * the MARK too.
1384 */
1385 for (i = 0; i <= len; i++)
1386 if (self->write_func(self, &pop, 1) < 0)
1387 goto finally;
1388 }
1389 /* fetch from memo */
1390 if (get(self, py_tuple_id) >= 0)
1391 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 goto finally;
1393 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001394
Tim Peters1d63c9f2003-02-02 20:29:39 +00001395 /* Not recursive. */
1396 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001398
Tim Peters1d63c9f2003-02-02 20:29:39 +00001399 memoize:
1400 if (put(self, args) >= 0)
1401 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 finally:
1404 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001406}
1407
Tim Peters1092d642003-02-11 21:06:20 +00001408/* iter is an iterator giving items, and we batch up chunks of
1409 * MARK item item ... item APPENDS
1410 * opcode sequences. Calling code should have arranged to first create an
1411 * empty list, or list-like object, for the APPENDS to operate on.
1412 * Returns 0 on success, <0 on error.
1413 */
1414static int
1415batch_list(Picklerobject *self, PyObject *iter)
1416{
1417 PyObject *obj;
1418 PyObject *slice[BATCHSIZE];
1419 int i, n;
1420
1421 static char append = APPEND;
1422 static char appends = APPENDS;
1423
1424 assert(iter != NULL);
1425
1426 if (self->proto == 0) {
1427 /* APPENDS isn't available; do one at a time. */
1428 for (;;) {
1429 obj = PyIter_Next(iter);
1430 if (obj == NULL) {
1431 if (PyErr_Occurred())
1432 return -1;
1433 break;
1434 }
1435 i = save(self, obj, 0);
1436 Py_DECREF(obj);
1437 if (i < 0)
1438 return -1;
1439 if (self->write_func(self, &append, 1) < 0)
1440 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001441 }
1442 return 0;
1443 }
1444
1445 /* proto > 0: write in batches of BATCHSIZE. */
1446 do {
1447 /* Get next group of (no more than) BATCHSIZE elements. */
1448 for (n = 0; n < BATCHSIZE; ++n) {
1449 obj = PyIter_Next(iter);
1450 if (obj == NULL) {
1451 if (PyErr_Occurred())
1452 goto BatchFailed;
1453 break;
1454 }
1455 slice[n] = obj;
1456 }
1457
1458 if (n > 1) {
1459 /* Pump out MARK, slice[0:n], APPENDS. */
1460 if (self->write_func(self, &MARKv, 1) < 0)
1461 goto BatchFailed;
1462 for (i = 0; i < n; ++i) {
1463 if (save(self, slice[i], 0) < 0)
1464 goto BatchFailed;
1465 }
1466 if (self->write_func(self, &appends, 1) < 0)
1467 goto BatchFailed;
1468 }
1469 else if (n == 1) {
1470 if (save(self, slice[0], 0) < 0)
1471 goto BatchFailed;
1472 if (self->write_func(self, &append, 1) < 0)
1473 goto BatchFailed;
1474 }
1475
1476 for (i = 0; i < n; ++i) {
1477 Py_DECREF(slice[i]);
1478 }
Tim Peters90975f12003-02-12 05:28:58 +00001479 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001480 return 0;
1481
1482BatchFailed:
1483 while (--n >= 0) {
1484 Py_DECREF(slice[n]);
1485 }
1486 return -1;
1487}
1488
Guido van Rossum60456fd1997-04-09 17:36:32 +00001489static int
Tim Peterscba30e22003-02-01 06:24:36 +00001490save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491{
Tim Peters1092d642003-02-11 21:06:20 +00001492 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001494 int len;
1495 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001497 if (self->fast && !fast_save_enter(self, args))
1498 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001499
Tim Peters1092d642003-02-11 21:06:20 +00001500 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 if (self->bin) {
1502 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001503 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 }
1505 else {
1506 s[0] = MARK;
1507 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001508 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001510
Tim Peters1092d642003-02-11 21:06:20 +00001511 if (self->write_func(self, s, len) < 0)
1512 goto finally;
1513
1514 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 if ((len = PyList_Size(args)) < 0)
1516 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517
Tim Peters1092d642003-02-11 21:06:20 +00001518 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001519 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001520 if (put(self, args) >= 0)
1521 res = 0;
1522 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 }
Tim Peters90975f12003-02-12 05:28:58 +00001524 if (put2(self, args) < 0)
1525 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001526
Tim Peters1092d642003-02-11 21:06:20 +00001527 /* Materialize the list elements. */
1528 iter = PyObject_GetIter(args);
1529 if (iter == NULL)
1530 goto finally;
1531 res = batch_list(self, iter);
1532 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001534 finally:
1535 if (self->fast && !fast_save_leave(self, args))
1536 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001538 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001539}
1540
1541
Tim Peters42f08ac2003-02-11 22:43:24 +00001542/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1543 * MARK key value ... key value SETITEMS
1544 * opcode sequences. Calling code should have arranged to first create an
1545 * empty dict, or dict-like object, for the SETITEMS to operate on.
1546 * Returns 0 on success, <0 on error.
1547 *
1548 * This is very much like batch_list(). The difference between saving
1549 * elements directly, and picking apart two-tuples, is so long-winded at
1550 * the C level, though, that attempts to combine these routines were too
1551 * ugly to bear.
1552 */
1553static int
1554batch_dict(Picklerobject *self, PyObject *iter)
1555{
1556 PyObject *p;
1557 PyObject *slice[BATCHSIZE];
1558 int i, n;
1559
1560 static char setitem = SETITEM;
1561 static char setitems = SETITEMS;
1562
1563 assert(iter != NULL);
1564
1565 if (self->proto == 0) {
1566 /* SETITEMS isn't available; do one at a time. */
1567 for (;;) {
1568 p = PyIter_Next(iter);
1569 if (p == NULL) {
1570 if (PyErr_Occurred())
1571 return -1;
1572 break;
1573 }
1574 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1575 PyErr_SetString(PyExc_TypeError, "dict items "
1576 "iterator must return 2-tuples");
1577 return -1;
1578 }
1579 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1580 if (i >= 0)
1581 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1582 Py_DECREF(p);
1583 if (i < 0)
1584 return -1;
1585 if (self->write_func(self, &setitem, 1) < 0)
1586 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001587 }
1588 return 0;
1589 }
1590
1591 /* proto > 0: write in batches of BATCHSIZE. */
1592 do {
1593 /* Get next group of (no more than) BATCHSIZE elements. */
1594 for (n = 0; n < BATCHSIZE; ++n) {
1595 p = PyIter_Next(iter);
1596 if (p == NULL) {
1597 if (PyErr_Occurred())
1598 goto BatchFailed;
1599 break;
1600 }
1601 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1602 PyErr_SetString(PyExc_TypeError, "dict items "
1603 "iterator must return 2-tuples");
1604 goto BatchFailed;
1605 }
1606 slice[n] = p;
1607 }
1608
1609 if (n > 1) {
1610 /* Pump out MARK, slice[0:n], SETITEMS. */
1611 if (self->write_func(self, &MARKv, 1) < 0)
1612 goto BatchFailed;
1613 for (i = 0; i < n; ++i) {
1614 p = slice[i];
1615 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1616 goto BatchFailed;
1617 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1618 goto BatchFailed;
1619 }
1620 if (self->write_func(self, &setitems, 1) < 0)
1621 goto BatchFailed;
1622 }
1623 else if (n == 1) {
1624 p = slice[0];
1625 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1626 goto BatchFailed;
1627 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1628 goto BatchFailed;
1629 if (self->write_func(self, &setitem, 1) < 0)
1630 goto BatchFailed;
1631 }
1632
1633 for (i = 0; i < n; ++i) {
1634 Py_DECREF(slice[i]);
1635 }
Tim Peters90975f12003-02-12 05:28:58 +00001636 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001637 return 0;
1638
1639BatchFailed:
1640 while (--n >= 0) {
1641 Py_DECREF(slice[n]);
1642 }
1643 return -1;
1644}
1645
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646static int
Tim Peterscba30e22003-02-01 06:24:36 +00001647save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648{
Tim Peters42f08ac2003-02-11 22:43:24 +00001649 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001650 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001651 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001652 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if (self->fast && !fast_save_enter(self, args))
1655 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001656
Tim Peters42f08ac2003-02-11 22:43:24 +00001657 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 if (self->bin) {
1659 s[0] = EMPTY_DICT;
1660 len = 1;
1661 }
1662 else {
1663 s[0] = MARK;
1664 s[1] = DICT;
1665 len = 2;
1666 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001667
Tim Peters0bc93f52003-02-02 18:29:33 +00001668 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001670
Tim Peters42f08ac2003-02-11 22:43:24 +00001671 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if ((len = PyDict_Size(args)) < 0)
1673 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001676 if (put(self, args) >= 0)
1677 res = 0;
1678 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 }
Tim Peters90975f12003-02-12 05:28:58 +00001680 if (put2(self, args) < 0)
1681 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001682
Tim Peters42f08ac2003-02-11 22:43:24 +00001683 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001684 items = PyObject_CallMethod(args, "items", "()");
1685 if (items == NULL)
1686 goto finally;
1687 iter = PyObject_GetIter(items);
1688 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001689 if (iter == NULL)
1690 goto finally;
1691 res = batch_dict(self, iter);
1692 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 finally:
1695 if (self->fast && !fast_save_leave(self, args))
1696 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001699}
1700
1701
Guido van Rossum60456fd1997-04-09 17:36:32 +00001702static int
Tim Peterscba30e22003-02-01 06:24:36 +00001703save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001705 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 char *name_str, *module_str;
1707 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 if (name) {
1712 global_name = name;
1713 Py_INCREF(global_name);
1714 }
1715 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001716 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 goto finally;
1718 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001719
Tim Peterscba30e22003-02-01 06:24:36 +00001720 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 if ((module_size = PyString_Size(module)) < 0 ||
1724 (name_size = PyString_Size(global_name)) < 0)
1725 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001726
Martin v. Löwis5b222132007-06-10 09:51:05 +00001727 module_str = PyUnicode_AsString(module);
1728 name_str = PyUnicode_AsString(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Guido van Rossum75bfd052002-12-24 18:10:07 +00001730 /* XXX This can be doing a relative import. Clearly it shouldn't,
1731 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 mod = PyImport_ImportModule(module_str);
1733 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001734 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001735 "Can't pickle %s: import of module %s "
1736 "failed",
1737 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 goto finally;
1739 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001740 klass = PyObject_GetAttr(mod, global_name);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001741 if (klass == NULL) {
1742 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001743 "Can't pickle %s: attribute lookup %s.%s "
1744 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 "OSS", args, module, global_name);
1746 goto finally;
1747 }
1748 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001749 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001751 "Can't pickle %s: it's not the same object "
1752 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 "OSS", args, module, global_name);
1754 goto finally;
1755 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001756 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001757
Tim Peters731098b2003-02-04 20:56:09 +00001758 if (self->proto >= 2) {
1759 /* See whether this is in the extension registry, and if
1760 * so generate an EXT opcode.
1761 */
1762 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001763 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001764 char c_str[5];
1765 int n;
1766
1767 PyTuple_SET_ITEM(two_tuple, 0, module);
1768 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1769 py_code = PyDict_GetItem(extension_registry, two_tuple);
1770 if (py_code == NULL)
1771 goto gen_global; /* not registered */
1772
1773 /* Verify py_code has the right type and value. */
1774 if (!PyInt_Check(py_code)) {
1775 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001776 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001777 "OO", args, py_code);
1778 goto finally;
1779 }
1780 code = PyInt_AS_LONG(py_code);
1781 if (code <= 0 || code > 0x7fffffffL) {
1782 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1783 "extension code %ld is out of range",
1784 "Ol", args, code);
1785 goto finally;
1786 }
1787
1788 /* Generate an EXT opcode. */
1789 if (code <= 0xff) {
1790 c_str[0] = EXT1;
1791 c_str[1] = (char)code;
1792 n = 2;
1793 }
1794 else if (code <= 0xffff) {
1795 c_str[0] = EXT2;
1796 c_str[1] = (char)(code & 0xff);
1797 c_str[2] = (char)((code >> 8) & 0xff);
1798 n = 3;
1799 }
1800 else {
1801 c_str[0] = EXT4;
1802 c_str[1] = (char)(code & 0xff);
1803 c_str[2] = (char)((code >> 8) & 0xff);
1804 c_str[3] = (char)((code >> 16) & 0xff);
1805 c_str[4] = (char)((code >> 24) & 0xff);
1806 n = 5;
1807 }
1808
1809 if (self->write_func(self, c_str, n) >= 0)
1810 res = 0;
1811 goto finally; /* and don't memoize */
1812 }
1813
1814 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001815 if (self->write_func(self, &global, 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, module_str, module_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
Tim Peters0bc93f52003-02-02 18:29:33 +00001824 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Tim Peters0bc93f52003-02-02 18:29:33 +00001827 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 if (put(self, args) < 0)
1831 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 finally:
1836 Py_XDECREF(module);
1837 Py_XDECREF(global_name);
1838 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001841}
1842
Guido van Rossum60456fd1997-04-09 17:36:32 +00001843static int
Tim Peterscba30e22003-02-01 06:24:36 +00001844save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845{
1846 PyObject *pid = 0;
1847 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 Py_INCREF(args);
1852 ARG_TUP(self, args);
1853 if (self->arg) {
1854 pid = PyObject_Call(f, self->arg, NULL);
1855 FREE_ARG_TUP(self);
1856 }
1857 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 if (pid != Py_None) {
1860 if (!self->bin) {
1861 if (!PyString_Check(pid)) {
1862 PyErr_SetString(PicklingError,
1863 "persistent id must be string");
1864 goto finally;
1865 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if ((size = PyString_Size(pid)) < 0)
1871 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Tim Peters0bc93f52003-02-02 18:29:33 +00001873 if (self->write_func(self,
1874 PyString_AS_STRING(
1875 (PyStringObject *)pid),
1876 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001878
Tim Peters0bc93f52003-02-02 18:29:33 +00001879 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 res = 1;
1883 goto finally;
1884 }
1885 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001886 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001887 res = -1;
1888 else
1889 res = 1;
1890 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 goto finally;
1893 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 finally:
1898 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001901}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001902
Tim Peters71fcda52003-02-14 23:05:28 +00001903/* We're saving ob, and args is the 2-thru-5 tuple returned by the
1904 * appropriate __reduce__ method for ob.
1905 */
Tim Peters84e87f32001-03-17 04:50:51 +00001906static int
Tim Peters71fcda52003-02-14 23:05:28 +00001907save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908{
Tim Peters71fcda52003-02-14 23:05:28 +00001909 PyObject *callable;
1910 PyObject *argtup;
1911 PyObject *state = NULL;
1912 PyObject *listitems = NULL;
1913 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Tim Peters71fcda52003-02-14 23:05:28 +00001915 int use_newobj = self->proto >= 2;
1916
1917 static char reduce = REDUCE;
1918 static char build = BUILD;
1919 static char newobj = NEWOBJ;
1920
1921 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
1922 &callable,
1923 &argtup,
1924 &state,
1925 &listitems,
1926 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00001929 if (!PyTuple_Check(argtup)) {
1930 PyErr_SetString(PicklingError,
1931 "args from reduce() should be a tuple");
1932 return -1;
1933 }
1934
Tim Peters71fcda52003-02-14 23:05:28 +00001935 if (state == Py_None)
1936 state = NULL;
1937 if (listitems == Py_None)
1938 listitems = NULL;
1939 if (dictitems == Py_None)
1940 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Tim Peters71fcda52003-02-14 23:05:28 +00001942 /* Protocol 2 special case: if callable's name is __newobj__, use
1943 * NEWOBJ. This consumes a lot of code.
1944 */
1945 if (use_newobj) {
1946 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Tim Peters71fcda52003-02-14 23:05:28 +00001948 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001949 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1950 PyErr_Clear();
1951 else
1952 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00001953 use_newobj = 0;
1954 }
1955 else {
1956 use_newobj = PyString_Check(temp) &&
1957 strcmp(PyString_AS_STRING(temp),
1958 "__newobj__") == 0;
1959 Py_DECREF(temp);
1960 }
1961 }
1962 if (use_newobj) {
1963 PyObject *cls;
1964 PyObject *newargtup;
1965 int n, i;
1966
1967 /* Sanity checks. */
1968 n = PyTuple_Size(argtup);
1969 if (n < 1) {
1970 PyErr_SetString(PicklingError, "__newobj__ arglist "
1971 "is empty");
1972 return -1;
1973 }
1974
1975 cls = PyTuple_GET_ITEM(argtup, 0);
1976 if (! PyObject_HasAttrString(cls, "__new__")) {
1977 PyErr_SetString(PicklingError, "args[0] from "
1978 "__newobj__ args has no __new__");
1979 return -1;
1980 }
1981
1982 /* XXX How could ob be NULL? */
1983 if (ob != NULL) {
1984 PyObject *ob_dot_class;
1985
1986 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001987 if (ob_dot_class == NULL) {
1988 if (PyErr_ExceptionMatches(
1989 PyExc_AttributeError))
1990 PyErr_Clear();
1991 else
1992 return -1;
1993 }
Tim Peters71fcda52003-02-14 23:05:28 +00001994 i = ob_dot_class != cls; /* true iff a problem */
1995 Py_XDECREF(ob_dot_class);
1996 if (i) {
1997 PyErr_SetString(PicklingError, "args[0] from "
1998 "__newobj__ args has the wrong class");
1999 return -1;
2000 }
2001 }
2002
2003 /* Save the class and its __new__ arguments. */
2004 if (save(self, cls, 0) < 0)
2005 return -1;
2006
2007 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2008 if (newargtup == NULL)
2009 return -1;
2010 for (i = 1; i < n; ++i) {
2011 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2012 Py_INCREF(temp);
2013 PyTuple_SET_ITEM(newargtup, i-1, temp);
2014 }
2015 i = save(self, newargtup, 0) < 0;
2016 Py_DECREF(newargtup);
2017 if (i < 0)
2018 return -1;
2019
2020 /* Add NEWOBJ opcode. */
2021 if (self->write_func(self, &newobj, 1) < 0)
2022 return -1;
2023 }
2024 else {
2025 /* Not using NEWOBJ. */
2026 if (save(self, callable, 0) < 0 ||
2027 save(self, argtup, 0) < 0 ||
2028 self->write_func(self, &reduce, 1) < 0)
2029 return -1;
2030 }
2031
2032 /* Memoize. */
2033 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 if (ob != NULL) {
2035 if (state && !PyDict_Check(state)) {
2036 if (put2(self, ob) < 0)
2037 return -1;
2038 }
Tim Peters71fcda52003-02-14 23:05:28 +00002039 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002041 }
Tim Peters84e87f32001-03-17 04:50:51 +00002042
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Tim Peters71fcda52003-02-14 23:05:28 +00002044 if (listitems && batch_list(self, listitems) < 0)
2045 return -1;
2046
2047 if (dictitems && batch_dict(self, dictitems) < 0)
2048 return -1;
2049
2050 if (state) {
2051 if (save(self, state, 0) < 0 ||
2052 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 return -1;
2054 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002057}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058
Guido van Rossum60456fd1997-04-09 17:36:32 +00002059static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002060save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002061{
2062 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002063 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2064 PyObject *arg_tup;
2065 int res = -1;
2066 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Martin v. Löwis5a395302002-08-04 08:20:23 +00002068 if (self->nesting++ > Py_GetRecursionLimit()){
2069 PyErr_SetString(PyExc_RuntimeError,
2070 "maximum recursion depth exceeded");
2071 goto finally;
2072 }
2073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 if (!pers_save && self->pers_func) {
2075 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2076 res = tmp;
2077 goto finally;
2078 }
2079 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 if (args == Py_None) {
2082 res = save_none(self, args);
2083 goto finally;
2084 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002089 case 'b':
2090 if (args == Py_False || args == Py_True) {
2091 res = save_bool(self, args);
2092 goto finally;
2093 }
2094 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002095 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (type == &PyLong_Type) {
2097 res = save_long(self, args);
2098 goto finally;
2099 }
2100 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002101
Guido van Rossum60456fd1997-04-09 17:36:32 +00002102 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 if (type == &PyFloat_Type) {
2104 res = save_float(self, args);
2105 goto finally;
2106 }
2107 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002108
Guido van Rossum60456fd1997-04-09 17:36:32 +00002109 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002110 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2111 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 goto finally;
2113 }
2114 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002115
Guido van Rossum32c38e72007-05-07 17:15:57 +00002116 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2118 res = save_string(self, args, 0);
2119 goto finally;
2120 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002121 if ((type == &PyUnicode_Type) && (PyUnicode_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 res = save_unicode(self, args, 0);
2123 goto finally;
2124 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002128 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131 if (PyDict_GetItem(self->memo, py_ob_id)) {
2132 if (get(self, py_ob_id) < 0)
2133 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 res = 0;
2136 goto finally;
2137 }
2138 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002141 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 if (type == &PyString_Type) {
2143 res = save_string(self, args, 1);
2144 goto finally;
2145 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 if (type == &PyUnicode_Type) {
2147 res = save_unicode(self, args, 1);
2148 goto finally;
2149 }
2150 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002151
Guido van Rossum60456fd1997-04-09 17:36:32 +00002152 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002153 if (type == &PyTuple_Type) {
2154 res = save_tuple(self, args);
2155 goto finally;
2156 }
2157 if (type == &PyType_Type) {
2158 res = save_global(self, args, NULL);
2159 goto finally;
2160 }
2161 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002162
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 if (type == &PyList_Type) {
2165 res = save_list(self, args);
2166 goto finally;
2167 }
2168 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002169
2170 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002171 if (type == &PyDict_Type) {
2172 res = save_dict(self, args);
2173 goto finally;
2174 }
2175 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002176
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002177 case 'i':
2178 break;
2179
2180 case 'c':
2181 break;
2182
Guido van Rossum60456fd1997-04-09 17:36:32 +00002183 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 if (type == &PyFunction_Type) {
2185 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002186 if (res && PyErr_ExceptionMatches(PickleError)) {
2187 /* fall back to reduce */
2188 PyErr_Clear();
2189 break;
2190 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 goto finally;
2192 }
2193 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002194
2195 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002196 if (type == &PyCFunction_Type) {
2197 res = save_global(self, args, NULL);
2198 goto finally;
2199 }
2200 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 if (!pers_save && self->inst_pers_func) {
2203 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2204 res = tmp;
2205 goto finally;
2206 }
2207 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002208
Jeremy Hylton39c61162002-07-16 19:47:43 +00002209 if (PyType_IsSubtype(type, &PyType_Type)) {
2210 res = save_global(self, args, NULL);
2211 goto finally;
2212 }
2213
Guido van Rossumb289b872003-02-19 01:45:13 +00002214 /* Get a reduction callable, and call it. This may come from
2215 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2216 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002217 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002218 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2219 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002220 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002221 Py_INCREF(args);
2222 ARG_TUP(self, args);
2223 if (self->arg) {
2224 t = PyObject_Call(__reduce__, self->arg, NULL);
2225 FREE_ARG_TUP(self);
2226 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002227 }
2228 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002229 /* Check for a __reduce_ex__ method. */
2230 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2231 if (__reduce__ != NULL) {
2232 t = PyInt_FromLong(self->proto);
2233 if (t != NULL) {
2234 ARG_TUP(self, t);
2235 t = NULL;
2236 if (self->arg) {
2237 t = PyObject_Call(__reduce__,
2238 self->arg, NULL);
2239 FREE_ARG_TUP(self);
2240 }
2241 }
2242 }
2243 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002244 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2245 PyErr_Clear();
2246 else
2247 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002248 /* Check for a __reduce__ method. */
2249 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2250 if (__reduce__ != NULL) {
2251 t = PyObject_Call(__reduce__,
2252 empty_tuple, NULL);
2253 }
2254 else {
2255 PyErr_SetObject(UnpickleableError, args);
2256 goto finally;
2257 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002259 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002260
Tim Peters71fcda52003-02-14 23:05:28 +00002261 if (t == NULL)
2262 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002263
Tim Peters71fcda52003-02-14 23:05:28 +00002264 if (PyString_Check(t)) {
2265 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002266 goto finally;
2267 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268
Tim Peters71fcda52003-02-14 23:05:28 +00002269 if (! PyTuple_Check(t)) {
2270 cPickle_ErrFormat(PicklingError, "Value returned by "
2271 "%s must be string or tuple",
2272 "O", __reduce__);
2273 goto finally;
2274 }
2275
2276 size = PyTuple_Size(t);
2277 if (size < 2 || size > 5) {
2278 cPickle_ErrFormat(PicklingError, "tuple returned by "
2279 "%s must contain 2 through 5 elements",
2280 "O", __reduce__);
2281 goto finally;
2282 }
2283
2284 arg_tup = PyTuple_GET_ITEM(t, 1);
2285 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2286 cPickle_ErrFormat(PicklingError, "Second element of "
2287 "tuple returned by %s must be a tuple",
2288 "O", __reduce__);
2289 goto finally;
2290 }
2291
2292 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002295 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 Py_XDECREF(py_ob_id);
2297 Py_XDECREF(__reduce__);
2298 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002301}
2302
2303
2304static int
Tim Peterscba30e22003-02-01 06:24:36 +00002305dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306{
2307 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002308
Tim Peters4190fb82003-02-02 16:09:05 +00002309 if (self->proto >= 2) {
2310 char bytes[2];
2311
2312 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002313 assert(self->proto >= 0 && self->proto < 256);
2314 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002315 if (self->write_func(self, bytes, 2) < 0)
2316 return -1;
2317 }
2318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002319 if (save(self, args, 0) < 0)
2320 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002321
Tim Peters4190fb82003-02-02 16:09:05 +00002322 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002324
Tim Peters4190fb82003-02-02 16:09:05 +00002325 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002329}
2330
2331static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002332Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333{
Tim Peterscba30e22003-02-01 06:24:36 +00002334 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 PyDict_Clear(self->memo);
2336 Py_INCREF(Py_None);
2337 return Py_None;
2338}
2339
2340static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002341Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342{
2343 int l, i, rsize, ssize, clear=1, lm;
2344 long ik;
2345 PyObject *k, *r;
2346 char *s, *p, *have_get;
2347 Pdata *data;
2348
2349 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002350 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002351 return NULL;
2352
2353 /* Check to make sure we are based on a list */
2354 if (! Pdata_Check(self->file)) {
2355 PyErr_SetString(PicklingError,
2356 "Attempt to getvalue() a non-list-based pickler");
2357 return NULL;
2358 }
2359
2360 /* flush write buffer */
2361 if (write_other(self, NULL, 0) < 0) return NULL;
2362
2363 data=(Pdata*)self->file;
2364 l=data->length;
2365
2366 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002367 lm = PyDict_Size(self->memo);
2368 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002369 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002370 have_get = malloc(lm);
2371 if (have_get == NULL) return PyErr_NoMemory();
2372 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373
2374 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002375 for (rsize = 0, i = l; --i >= 0; ) {
2376 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377
Tim Petersac5687a2003-02-02 18:08:34 +00002378 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380
2381 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002382 ik = PyInt_AsLong(k);
2383 if (ik == -1 && PyErr_Occurred())
2384 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002385 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386 PyErr_SetString(PicklingError,
2387 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002388 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002389 }
Tim Petersac5687a2003-02-02 18:08:34 +00002390 if (have_get[ik]) /* with matching get */
2391 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392 }
2393
2394 else if (! (PyTuple_Check(k) &&
2395 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002396 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 ) {
2398 PyErr_SetString(PicklingError,
2399 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002400 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 }
2402
2403 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002404 ik = PyInt_AsLong(k);
2405 if (ik == -1 && PyErr_Occurred())
2406 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002407 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 PyErr_SetString(PicklingError,
2409 "Invalid get data");
2410 return NULL;
2411 }
Tim Petersac5687a2003-02-02 18:08:34 +00002412 have_get[ik] = 1;
2413 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415 }
2416
2417 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002418 r = PyString_FromStringAndSize(NULL, rsize);
2419 if (r == NULL) goto err;
2420 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421
Tim Petersac5687a2003-02-02 18:08:34 +00002422 for (i = 0; i < l; i++) {
2423 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424
2425 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002426 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002428 p=PyString_AS_STRING((PyStringObject *)k);
2429 while (--ssize >= 0)
2430 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 }
2432 }
2433
2434 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002435 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2436 if (ik == -1 && PyErr_Occurred())
2437 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (ik < 256) {
2439 *s++ = BINGET;
2440 *s++ = (int)(ik & 0xff);
2441 }
2442 else {
2443 *s++ = LONG_BINGET;
2444 *s++ = (int)(ik & 0xff);
2445 *s++ = (int)((ik >> 8) & 0xff);
2446 *s++ = (int)((ik >> 16) & 0xff);
2447 *s++ = (int)((ik >> 24) & 0xff);
2448 }
2449 }
2450
2451 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002452 ik = PyLong_AsLong(k);
2453 if (ik == -1 && PyErr_Occurred())
2454 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002455
2456 if (have_get[ik]) { /* with matching get */
2457 if (ik < 256) {
2458 *s++ = BINPUT;
2459 *s++ = (int)(ik & 0xff);
2460 }
2461 else {
2462 *s++ = LONG_BINPUT;
2463 *s++ = (int)(ik & 0xff);
2464 *s++ = (int)((ik >> 8) & 0xff);
2465 *s++ = (int)((ik >> 16) & 0xff);
2466 *s++ = (int)((ik >> 24) & 0xff);
2467 }
2468 }
2469 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002470 }
2471
2472 if (clear) {
2473 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002474 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 }
2476
2477 free(have_get);
2478 return r;
2479 err:
2480 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002481 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002482}
2483
2484static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002485Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002486{
2487 PyObject *ob;
2488 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002489
Tim Peterscba30e22003-02-01 06:24:36 +00002490 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 if (dump(self, ob) < 0)
2494 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002496 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002498 /* XXX Why does dump() return self? */
2499 Py_INCREF(self);
2500 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002501}
2502
2503
Tim Peterscba30e22003-02-01 06:24:36 +00002504static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505{
Neal Norwitzb0493252002-03-31 14:44:22 +00002506 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002507 PyDoc_STR("dump(object) -- "
2508 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002509 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002510 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002511 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002512 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002513 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002514};
2515
2516
2517static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002518newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519{
2520 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002521
Tim Peters5bd2a792003-02-01 16:45:06 +00002522 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002523 proto = HIGHEST_PROTOCOL;
2524 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002525 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2526 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002527 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002528 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002529 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002530
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002531 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002532 if (self == NULL)
2533 return NULL;
2534 self->proto = proto;
2535 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 self->fp = NULL;
2537 self->write = NULL;
2538 self->memo = NULL;
2539 self->arg = NULL;
2540 self->pers_func = NULL;
2541 self->inst_pers_func = NULL;
2542 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002544 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 self->fast_container = 0;
2546 self->fast_memo = NULL;
2547 self->buf_size = 0;
2548 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549
Tim Peters5bd2a792003-02-01 16:45:06 +00002550 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002551 if (file)
2552 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002553 else {
2554 file = Pdata_New();
2555 if (file == NULL)
2556 goto err;
2557 }
2558 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002559
Tim Peterscba30e22003-02-01 06:24:36 +00002560 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002562
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002563 if (PycStringIO_OutputCheck(file)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564 self->write_func = write_cStringIO;
2565 }
2566 else if (file == Py_None) {
2567 self->write_func = write_none;
2568 }
2569 else {
2570 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572 if (! Pdata_Check(file)) {
2573 self->write = PyObject_GetAttr(file, write_str);
2574 if (!self->write) {
2575 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002576 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577 "argument must have 'write' "
2578 "attribute");
2579 goto err;
2580 }
2581 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002582
Tim Peters5bd2a792003-02-01 16:45:06 +00002583 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2584 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 PyErr_NoMemory();
2586 goto err;
2587 }
2588 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002589
Guido van Rossuma8add0e2007-05-14 22:03:55 +00002590 self->dispatch_table = dispatch_table;
2591 Py_INCREF(dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002592 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002597 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002599}
2600
2601
2602static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002603get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002605 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002607 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002608
Tim Peters92c8bb32003-02-13 23:00:26 +00002609 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002610 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002611 * accepts Pickler() and Pickler(integer) too. The meaning then
2612 * is clear as mud, undocumented, and not supported by pickle.py.
2613 * I'm told Zope uses this, but I haven't traced into this code
2614 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002615 */
2616 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002618 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002619 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2620 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 return NULL;
2622 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002623 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002624}
2625
2626
2627static void
Tim Peterscba30e22003-02-01 06:24:36 +00002628Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002629{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002630 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 Py_XDECREF(self->write);
2632 Py_XDECREF(self->memo);
2633 Py_XDECREF(self->fast_memo);
2634 Py_XDECREF(self->arg);
2635 Py_XDECREF(self->file);
2636 Py_XDECREF(self->pers_func);
2637 Py_XDECREF(self->inst_pers_func);
2638 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002639 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002640 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002641}
2642
2643static int
2644Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2645{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002646 Py_VISIT(self->write);
2647 Py_VISIT(self->memo);
2648 Py_VISIT(self->fast_memo);
2649 Py_VISIT(self->arg);
2650 Py_VISIT(self->file);
2651 Py_VISIT(self->pers_func);
2652 Py_VISIT(self->inst_pers_func);
2653 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002654 return 0;
2655}
2656
2657static int
2658Pickler_clear(Picklerobject *self)
2659{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002660 Py_CLEAR(self->write);
2661 Py_CLEAR(self->memo);
2662 Py_CLEAR(self->fast_memo);
2663 Py_CLEAR(self->arg);
2664 Py_CLEAR(self->file);
2665 Py_CLEAR(self->pers_func);
2666 Py_CLEAR(self->inst_pers_func);
2667 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002668 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002669}
2670
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002671static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002672Pickler_get_pers_func(Picklerobject *p)
2673{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002674 if (p->pers_func == NULL)
2675 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2676 else
2677 Py_INCREF(p->pers_func);
2678 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002679}
2680
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002681static int
2682Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2683{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 if (v == NULL) {
2685 PyErr_SetString(PyExc_TypeError,
2686 "attribute deletion is not supported");
2687 return -1;
2688 }
2689 Py_XDECREF(p->pers_func);
2690 Py_INCREF(v);
2691 p->pers_func = v;
2692 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002693}
2694
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002695static int
2696Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2697{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 if (v == NULL) {
2699 PyErr_SetString(PyExc_TypeError,
2700 "attribute deletion is not supported");
2701 return -1;
2702 }
2703 Py_XDECREF(p->inst_pers_func);
2704 Py_INCREF(v);
2705 p->inst_pers_func = v;
2706 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002707}
2708
2709static PyObject *
2710Pickler_get_memo(Picklerobject *p)
2711{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 if (p->memo == NULL)
2713 PyErr_SetString(PyExc_AttributeError, "memo");
2714 else
2715 Py_INCREF(p->memo);
2716 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002717}
2718
2719static int
2720Pickler_set_memo(Picklerobject *p, PyObject *v)
2721{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 if (v == NULL) {
2723 PyErr_SetString(PyExc_TypeError,
2724 "attribute deletion is not supported");
2725 return -1;
2726 }
2727 if (!PyDict_Check(v)) {
2728 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2729 return -1;
2730 }
2731 Py_XDECREF(p->memo);
2732 Py_INCREF(v);
2733 p->memo = v;
2734 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002735}
2736
2737static PyObject *
2738Pickler_get_error(Picklerobject *p)
2739{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 /* why is this an attribute on the Pickler? */
2741 Py_INCREF(PicklingError);
2742 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002743}
2744
2745static PyMemberDef Pickler_members[] = {
2746 {"binary", T_INT, offsetof(Picklerobject, bin)},
2747 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002748 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002749};
2750
2751static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002752 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002753 (setter)Pickler_set_pers_func},
2754 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2755 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002756 {"PicklingError", (getter)Pickler_get_error, NULL},
2757 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002758};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002760PyDoc_STRVAR(Picklertype__doc__,
2761"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002762
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002763static PyTypeObject Picklertype = {
2764 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002766 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002767 sizeof(Picklerobject), /*tp_basicsize*/
2768 0,
2769 (destructor)Pickler_dealloc, /* tp_dealloc */
2770 0, /* tp_print */
2771 0, /* tp_getattr */
2772 0, /* tp_setattr */
2773 0, /* tp_compare */
2774 0, /* tp_repr */
2775 0, /* tp_as_number */
2776 0, /* tp_as_sequence */
2777 0, /* tp_as_mapping */
2778 0, /* tp_hash */
2779 0, /* tp_call */
2780 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002781 PyObject_GenericGetAttr, /* tp_getattro */
2782 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002783 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002784 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002785 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002786 (traverseproc)Pickler_traverse, /* tp_traverse */
2787 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002788 0, /* tp_richcompare */
2789 0, /* tp_weaklistoffset */
2790 0, /* tp_iter */
2791 0, /* tp_iternext */
2792 Pickler_methods, /* tp_methods */
2793 Pickler_members, /* tp_members */
2794 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002795};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002796
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002797static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002798find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799{
2800 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802 if (fc) {
2803 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002804 PyErr_SetString(UnpicklingError, "Global and instance "
2805 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 return NULL;
2807 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2809 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 module = PySys_GetObject("modules");
2813 if (module == NULL)
2814 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 module = PyDict_GetItem(module, py_module_name);
2817 if (module == NULL) {
2818 module = PyImport_Import(py_module_name);
2819 if (!module)
2820 return NULL;
2821 global = PyObject_GetAttr(module, py_global_name);
2822 Py_DECREF(module);
2823 }
2824 else
2825 global = PyObject_GetAttr(module, py_global_name);
2826 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002827}
2828
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002829static int
Tim Peterscba30e22003-02-01 06:24:36 +00002830marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831{
2832 if (self->num_marks < 1) {
2833 PyErr_SetString(UnpicklingError, "could not find MARK");
2834 return -1;
2835 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838}
2839
Tim Peters84e87f32001-03-17 04:50:51 +00002840
Guido van Rossum60456fd1997-04-09 17:36:32 +00002841static int
Tim Peterscba30e22003-02-01 06:24:36 +00002842load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843{
2844 PDATA_APPEND(self->stack, Py_None, -1);
2845 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846}
2847
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002848static int
Tim Peterscba30e22003-02-01 06:24:36 +00002849bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850{
2851 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2852 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002853}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002854
2855static int
Tim Peterscba30e22003-02-01 06:24:36 +00002856load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857{
2858 PyObject *py_int = 0;
2859 char *endptr, *s;
2860 int len, res = -1;
2861 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
Tim Peters0bc93f52003-02-02 18:29:33 +00002863 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 if (len < 2) return bad_readline();
2865 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 errno = 0;
2868 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2871 /* Hm, maybe we've got something long. Let's try reading
2872 it as a Python long object. */
2873 errno = 0;
2874 py_int = PyLong_FromString(s, NULL, 0);
2875 if (py_int == NULL) {
2876 PyErr_SetString(PyExc_ValueError,
2877 "could not convert string to int");
2878 goto finally;
2879 }
2880 }
2881 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002882 if (len == 3 && (l == 0 || l == 1)) {
2883 if (!( py_int = PyBool_FromLong(l))) goto finally;
2884 }
2885 else {
2886 if (!( py_int = PyInt_FromLong(l))) goto finally;
2887 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 free(s);
2891 PDATA_PUSH(self->stack, py_int, -1);
2892 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002894 finally:
2895 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002898}
2899
Tim Peters3c67d792003-02-02 17:59:11 +00002900static int
2901load_bool(Unpicklerobject *self, PyObject *boolean)
2902{
2903 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002904 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002905 return 0;
2906}
2907
Tim Petersee1a53c2003-02-02 02:57:53 +00002908/* s contains x bytes of a little-endian integer. Return its value as a
2909 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2910 * int, but when x is 4 it's a signed one. This is an historical source
2911 * of x-platform bugs.
2912 */
Tim Peters84e87f32001-03-17 04:50:51 +00002913static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002914calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002915{
2916 unsigned char c;
2917 int i;
2918 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 for (i = 0, l = 0L; i < x; i++) {
2921 c = (unsigned char)s[i];
2922 l |= (long)c << (i * 8);
2923 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002924#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2926 * is signed, so on a box with longs bigger than 4 bytes we need
2927 * to extend a BININT's sign bit to the full width.
2928 */
2929 if (x == 4 && l & (1L << 31))
2930 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002931#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002933}
2934
2935
2936static int
Tim Peterscba30e22003-02-01 06:24:36 +00002937load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938{
2939 PyObject *py_int = 0;
2940 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Tim Peterscba30e22003-02-01 06:24:36 +00002944 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 PDATA_PUSH(self->stack, py_int, -1);
2948 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949}
2950
2951
2952static int
Tim Peterscba30e22003-02-01 06:24:36 +00002953load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954{
2955 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
Tim Peters0bc93f52003-02-02 18:29:33 +00002957 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002961}
2962
2963
2964static int
Tim Peterscba30e22003-02-01 06:24:36 +00002965load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966{
2967 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002968
Tim Peters0bc93f52003-02-02 18:29:33 +00002969 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973}
2974
2975
2976static int
Tim Peterscba30e22003-02-01 06:24:36 +00002977load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978{
2979 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Tim Peters0bc93f52003-02-02 18:29:33 +00002981 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985}
Tim Peters84e87f32001-03-17 04:50:51 +00002986
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987static int
Tim Peterscba30e22003-02-01 06:24:36 +00002988load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989{
2990 PyObject *l = 0;
2991 char *end, *s;
2992 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Tim Peters0bc93f52003-02-02 18:29:33 +00002994 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 if (len < 2) return bad_readline();
2996 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997
Tim Peterscba30e22003-02-01 06:24:36 +00002998 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 free(s);
3002 PDATA_PUSH(self->stack, l, -1);
3003 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003005 finally:
3006 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003009}
3010
Tim Petersee1a53c2003-02-02 02:57:53 +00003011/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3012 * data following.
3013 */
3014static int
3015load_counted_long(Unpicklerobject *self, int size)
3016{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003017 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003018 char *nbytes;
3019 unsigned char *pdata;
3020 PyObject *along;
3021
3022 assert(size == 1 || size == 4);
3023 i = self->read_func(self, &nbytes, size);
3024 if (i < 0) return -1;
3025
3026 size = calc_binint(nbytes, size);
3027 if (size < 0) {
3028 /* Corrupt or hostile pickle -- we never write one like
3029 * this.
3030 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003031 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003032 "byte count");
3033 return -1;
3034 }
3035
3036 if (size == 0)
3037 along = PyLong_FromLong(0L);
3038 else {
3039 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003040 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003041 if (i < 0) return -1;
3042 along = _PyLong_FromByteArray(pdata, (size_t)size,
3043 1 /* little endian */, 1 /* signed */);
3044 }
3045 if (along == NULL)
3046 return -1;
3047 PDATA_PUSH(self->stack, along, -1);
3048 return 0;
3049}
Tim Peters84e87f32001-03-17 04:50:51 +00003050
Guido van Rossum60456fd1997-04-09 17:36:32 +00003051static int
Tim Peterscba30e22003-02-01 06:24:36 +00003052load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053{
3054 PyObject *py_float = 0;
3055 char *endptr, *s;
3056 int len, res = -1;
3057 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Tim Peters0bc93f52003-02-02 18:29:33 +00003059 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 if (len < 2) return bad_readline();
3061 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003064 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3067 PyErr_SetString(PyExc_ValueError,
3068 "could not convert string to float");
3069 goto finally;
3070 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071
Tim Peterscba30e22003-02-01 06:24:36 +00003072 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 free(s);
3076 PDATA_PUSH(self->stack, py_float, -1);
3077 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 finally:
3080 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083}
3084
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085static int
Tim Peterscba30e22003-02-01 06:24:36 +00003086load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087{
Tim Peters9905b942003-03-20 20:53:32 +00003088 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 double x;
3090 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091
Tim Peters0bc93f52003-02-02 18:29:33 +00003092 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003094
Tim Peters9905b942003-03-20 20:53:32 +00003095 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3096 if (x == -1.0 && PyErr_Occurred())
3097 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Tim Peters9905b942003-03-20 20:53:32 +00003099 py_float = PyFloat_FromDouble(x);
3100 if (py_float == NULL)
3101 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 PDATA_PUSH(self->stack, py_float, -1);
3104 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
3107static int
Tim Peterscba30e22003-02-01 06:24:36 +00003108load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109{
3110 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003111 int len, res = -1;
3112 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003113
Tim Peters0bc93f52003-02-02 18:29:33 +00003114 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 if (len < 2) return bad_readline();
3116 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003118
3119 /* Strip outermost quotes */
3120 while (s[len-1] <= ' ')
3121 len--;
3122 if(s[0]=='"' && s[len-1]=='"'){
3123 s[len-1] = '\0';
3124 p = s + 1 ;
3125 len -= 2;
3126 } else if(s[0]=='\'' && s[len-1]=='\''){
3127 s[len-1] = '\0';
3128 p = s + 1 ;
3129 len -= 2;
3130 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 goto insecure;
3132 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003133
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003134 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003135 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003136 if (str) {
3137 PDATA_PUSH(self->stack, str, -1);
3138 res = 0;
3139 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 insecure:
3143 free(s);
3144 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3145 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003146}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003147
3148
3149static int
Tim Peterscba30e22003-02-01 06:24:36 +00003150load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151{
3152 PyObject *py_string = 0;
3153 long l;
3154 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Tim Peters0bc93f52003-02-02 18:29:33 +00003156 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003158 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003159
Tim Peters0bc93f52003-02-02 18:29:33 +00003160 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003161 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Tim Peterscba30e22003-02-01 06:24:36 +00003163 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 PDATA_PUSH(self->stack, py_string, -1);
3167 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003168}
3169
3170
3171static int
Tim Peterscba30e22003-02-01 06:24:36 +00003172load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173{
3174 PyObject *py_string = 0;
3175 unsigned char l;
3176 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
Tim Peters0bc93f52003-02-02 18:29:33 +00003178 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182
Tim Peters0bc93f52003-02-02 18:29:33 +00003183 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 PDATA_PUSH(self->stack, py_string, -1);
3188 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003189}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003190
3191
3192static int
Tim Peterscba30e22003-02-01 06:24:36 +00003193load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194{
3195 PyObject *str = 0;
3196 int len, res = -1;
3197 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003198
Tim Peters0bc93f52003-02-02 18:29:33 +00003199 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003201
Tim Peterscba30e22003-02-01 06:24:36 +00003202 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 PDATA_PUSH(self->stack, str, -1);
3206 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 finally:
3209 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003210}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003211
3212
3213static int
Tim Peterscba30e22003-02-01 06:24:36 +00003214load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215{
3216 PyObject *unicode;
3217 long l;
3218 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003219
Tim Peters0bc93f52003-02-02 18:29:33 +00003220 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003223
Tim Peters0bc93f52003-02-02 18:29:33 +00003224 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003226
Tim Peterscba30e22003-02-01 06:24:36 +00003227 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 PDATA_PUSH(self->stack, unicode, -1);
3231 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003232}
3233
3234
3235static int
Tim Peterscba30e22003-02-01 06:24:36 +00003236load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237{
3238 PyObject *tup;
3239 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241 if ((i = marker(self)) < 0) return -1;
3242 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3243 PDATA_PUSH(self->stack, tup, -1);
3244 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245}
3246
3247static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003248load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003250 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003251
Tim Peters1d63c9f2003-02-02 20:29:39 +00003252 if (tup == NULL)
3253 return -1;
3254
3255 while (--len >= 0) {
3256 PyObject *element;
3257
3258 PDATA_POP(self->stack, element);
3259 if (element == NULL)
3260 return -1;
3261 PyTuple_SET_ITEM(tup, len, element);
3262 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 PDATA_PUSH(self->stack, tup, -1);
3264 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265}
3266
3267static int
Tim Peterscba30e22003-02-01 06:24:36 +00003268load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269{
3270 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 if (!( list=PyList_New(0))) return -1;
3273 PDATA_PUSH(self->stack, list, -1);
3274 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275}
3276
3277static int
Tim Peterscba30e22003-02-01 06:24:36 +00003278load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003279{
3280 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 if (!( dict=PyDict_New())) return -1;
3283 PDATA_PUSH(self->stack, dict, -1);
3284 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285}
3286
3287
3288static int
Tim Peterscba30e22003-02-01 06:24:36 +00003289load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290{
3291 PyObject *list = 0;
3292 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 if ((i = marker(self)) < 0) return -1;
3295 if (!( list=Pdata_popList(self->stack, i))) return -1;
3296 PDATA_PUSH(self->stack, list, -1);
3297 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003298}
3299
3300static int
Tim Peterscba30e22003-02-01 06:24:36 +00003301load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003302{
3303 PyObject *dict, *key, *value;
3304 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 if ((i = marker(self)) < 0) return -1;
3307 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003311 for (k = i+1; k < j; k += 2) {
3312 key =self->stack->data[k-1];
3313 value=self->stack->data[k ];
3314 if (PyDict_SetItem(dict, key, value) < 0) {
3315 Py_DECREF(dict);
3316 return -1;
3317 }
3318 }
3319 Pdata_clear(self->stack, i);
3320 PDATA_PUSH(self->stack, dict, -1);
3321 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003322}
3323
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003324static PyObject *
3325Instance_New(PyObject *cls, PyObject *args)
3326{
3327 PyObject *r = 0;
3328
3329 if ((r=PyObject_CallObject(cls, args))) return r;
3330
3331 {
3332 PyObject *tp, *v, *tb, *tmp_value;
3333
3334 PyErr_Fetch(&tp, &v, &tb);
3335 tmp_value = v;
3336 /* NULL occurs when there was a KeyboardInterrupt */
3337 if (tmp_value == NULL)
3338 tmp_value = Py_None;
3339 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3340 Py_XDECREF(v);
3341 v=r;
3342 }
3343 PyErr_Restore(tp,v,tb);
3344 }
3345 return NULL;
3346}
3347
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
3349static int
Tim Peterscba30e22003-02-01 06:24:36 +00003350load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003351{
3352 PyObject *class, *tup, *obj=0;
3353 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 if ((i = marker(self)) < 0) return -1;
3356 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3357 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003358 if (class) {
3359 obj = Instance_New(class, tup);
3360 Py_DECREF(class);
3361 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364 if (! obj) return -1;
3365 PDATA_PUSH(self->stack, obj, -1);
3366 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003367}
3368
3369
3370static int
Tim Peterscba30e22003-02-01 06:24:36 +00003371load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372{
3373 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3374 int i, len;
3375 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003378
Tim Peters0bc93f52003-02-02 18:29:33 +00003379 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 if (len < 2) return bad_readline();
3381 module_name = PyString_FromStringAndSize(s, len - 1);
3382 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003383
Tim Peters0bc93f52003-02-02 18:29:33 +00003384 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if (len < 2) return bad_readline();
3386 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003387 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003388 self->find_class);
3389 Py_DECREF(class_name);
3390 }
3391 }
3392 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003397 obj = Instance_New(class, tup);
3398 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 }
3400 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 PDATA_PUSH(self->stack, obj, -1);
3405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406}
3407
Tim Peterseab7db32003-02-13 18:24:14 +00003408static int
3409load_newobj(Unpicklerobject *self)
3410{
3411 PyObject *args = NULL;
3412 PyObject *clsraw = NULL;
3413 PyTypeObject *cls; /* clsraw cast to its true type */
3414 PyObject *obj;
3415
3416 /* Stack is ... cls argtuple, and we want to call
3417 * cls.__new__(cls, *argtuple).
3418 */
3419 PDATA_POP(self->stack, args);
3420 if (args == NULL) goto Fail;
3421 if (! PyTuple_Check(args)) {
3422 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3423 "tuple.");
3424 goto Fail;
3425 }
3426
3427 PDATA_POP(self->stack, clsraw);
3428 cls = (PyTypeObject *)clsraw;
3429 if (cls == NULL) goto Fail;
3430 if (! PyType_Check(cls)) {
3431 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3432 "isn't a type object");
3433 goto Fail;
3434 }
3435 if (cls->tp_new == NULL) {
3436 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3437 "has NULL tp_new");
3438 goto Fail;
3439 }
3440
3441 /* Call __new__. */
3442 obj = cls->tp_new(cls, args, NULL);
3443 if (obj == NULL) goto Fail;
3444
3445 Py_DECREF(args);
3446 Py_DECREF(clsraw);
3447 PDATA_PUSH(self->stack, obj, -1);
3448 return 0;
3449
3450 Fail:
3451 Py_XDECREF(args);
3452 Py_XDECREF(clsraw);
3453 return -1;
3454}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
3456static int
Tim Peterscba30e22003-02-01 06:24:36 +00003457load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458{
3459 PyObject *class = 0, *module_name = 0, *class_name = 0;
3460 int len;
3461 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003462
Tim Peters0bc93f52003-02-02 18:29:33 +00003463 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 if (len < 2) return bad_readline();
3465 module_name = PyString_FromStringAndSize(s, len - 1);
3466 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Tim Peters0bc93f52003-02-02 18:29:33 +00003468 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003469 if (len < 2) {
3470 Py_DECREF(module_name);
3471 return bad_readline();
3472 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00003473 if ((class_name = PyUnicode_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003474 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003475 self->find_class);
3476 Py_DECREF(class_name);
3477 }
3478 }
3479 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481 if (! class) return -1;
3482 PDATA_PUSH(self->stack, class, -1);
3483 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484}
3485
3486
3487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
3490 PyObject *pid = 0;
3491 int len;
3492 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003495 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 if (len < 2) return bad_readline();
3497
3498 pid = PyString_FromStringAndSize(s, len - 1);
3499 if (!pid) return -1;
3500
3501 if (PyList_Check(self->pers_func)) {
3502 if (PyList_Append(self->pers_func, pid) < 0) {
3503 Py_DECREF(pid);
3504 return -1;
3505 }
3506 }
3507 else {
3508 ARG_TUP(self, pid);
3509 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003510 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 NULL);
3512 FREE_ARG_TUP(self);
3513 }
3514 }
3515
3516 if (! pid) return -1;
3517
3518 PDATA_PUSH(self->stack, pid, -1);
3519 return 0;
3520 }
3521 else {
3522 PyErr_SetString(UnpicklingError,
3523 "A load persistent id instruction was encountered,\n"
3524 "but no persistent_load function was specified.");
3525 return -1;
3526 }
3527}
3528
3529static int
Tim Peterscba30e22003-02-01 06:24:36 +00003530load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531{
3532 PyObject *pid = 0;
3533
3534 if (self->pers_func) {
3535 PDATA_POP(self->stack, pid);
3536 if (! pid) return -1;
3537
3538 if (PyList_Check(self->pers_func)) {
3539 if (PyList_Append(self->pers_func, pid) < 0) {
3540 Py_DECREF(pid);
3541 return -1;
3542 }
3543 }
3544 else {
3545 ARG_TUP(self, pid);
3546 if (self->arg) {
3547 pid = PyObject_Call(self->pers_func, self->arg,
3548 NULL);
3549 FREE_ARG_TUP(self);
3550 }
3551 if (! pid) return -1;
3552 }
3553
3554 PDATA_PUSH(self->stack, pid, -1);
3555 return 0;
3556 }
3557 else {
3558 PyErr_SetString(UnpicklingError,
3559 "A load persistent id instruction was encountered,\n"
3560 "but no persistent_load function was specified.");
3561 return -1;
3562 }
3563}
3564
3565
3566static int
Tim Peterscba30e22003-02-01 06:24:36 +00003567load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568{
3569 int len;
3570
3571 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3572
3573 /* Note that we split the (pickle.py) stack into two stacks,
3574 an object stack and a mark stack. We have to be clever and
3575 pop the right one. We do this by looking at the top of the
3576 mark stack.
3577 */
3578
3579 if ((self->num_marks > 0) &&
3580 (self->marks[self->num_marks - 1] == len))
3581 self->num_marks--;
3582 else {
3583 len--;
3584 Py_DECREF(self->stack->data[len]);
3585 self->stack->length=len;
3586 }
3587
3588 return 0;
3589}
3590
3591
3592static int
Tim Peterscba30e22003-02-01 06:24:36 +00003593load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003594{
3595 int i;
3596
3597 if ((i = marker(self)) < 0)
3598 return -1;
3599
3600 Pdata_clear(self->stack, i);
3601
3602 return 0;
3603}
3604
3605
3606static int
Tim Peterscba30e22003-02-01 06:24:36 +00003607load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608{
3609 PyObject *last;
3610 int len;
3611
3612 if ((len = self->stack->length) <= 0) return stackUnderflow();
3613 last=self->stack->data[len-1];
3614 Py_INCREF(last);
3615 PDATA_PUSH(self->stack, last, -1);
3616 return 0;
3617}
3618
3619
3620static int
Tim Peterscba30e22003-02-01 06:24:36 +00003621load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622{
3623 PyObject *py_str = 0, *value = 0;
3624 int len;
3625 char *s;
3626 int rc;
3627
Tim Peters0bc93f52003-02-02 18:29:33 +00003628 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003629 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633 value = PyDict_GetItem(self->memo, py_str);
3634 if (! value) {
3635 PyErr_SetObject(BadPickleGet, py_str);
3636 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003637 }
3638 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639 PDATA_APPEND(self->stack, value, -1);
3640 rc = 0;
3641 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643 Py_DECREF(py_str);
3644 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003645}
3646
3647
3648static int
Tim Peterscba30e22003-02-01 06:24:36 +00003649load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003650{
3651 PyObject *py_key = 0, *value = 0;
3652 unsigned char key;
3653 char *s;
3654 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003655
Tim Peters0bc93f52003-02-02 18:29:33 +00003656 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658 key = (unsigned char)s[0];
3659 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 value = PyDict_GetItem(self->memo, py_key);
3662 if (! value) {
3663 PyErr_SetObject(BadPickleGet, py_key);
3664 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003665 }
3666 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003667 PDATA_APPEND(self->stack, value, -1);
3668 rc = 0;
3669 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003671 Py_DECREF(py_key);
3672 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673}
3674
3675
3676static int
Tim Peterscba30e22003-02-01 06:24:36 +00003677load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678{
3679 PyObject *py_key = 0, *value = 0;
3680 unsigned char c;
3681 char *s;
3682 long key;
3683 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Tim Peters0bc93f52003-02-02 18:29:33 +00003685 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 c = (unsigned char)s[0];
3688 key = (long)c;
3689 c = (unsigned char)s[1];
3690 key |= (long)c << 8;
3691 c = (unsigned char)s[2];
3692 key |= (long)c << 16;
3693 c = (unsigned char)s[3];
3694 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3697
3698 value = PyDict_GetItem(self->memo, py_key);
3699 if (! value) {
3700 PyErr_SetObject(BadPickleGet, py_key);
3701 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003702 }
3703 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704 PDATA_APPEND(self->stack, value, -1);
3705 rc = 0;
3706 }
3707
3708 Py_DECREF(py_key);
3709 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710}
3711
Tim Peters2d629652003-02-04 05:06:17 +00003712/* Push an object from the extension registry (EXT[124]). nbytes is
3713 * the number of bytes following the opcode, holding the index (code) value.
3714 */
3715static int
3716load_extension(Unpicklerobject *self, int nbytes)
3717{
3718 char *codebytes; /* the nbytes bytes after the opcode */
3719 long code; /* calc_binint returns long */
3720 PyObject *py_code; /* code as a Python int */
3721 PyObject *obj; /* the object to push */
3722 PyObject *pair; /* (module_name, class_name) */
3723 PyObject *module_name, *class_name;
3724
3725 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3726 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3727 code = calc_binint(codebytes, nbytes);
3728 if (code <= 0) { /* note that 0 is forbidden */
3729 /* Corrupt or hostile pickle. */
3730 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3731 return -1;
3732 }
3733
3734 /* Look for the code in the cache. */
3735 py_code = PyInt_FromLong(code);
3736 if (py_code == NULL) return -1;
3737 obj = PyDict_GetItem(extension_cache, py_code);
3738 if (obj != NULL) {
3739 /* Bingo. */
3740 Py_DECREF(py_code);
3741 PDATA_APPEND(self->stack, obj, -1);
3742 return 0;
3743 }
3744
3745 /* Look up the (module_name, class_name) pair. */
3746 pair = PyDict_GetItem(inverted_registry, py_code);
3747 if (pair == NULL) {
3748 Py_DECREF(py_code);
3749 PyErr_Format(PyExc_ValueError, "unregistered extension "
3750 "code %ld", code);
3751 return -1;
3752 }
3753 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003754 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003755 */
3756 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3757 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3758 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3759 Py_DECREF(py_code);
3760 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3761 "isn't a 2-tuple of strings", code);
3762 return -1;
3763 }
3764 /* Load the object. */
3765 obj = find_class(module_name, class_name, self->find_class);
3766 if (obj == NULL) {
3767 Py_DECREF(py_code);
3768 return -1;
3769 }
3770 /* Cache code -> obj. */
3771 code = PyDict_SetItem(extension_cache, py_code, obj);
3772 Py_DECREF(py_code);
3773 if (code < 0) {
3774 Py_DECREF(obj);
3775 return -1;
3776 }
3777 PDATA_PUSH(self->stack, obj, -1);
3778 return 0;
3779}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
3781static int
Tim Peterscba30e22003-02-01 06:24:36 +00003782load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783{
3784 PyObject *py_str = 0, *value = 0;
3785 int len, l;
3786 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Tim Peters0bc93f52003-02-02 18:29:33 +00003788 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 if (l < 2) return bad_readline();
3790 if (!( len=self->stack->length )) return stackUnderflow();
3791 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3792 value=self->stack->data[len-1];
3793 l=PyDict_SetItem(self->memo, py_str, value);
3794 Py_DECREF(py_str);
3795 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796}
3797
3798
3799static int
Tim Peterscba30e22003-02-01 06:24:36 +00003800load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801{
3802 PyObject *py_key = 0, *value = 0;
3803 unsigned char key;
3804 char *s;
3805 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003806
Tim Peters0bc93f52003-02-02 18:29:33 +00003807 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3813 value=self->stack->data[len-1];
3814 len=PyDict_SetItem(self->memo, py_key, value);
3815 Py_DECREF(py_key);
3816 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817}
3818
3819
3820static int
Tim Peterscba30e22003-02-01 06:24:36 +00003821load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822{
3823 PyObject *py_key = 0, *value = 0;
3824 long key;
3825 unsigned char c;
3826 char *s;
3827 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003828
Tim Peters0bc93f52003-02-02 18:29:33 +00003829 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003832 c = (unsigned char)s[0];
3833 key = (long)c;
3834 c = (unsigned char)s[1];
3835 key |= (long)c << 8;
3836 c = (unsigned char)s[2];
3837 key |= (long)c << 16;
3838 c = (unsigned char)s[3];
3839 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 if (!( py_key = PyInt_FromLong(key))) return -1;
3842 value=self->stack->data[len-1];
3843 len=PyDict_SetItem(self->memo, py_key, value);
3844 Py_DECREF(py_key);
3845 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003846}
3847
3848
3849static int
Tim Peterscba30e22003-02-01 06:24:36 +00003850do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851{
3852 PyObject *value = 0, *list = 0, *append_method = 0;
3853 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 len=self->stack->length;
3856 if (!( len >= x && x > 0 )) return stackUnderflow();
3857 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003858 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003862 if (PyList_Check(list)) {
3863 PyObject *slice;
3864 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003867 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 list_len = PyList_GET_SIZE(list);
3869 i=PyList_SetSlice(list, list_len, list_len, slice);
3870 Py_DECREF(slice);
3871 return i;
3872 }
3873 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
Tim Peterscba30e22003-02-01 06:24:36 +00003875 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 return -1;
3877
3878 for (i = x; i < len; i++) {
3879 PyObject *junk;
3880
3881 value=self->stack->data[i];
3882 junk=0;
3883 ARG_TUP(self, value);
3884 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003885 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 NULL);
3887 FREE_ARG_TUP(self);
3888 }
3889 if (! junk) {
3890 Pdata_clear(self->stack, i+1);
3891 self->stack->length=x;
3892 Py_DECREF(append_method);
3893 return -1;
3894 }
3895 Py_DECREF(junk);
3896 }
3897 self->stack->length=x;
3898 Py_DECREF(append_method);
3899 }
3900
3901 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902}
3903
3904
3905static int
Tim Peterscba30e22003-02-01 06:24:36 +00003906load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907{
3908 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003909}
3910
3911
3912static int
Tim Peterscba30e22003-02-01 06:24:36 +00003913load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914{
3915 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916}
3917
3918
3919static int
Tim Peterscba30e22003-02-01 06:24:36 +00003920do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921{
3922 PyObject *value = 0, *key = 0, *dict = 0;
3923 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003925 if (!( (len=self->stack->length) >= x
3926 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 for (i = x+1; i < len; i += 2) {
3931 key =self->stack->data[i-1];
3932 value=self->stack->data[i ];
3933 if (PyObject_SetItem(dict, key, value) < 0) {
3934 r=-1;
3935 break;
3936 }
3937 }
3938
3939 Pdata_clear(self->stack, x);
3940
3941 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942}
3943
3944
Tim Peters84e87f32001-03-17 04:50:51 +00003945static int
Tim Peterscba30e22003-02-01 06:24:36 +00003946load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947{
3948 return do_setitems(self, self->stack->length - 2);
3949}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951static int
Tim Peterscba30e22003-02-01 06:24:36 +00003952load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953{
3954 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955}
3956
Tim Peters84e87f32001-03-17 04:50:51 +00003957
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958static int
Tim Peterscba30e22003-02-01 06:24:36 +00003959load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960{
Tim Peters080c88b2003-02-15 03:01:11 +00003961 PyObject *state, *inst, *slotstate;
3962 PyObject *__setstate__;
3963 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003964 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00003965 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966
Tim Peters080c88b2003-02-15 03:01:11 +00003967 /* Stack is ... instance, state. We want to leave instance at
3968 * the stack top, possibly mutated via instance.__setstate__(state).
3969 */
3970 if (self->stack->length < 2)
3971 return stackUnderflow();
3972 PDATA_POP(self->stack, state);
3973 if (state == NULL)
3974 return -1;
3975 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976
Tim Peters080c88b2003-02-15 03:01:11 +00003977 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
3978 if (__setstate__ != NULL) {
3979 PyObject *junk = NULL;
3980
3981 /* The explicit __setstate__ is responsible for everything. */
3982 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003983 if (self->arg) {
3984 junk = PyObject_Call(__setstate__, self->arg, NULL);
3985 FREE_ARG_TUP(self);
3986 }
3987 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00003988 if (junk == NULL)
3989 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 Py_DECREF(junk);
3991 return 0;
3992 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003993 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3994 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00003996
3997 /* A default __setstate__. First see whether state embeds a
3998 * slot state dict too (a proto 2 addition).
3999 */
4000 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4001 PyObject *temp = state;
4002 state = PyTuple_GET_ITEM(temp, 0);
4003 slotstate = PyTuple_GET_ITEM(temp, 1);
4004 Py_INCREF(state);
4005 Py_INCREF(slotstate);
4006 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 }
Tim Peters080c88b2003-02-15 03:01:11 +00004008 else
4009 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010
Tim Peters080c88b2003-02-15 03:01:11 +00004011 /* Set inst.__dict__ from the state dict (if any). */
4012 if (state != Py_None) {
4013 PyObject *dict;
4014 if (! PyDict_Check(state)) {
4015 PyErr_SetString(UnpicklingError, "state is not a "
4016 "dictionary");
4017 goto finally;
4018 }
4019 dict = PyObject_GetAttr(inst, __dict___str);
4020 if (dict == NULL)
4021 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022
Tim Peters080c88b2003-02-15 03:01:11 +00004023 i = 0;
4024 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4025 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4026 goto finally;
4027 }
4028 Py_DECREF(dict);
4029 }
4030
4031 /* Also set instance attributes from the slotstate dict (if any). */
4032 if (slotstate != NULL) {
4033 if (! PyDict_Check(slotstate)) {
4034 PyErr_SetString(UnpicklingError, "slot state is not "
4035 "a dictionary");
4036 goto finally;
4037 }
4038 i = 0;
4039 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4040 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4041 goto finally;
4042 }
4043 }
4044 res = 0;
4045
4046 finally:
4047 Py_DECREF(state);
4048 Py_XDECREF(slotstate);
4049 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050}
4051
4052
4053static int
Tim Peterscba30e22003-02-01 06:24:36 +00004054load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055{
4056 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004058 /* Note that we split the (pickle.py) stack into two stacks, an
4059 object stack and a mark stack. Here we push a mark onto the
4060 mark stack.
4061 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004064 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 s=self->marks_size+20;
4066 if (s <= self->num_marks) s=self->num_marks + 1;
4067 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004068 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004070 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004072 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 PyErr_NoMemory();
4074 return -1;
4075 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004076 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 self->marks_size = s;
4078 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083}
4084
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085static int
Tim Peterscba30e22003-02-01 06:24:36 +00004086load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087{
4088 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090 PDATA_POP(self->stack, arg_tup);
4091 if (! arg_tup) return -1;
4092 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004093 if (callable) {
4094 ob = Instance_New(callable, arg_tup);
4095 Py_DECREF(callable);
4096 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 PDATA_PUSH(self->stack, ob, -1);
4102 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004103}
Tim Peters84e87f32001-03-17 04:50:51 +00004104
Tim Peters4190fb82003-02-02 16:09:05 +00004105/* Just raises an error if we don't know the protocol specified. PROTO
4106 * is the first opcode for protocols >= 2.
4107 */
4108static int
4109load_proto(Unpicklerobject *self)
4110{
4111 int i;
4112 char *protobyte;
4113
4114 i = self->read_func(self, &protobyte, 1);
4115 if (i < 0)
4116 return -1;
4117
4118 i = calc_binint(protobyte, 1);
4119 /* No point checking for < 0, since calc_binint returns an unsigned
4120 * int when chewing on 1 byte.
4121 */
4122 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004123 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004124 return 0;
4125
4126 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4127 return -1;
4128}
4129
Guido van Rossum60456fd1997-04-09 17:36:32 +00004130static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004131load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132{
4133 PyObject *err = 0, *val = 0;
4134 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 self->num_marks = 0;
4137 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004140 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143 switch (s[0]) {
4144 case NONE:
4145 if (load_none(self) < 0)
4146 break;
4147 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 case BININT:
4150 if (load_binint(self) < 0)
4151 break;
4152 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 case BININT1:
4155 if (load_binint1(self) < 0)
4156 break;
4157 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 case BININT2:
4160 if (load_binint2(self) < 0)
4161 break;
4162 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 case INT:
4165 if (load_int(self) < 0)
4166 break;
4167 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 case LONG:
4170 if (load_long(self) < 0)
4171 break;
4172 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004173
Tim Petersee1a53c2003-02-02 02:57:53 +00004174 case LONG1:
4175 if (load_counted_long(self, 1) < 0)
4176 break;
4177 continue;
4178
4179 case LONG4:
4180 if (load_counted_long(self, 4) < 0)
4181 break;
4182 continue;
4183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184 case FLOAT:
4185 if (load_float(self) < 0)
4186 break;
4187 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 case BINFLOAT:
4190 if (load_binfloat(self) < 0)
4191 break;
4192 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 case BINSTRING:
4195 if (load_binstring(self) < 0)
4196 break;
4197 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 case SHORT_BINSTRING:
4200 if (load_short_binstring(self) < 0)
4201 break;
4202 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 case STRING:
4205 if (load_string(self) < 0)
4206 break;
4207 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 case UNICODE:
4210 if (load_unicode(self) < 0)
4211 break;
4212 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 case BINUNICODE:
4215 if (load_binunicode(self) < 0)
4216 break;
4217 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004220 if (load_counted_tuple(self, 0) < 0)
4221 break;
4222 continue;
4223
4224 case TUPLE1:
4225 if (load_counted_tuple(self, 1) < 0)
4226 break;
4227 continue;
4228
4229 case TUPLE2:
4230 if (load_counted_tuple(self, 2) < 0)
4231 break;
4232 continue;
4233
4234 case TUPLE3:
4235 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 break;
4237 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 case TUPLE:
4240 if (load_tuple(self) < 0)
4241 break;
4242 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 case EMPTY_LIST:
4245 if (load_empty_list(self) < 0)
4246 break;
4247 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004249 case LIST:
4250 if (load_list(self) < 0)
4251 break;
4252 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 case EMPTY_DICT:
4255 if (load_empty_dict(self) < 0)
4256 break;
4257 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 case DICT:
4260 if (load_dict(self) < 0)
4261 break;
4262 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264 case OBJ:
4265 if (load_obj(self) < 0)
4266 break;
4267 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004269 case INST:
4270 if (load_inst(self) < 0)
4271 break;
4272 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273
Tim Peterseab7db32003-02-13 18:24:14 +00004274 case NEWOBJ:
4275 if (load_newobj(self) < 0)
4276 break;
4277 continue;
4278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 case GLOBAL:
4280 if (load_global(self) < 0)
4281 break;
4282 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 case APPEND:
4285 if (load_append(self) < 0)
4286 break;
4287 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 case APPENDS:
4290 if (load_appends(self) < 0)
4291 break;
4292 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004294 case BUILD:
4295 if (load_build(self) < 0)
4296 break;
4297 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 case DUP:
4300 if (load_dup(self) < 0)
4301 break;
4302 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 case BINGET:
4305 if (load_binget(self) < 0)
4306 break;
4307 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309 case LONG_BINGET:
4310 if (load_long_binget(self) < 0)
4311 break;
4312 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 case GET:
4315 if (load_get(self) < 0)
4316 break;
4317 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004318
Tim Peters2d629652003-02-04 05:06:17 +00004319 case EXT1:
4320 if (load_extension(self, 1) < 0)
4321 break;
4322 continue;
4323
4324 case EXT2:
4325 if (load_extension(self, 2) < 0)
4326 break;
4327 continue;
4328
4329 case EXT4:
4330 if (load_extension(self, 4) < 0)
4331 break;
4332 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 case MARK:
4334 if (load_mark(self) < 0)
4335 break;
4336 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338 case BINPUT:
4339 if (load_binput(self) < 0)
4340 break;
4341 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004343 case LONG_BINPUT:
4344 if (load_long_binput(self) < 0)
4345 break;
4346 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004348 case PUT:
4349 if (load_put(self) < 0)
4350 break;
4351 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 case POP:
4354 if (load_pop(self) < 0)
4355 break;
4356 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 case POP_MARK:
4359 if (load_pop_mark(self) < 0)
4360 break;
4361 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 case SETITEM:
4364 if (load_setitem(self) < 0)
4365 break;
4366 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 case SETITEMS:
4369 if (load_setitems(self) < 0)
4370 break;
4371 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 case STOP:
4374 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 case PERSID:
4377 if (load_persid(self) < 0)
4378 break;
4379 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 case BINPERSID:
4382 if (load_binpersid(self) < 0)
4383 break;
4384 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 case REDUCE:
4387 if (load_reduce(self) < 0)
4388 break;
4389 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004390
Tim Peters4190fb82003-02-02 16:09:05 +00004391 case PROTO:
4392 if (load_proto(self) < 0)
4393 break;
4394 continue;
4395
Tim Peters3c67d792003-02-02 17:59:11 +00004396 case NEWTRUE:
4397 if (load_bool(self, Py_True) < 0)
4398 break;
4399 continue;
4400
4401 case NEWFALSE:
4402 if (load_bool(self, Py_False) < 0)
4403 break;
4404 continue;
4405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 case '\0':
4407 /* end of file */
4408 PyErr_SetNone(PyExc_EOFError);
4409 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004412 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 "invalid load key, '%s'.",
4414 "c", s[0]);
4415 return NULL;
4416 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 break;
4419 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 if ((err = PyErr_Occurred())) {
4422 if (err == PyExc_EOFError) {
4423 PyErr_SetNone(PyExc_EOFError);
4424 }
4425 return NULL;
4426 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 PDATA_POP(self->stack, val);
4429 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004430}
Tim Peters84e87f32001-03-17 04:50:51 +00004431
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004433/* No-load functions to support noload, which is used to
4434 find persistent references. */
4435
4436static int
Tim Peterscba30e22003-02-01 06:24:36 +00004437noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438{
4439 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 if ((i = marker(self)) < 0) return -1;
4442 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004443}
4444
4445
4446static int
Tim Peterscba30e22003-02-01 06:24:36 +00004447noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448{
4449 int i;
4450 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 if ((i = marker(self)) < 0) return -1;
4453 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004454 if (self->readline_func(self, &s) < 0) return -1;
4455 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004456 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004457 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004458}
4459
4460static int
Tim Peterseab7db32003-02-13 18:24:14 +00004461noload_newobj(Unpicklerobject *self)
4462{
4463 PyObject *obj;
4464
4465 PDATA_POP(self->stack, obj); /* pop argtuple */
4466 if (obj == NULL) return -1;
4467 Py_DECREF(obj);
4468
4469 PDATA_POP(self->stack, obj); /* pop cls */
4470 if (obj == NULL) return -1;
4471 Py_DECREF(obj);
4472
4473 PDATA_APPEND(self->stack, Py_None, -1);
4474 return 0;
4475}
4476
4477static int
Tim Peterscba30e22003-02-01 06:24:36 +00004478noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479{
4480 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004481
Tim Peters0bc93f52003-02-02 18:29:33 +00004482 if (self->readline_func(self, &s) < 0) return -1;
4483 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 PDATA_APPEND(self->stack, Py_None,-1);
4485 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004486}
4487
4488static int
Tim Peterscba30e22003-02-01 06:24:36 +00004489noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 if (self->stack->length < 2) return stackUnderflow();
4493 Pdata_clear(self->stack, self->stack->length-2);
4494 PDATA_APPEND(self->stack, Py_None,-1);
4495 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004496}
4497
4498static int
4499noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004500
Guido van Rossum053b8df1998-11-25 16:18:00 +00004501 if (self->stack->length < 1) return stackUnderflow();
4502 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004503 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004504}
4505
Tim Peters2d629652003-02-04 05:06:17 +00004506static int
4507noload_extension(Unpicklerobject *self, int nbytes)
4508{
4509 char *codebytes;
4510
4511 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4512 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4513 PDATA_APPEND(self->stack, Py_None, -1);
4514 return 0;
4515}
4516
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004517
4518static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004519noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520{
4521 PyObject *err = 0, *val = 0;
4522 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 self->num_marks = 0;
4525 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004528 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 switch (s[0]) {
4532 case NONE:
4533 if (load_none(self) < 0)
4534 break;
4535 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 case BININT:
4538 if (load_binint(self) < 0)
4539 break;
4540 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 case BININT1:
4543 if (load_binint1(self) < 0)
4544 break;
4545 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 case BININT2:
4548 if (load_binint2(self) < 0)
4549 break;
4550 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 case INT:
4553 if (load_int(self) < 0)
4554 break;
4555 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 case LONG:
4558 if (load_long(self) < 0)
4559 break;
4560 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004561
Tim Peters4190fb82003-02-02 16:09:05 +00004562 case LONG1:
4563 if (load_counted_long(self, 1) < 0)
4564 break;
4565 continue;
4566
4567 case LONG4:
4568 if (load_counted_long(self, 4) < 0)
4569 break;
4570 continue;
4571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 case FLOAT:
4573 if (load_float(self) < 0)
4574 break;
4575 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 case BINFLOAT:
4578 if (load_binfloat(self) < 0)
4579 break;
4580 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 case BINSTRING:
4583 if (load_binstring(self) < 0)
4584 break;
4585 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 case SHORT_BINSTRING:
4588 if (load_short_binstring(self) < 0)
4589 break;
4590 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 case STRING:
4593 if (load_string(self) < 0)
4594 break;
4595 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 case UNICODE:
4598 if (load_unicode(self) < 0)
4599 break;
4600 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 case BINUNICODE:
4603 if (load_binunicode(self) < 0)
4604 break;
4605 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004608 if (load_counted_tuple(self, 0) < 0)
4609 break;
4610 continue;
4611
4612 case TUPLE1:
4613 if (load_counted_tuple(self, 1) < 0)
4614 break;
4615 continue;
4616
4617 case TUPLE2:
4618 if (load_counted_tuple(self, 2) < 0)
4619 break;
4620 continue;
4621
4622 case TUPLE3:
4623 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624 break;
4625 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 case TUPLE:
4628 if (load_tuple(self) < 0)
4629 break;
4630 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 case EMPTY_LIST:
4633 if (load_empty_list(self) < 0)
4634 break;
4635 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 case LIST:
4638 if (load_list(self) < 0)
4639 break;
4640 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 case EMPTY_DICT:
4643 if (load_empty_dict(self) < 0)
4644 break;
4645 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004647 case DICT:
4648 if (load_dict(self) < 0)
4649 break;
4650 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 case OBJ:
4653 if (noload_obj(self) < 0)
4654 break;
4655 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004657 case INST:
4658 if (noload_inst(self) < 0)
4659 break;
4660 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661
Tim Peterseab7db32003-02-13 18:24:14 +00004662 case NEWOBJ:
4663 if (noload_newobj(self) < 0)
4664 break;
4665 continue;
4666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 case GLOBAL:
4668 if (noload_global(self) < 0)
4669 break;
4670 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 case APPEND:
4673 if (load_append(self) < 0)
4674 break;
4675 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 case APPENDS:
4678 if (load_appends(self) < 0)
4679 break;
4680 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004682 case BUILD:
4683 if (noload_build(self) < 0)
4684 break;
4685 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 case DUP:
4688 if (load_dup(self) < 0)
4689 break;
4690 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 case BINGET:
4693 if (load_binget(self) < 0)
4694 break;
4695 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 case LONG_BINGET:
4698 if (load_long_binget(self) < 0)
4699 break;
4700 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 case GET:
4703 if (load_get(self) < 0)
4704 break;
4705 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004706
Tim Peters2d629652003-02-04 05:06:17 +00004707 case EXT1:
4708 if (noload_extension(self, 1) < 0)
4709 break;
4710 continue;
4711
4712 case EXT2:
4713 if (noload_extension(self, 2) < 0)
4714 break;
4715 continue;
4716
4717 case EXT4:
4718 if (noload_extension(self, 4) < 0)
4719 break;
4720 continue;
4721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 case MARK:
4723 if (load_mark(self) < 0)
4724 break;
4725 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 case BINPUT:
4728 if (load_binput(self) < 0)
4729 break;
4730 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 case LONG_BINPUT:
4733 if (load_long_binput(self) < 0)
4734 break;
4735 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case PUT:
4738 if (load_put(self) < 0)
4739 break;
4740 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 case POP:
4743 if (load_pop(self) < 0)
4744 break;
4745 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 case POP_MARK:
4748 if (load_pop_mark(self) < 0)
4749 break;
4750 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 case SETITEM:
4753 if (load_setitem(self) < 0)
4754 break;
4755 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 case SETITEMS:
4758 if (load_setitems(self) < 0)
4759 break;
4760 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 case STOP:
4763 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 case PERSID:
4766 if (load_persid(self) < 0)
4767 break;
4768 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004770 case BINPERSID:
4771 if (load_binpersid(self) < 0)
4772 break;
4773 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 case REDUCE:
4776 if (noload_reduce(self) < 0)
4777 break;
4778 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004779
Tim Peters4190fb82003-02-02 16:09:05 +00004780 case PROTO:
4781 if (load_proto(self) < 0)
4782 break;
4783 continue;
4784
Tim Peters3c67d792003-02-02 17:59:11 +00004785 case NEWTRUE:
4786 if (load_bool(self, Py_True) < 0)
4787 break;
4788 continue;
4789
4790 case NEWFALSE:
4791 if (load_bool(self, Py_False) < 0)
4792 break;
4793 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004795 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 "invalid load key, '%s'.",
4797 "c", s[0]);
4798 return NULL;
4799 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 break;
4802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 if ((err = PyErr_Occurred())) {
4805 if (err == PyExc_EOFError) {
4806 PyErr_SetNone(PyExc_EOFError);
4807 }
4808 return NULL;
4809 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 PDATA_POP(self->stack, val);
4812 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004813}
Tim Peters84e87f32001-03-17 04:50:51 +00004814
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004815
Guido van Rossum60456fd1997-04-09 17:36:32 +00004816static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004817Unpickler_load(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 load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004820}
4821
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004822static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004823Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004826}
4827
Guido van Rossum60456fd1997-04-09 17:36:32 +00004828
4829static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004830 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004831 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004832 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004833 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004834 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004835 "noload() -- not load a pickle, but go through most of the motions\n"
4836 "\n"
4837 "This function can be used to read past a pickle without instantiating\n"
4838 "any objects or importing any modules. It can also be used to find all\n"
4839 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004840 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004841 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004842 {NULL, NULL} /* sentinel */
4843};
4844
4845
4846static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004847newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004848{
4849 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004850
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004851 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 self->file = NULL;
4855 self->arg = NULL;
4856 self->stack = (Pdata*)Pdata_New();
4857 self->pers_func = NULL;
4858 self->last_string = NULL;
4859 self->marks = NULL;
4860 self->num_marks = 0;
4861 self->marks_size = 0;
4862 self->buf_size = 0;
4863 self->read = NULL;
4864 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004865 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004866
Tim Peterscba30e22003-02-01 06:24:36 +00004867 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004868 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004869
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004870 if (!self->stack)
4871 goto err;
4872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004873 Py_INCREF(f);
4874 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004876 /* Set read, readline based on type of f */
Guido van Rossumda5b8f22007-06-12 23:30:11 +00004877 if (PycStringIO_InputCheck(f)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 self->fp = NULL;
4879 self->read_func = read_cStringIO;
4880 self->readline_func = readline_cStringIO;
4881 }
4882 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 self->fp = NULL;
4885 self->read_func = read_other;
4886 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4889 (self->read = PyObject_GetAttr(f, read_str)))) {
4890 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004891 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 "argument must have 'read' and "
4893 "'readline' attributes" );
4894 goto err;
4895 }
4896 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004897 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004899 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 err:
4902 Py_DECREF((PyObject *)self);
4903 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004904}
4905
4906
4907static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004908get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004909{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004911}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004912
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004913
Guido van Rossum60456fd1997-04-09 17:36:32 +00004914static void
Tim Peterscba30e22003-02-01 06:24:36 +00004915Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004917 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 Py_XDECREF(self->readline);
4919 Py_XDECREF(self->read);
4920 Py_XDECREF(self->file);
4921 Py_XDECREF(self->memo);
4922 Py_XDECREF(self->stack);
4923 Py_XDECREF(self->pers_func);
4924 Py_XDECREF(self->arg);
4925 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00004926 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928 if (self->marks) {
4929 free(self->marks);
4930 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932 if (self->buf_size) {
4933 free(self->buf);
4934 }
Tim Peters84e87f32001-03-17 04:50:51 +00004935
Tim Peters3cfe7542003-05-21 21:29:48 +00004936 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004937}
4938
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004939static int
4940Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
4941{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004942 Py_VISIT(self->readline);
4943 Py_VISIT(self->read);
4944 Py_VISIT(self->file);
4945 Py_VISIT(self->memo);
4946 Py_VISIT(self->stack);
4947 Py_VISIT(self->pers_func);
4948 Py_VISIT(self->arg);
4949 Py_VISIT(self->last_string);
4950 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004951 return 0;
4952}
4953
4954static int
4955Unpickler_clear(Unpicklerobject *self)
4956{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004957 Py_CLEAR(self->readline);
4958 Py_CLEAR(self->read);
4959 Py_CLEAR(self->file);
4960 Py_CLEAR(self->memo);
4961 Py_CLEAR(self->stack);
4962 Py_CLEAR(self->pers_func);
4963 Py_CLEAR(self->arg);
4964 Py_CLEAR(self->last_string);
4965 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004966 return 0;
4967}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004968
4969static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004970Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971{
4972 if (!strcmp(name, "persistent_load")) {
4973 if (!self->pers_func) {
4974 PyErr_SetString(PyExc_AttributeError, name);
4975 return NULL;
4976 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 Py_INCREF(self->pers_func);
4979 return self->pers_func;
4980 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 if (!strcmp(name, "find_global")) {
4983 if (!self->find_class) {
4984 PyErr_SetString(PyExc_AttributeError, name);
4985 return NULL;
4986 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988 Py_INCREF(self->find_class);
4989 return self->find_class;
4990 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 if (!strcmp(name, "memo")) {
4993 if (!self->memo) {
4994 PyErr_SetString(PyExc_AttributeError, name);
4995 return NULL;
4996 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 Py_INCREF(self->memo);
4999 return self->memo;
5000 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005002 if (!strcmp(name, "UnpicklingError")) {
5003 Py_INCREF(UnpicklingError);
5004 return UnpicklingError;
5005 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005008}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005009
Guido van Rossum60456fd1997-04-09 17:36:32 +00005010
5011static int
Tim Peterscba30e22003-02-01 06:24:36 +00005012Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005015 if (!strcmp(name, "persistent_load")) {
5016 Py_XDECREF(self->pers_func);
5017 self->pers_func = value;
5018 Py_XINCREF(value);
5019 return 0;
5020 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005022 if (!strcmp(name, "find_global")) {
5023 Py_XDECREF(self->find_class);
5024 self->find_class = value;
5025 Py_XINCREF(value);
5026 return 0;
5027 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 if (! value) {
5030 PyErr_SetString(PyExc_TypeError,
5031 "attribute deletion is not supported");
5032 return -1;
5033 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005035 if (strcmp(name, "memo") == 0) {
5036 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005037 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 "memo must be a dictionary");
5039 return -1;
5040 }
5041 Py_XDECREF(self->memo);
5042 self->memo = value;
5043 Py_INCREF(value);
5044 return 0;
5045 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 PyErr_SetString(PyExc_AttributeError, name);
5048 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005049}
5050
Tim Peters5bd2a792003-02-01 16:45:06 +00005051/* ---------------------------------------------------------------------------
5052 * Module-level functions.
5053 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005054
Martin v. Löwis544f1192004-07-27 05:22:33 +00005055/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005056static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005057cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005059 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005060 PyObject *ob, *file, *res = NULL;
5061 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005062 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005063
Martin v. Löwis544f1192004-07-27 05:22:33 +00005064 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5065 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005067
Tim Peters5bd2a792003-02-01 16:45:06 +00005068 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 if (dump(pickler, ob) < 0)
5072 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005074 Py_INCREF(Py_None);
5075 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005077 finally:
5078 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005080 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005081}
5082
5083
Martin v. Löwis544f1192004-07-27 05:22:33 +00005084/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005085static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005086cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005088 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 PyObject *ob, *file = 0, *res = NULL;
5090 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005091 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005092
Martin v. Löwis544f1192004-07-27 05:22:33 +00005093 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5094 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005096
Tim Peterscba30e22003-02-01 06:24:36 +00005097 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005098 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005099
Tim Peters5bd2a792003-02-01 16:45:06 +00005100 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005101 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005103 if (dump(pickler, ob) < 0)
5104 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 res = PycStringIO->cgetvalue(file);
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005107 if (res == NULL)
5108 goto finally;
5109 if (!PyBytes_Check(res)) {
5110 PyObject *tmp = res;
5111 res = PyBytes_FromObject(res);
5112 Py_DECREF(tmp);
5113 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005115 finally:
5116 Py_XDECREF(pickler);
5117 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005120}
5121
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005122
Tim Peters5bd2a792003-02-01 16:45:06 +00005123/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005124static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005125cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126{
5127 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005128 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005129
Tim Peterscba30e22003-02-01 06:24:36 +00005130 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 finally:
5136 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005139}
5140
5141
Tim Peters5bd2a792003-02-01 16:45:06 +00005142/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005143static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005144cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005145{
5146 PyObject *ob, *file = 0, *res = NULL;
5147 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005148
Guido van Rossum617dbc42007-05-07 23:57:08 +00005149 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5150 PyErr_Clear();
5151 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5152 goto finally;
5153 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005154
Tim Peterscba30e22003-02-01 06:24:36 +00005155 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005156 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005157
Tim Peterscba30e22003-02-01 06:24:36 +00005158 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163 finally:
5164 Py_XDECREF(file);
5165 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005167 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005168}
5169
5170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005171PyDoc_STRVAR(Unpicklertype__doc__,
5172"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005173
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005174static PyTypeObject Unpicklertype = {
5175 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005176 0, /*ob_size*/
5177 "cPickle.Unpickler", /*tp_name*/
5178 sizeof(Unpicklerobject), /*tp_basicsize*/
5179 0,
5180 (destructor)Unpickler_dealloc, /* tp_dealloc */
5181 0, /* tp_print */
5182 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5183 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5184 0, /* tp_compare */
5185 0, /* tp_repr */
5186 0, /* tp_as_number */
5187 0, /* tp_as_sequence */
5188 0, /* tp_as_mapping */
5189 0, /* tp_hash */
5190 0, /* tp_call */
5191 0, /* tp_str */
5192 0, /* tp_getattro */
5193 0, /* tp_setattro */
5194 0, /* tp_as_buffer */
5195 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5196 Unpicklertype__doc__, /* tp_doc */
5197 (traverseproc)Unpickler_traverse, /* tp_traverse */
5198 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005199};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005200
Guido van Rossum60456fd1997-04-09 17:36:32 +00005201static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005202 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5203 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005204 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005205 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005206 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005207 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005208
Martin v. Löwis544f1192004-07-27 05:22:33 +00005209 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5210 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005211 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005212 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005213 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005214 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005215
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005216 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005217 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005218
Neal Norwitzb0493252002-03-31 14:44:22 +00005219 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005220 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005221
Martin v. Löwis544f1192004-07-27 05:22:33 +00005222 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5223 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005224 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005225 "This takes a file-like object for writing a pickle data stream.\n"
5226 "The optional proto argument tells the pickler to use the given\n"
5227 "protocol; supported protocols are 0, 1, 2. The default\n"
5228 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5229 "only protocol that can be written to a file opened in text\n"
5230 "mode and read back successfully. When using a protocol higher\n"
5231 "than 0, make sure the file is opened in binary mode, both when\n"
5232 "pickling and unpickling.)\n"
5233 "\n"
5234 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5235 "more efficient than protocol 1.\n"
5236 "\n"
5237 "Specifying a negative protocol version selects the highest\n"
5238 "protocol version supported. The higher the protocol used, the\n"
5239 "more recent the version of Python needed to read the pickle\n"
5240 "produced.\n"
5241 "\n"
5242 "The file parameter must have a write() method that accepts a single\n"
5243 "string argument. It can thus be an open file object, a StringIO\n"
5244 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005245 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005246
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005247 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005248 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5249
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005250 { NULL, NULL }
5251};
5252
Guido van Rossum60456fd1997-04-09 17:36:32 +00005253static int
Tim Peterscba30e22003-02-01 06:24:36 +00005254init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005255{
5256 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Martin v. Löwis5b222132007-06-10 09:51:05 +00005258#define INIT_STR(S) if (!( S ## _str=PyUnicode_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005259
Tim Peters3cfe7542003-05-21 21:29:48 +00005260 if (PyType_Ready(&Unpicklertype) < 0)
5261 return -1;
5262 if (PyType_Ready(&Picklertype) < 0)
5263 return -1;
5264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 INIT_STR(__class__);
5266 INIT_STR(__getinitargs__);
5267 INIT_STR(__dict__);
5268 INIT_STR(__getstate__);
5269 INIT_STR(__setstate__);
5270 INIT_STR(__name__);
5271 INIT_STR(__main__);
5272 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005273 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275 INIT_STR(append);
5276 INIT_STR(read);
5277 INIT_STR(readline);
5278 INIT_STR(copy_reg);
5279 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005280
Tim Peterscba30e22003-02-01 06:24:36 +00005281 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005282 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005283
Tim Peters1f1b2d22003-02-01 02:16:37 +00005284 /* This is special because we want to use a different
5285 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005286 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005287 if (!dispatch_table) return -1;
5288
5289 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005290 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005291 if (!extension_registry) return -1;
5292
5293 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005294 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005295 if (!inverted_registry) return -1;
5296
5297 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005298 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005299 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005302
Tim Peters731098b2003-02-04 20:56:09 +00005303 if (!(empty_tuple = PyTuple_New(0)))
5304 return -1;
5305
5306 two_tuple = PyTuple_New(2);
5307 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005309 /* We use this temp container with no regard to refcounts, or to
5310 * keeping containees alive. Exempt from GC, because we don't
5311 * want anything looking at two_tuple() by magic.
5312 */
5313 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315 /* Ugh */
5316 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5317 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5318 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005320 if (!( t=PyDict_New())) return -1;
5321 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005322 "def __str__(self):\n"
5323 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5324 Py_file_input,
5325 module_dict, t) )) return -1;
5326 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005328 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005329 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005330 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005332 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005333
Tim Peterscba30e22003-02-01 06:24:36 +00005334 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005336 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005337 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005339 if (!( t=PyDict_New())) return -1;
5340 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005341 "def __str__(self):\n"
5342 " a=self.args\n"
5343 " a=a and type(a[0]) or '(what)'\n"
5344 " return 'Cannot pickle %s objects' % a\n"
5345 , Py_file_input,
5346 module_dict, t) )) return -1;
5347 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005350 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005353 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005356 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005357 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005358
Martin v. Löwis658009a2002-09-16 17:26:24 +00005359 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5360 UnpicklingError, NULL)))
5361 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005363 if (PyDict_SetItemString(module_dict, "PickleError",
5364 PickleError) < 0)
5365 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005367 if (PyDict_SetItemString(module_dict, "PicklingError",
5368 PicklingError) < 0)
5369 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005371 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5372 UnpicklingError) < 0)
5373 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005375 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5376 UnpickleableError) < 0)
5377 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5380 BadPickleGet) < 0)
5381 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005383 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005386}
5387
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005388#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5389#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005390#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005391PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005392initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005393{
5394 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005395 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005396 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 PyObject *format_version;
5398 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005400 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005401 Unpicklertype.ob_type = &PyType_Type;
5402 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005404 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005405 * so we're forced to use a temporary dictionary. :(
5406 */
5407 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005408 if (!di) return;
5409 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 /* Create the module and add the functions */
5412 m = Py_InitModule4("cPickle", cPickle_methods,
5413 cPickle_module_documentation,
5414 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005415 if (m == NULL)
5416 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 /* Add some symbolic constants to the module */
5419 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005420 v = PyString_FromString(rev);
5421 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424 /* Copy data from di. Waaa. */
5425 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5426 if (PyObject_SetItem(d, k, v) < 0) {
5427 Py_DECREF(di);
5428 return;
5429 }
5430 }
5431 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005432
Tim Peters8587b3c2003-02-13 15:44:41 +00005433 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5434 if (i < 0)
5435 return;
5436
Tim Peters5b7da392003-02-04 00:21:07 +00005437 /* These are purely informational; no code uses them. */
5438 /* File format version we write. */
5439 format_version = PyString_FromString("2.0");
5440 /* Format versions we can read. */
5441 compatible_formats = Py_BuildValue("[sssss]",
5442 "1.0", /* Original protocol 0 */
5443 "1.1", /* Protocol 0 + INST */
5444 "1.2", /* Original protocol 1 */
5445 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005446 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005447 PyDict_SetItemString(d, "format_version", format_version);
5448 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5449 Py_XDECREF(format_version);
5450 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005451}