blob: 00855604066dbd3bc3c97d22fa70dede49c02cd5 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 if (s == NULL) {
424 return 0;
425 }
Tim Peterscba30e22003-02-01 06:24:36 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
428 return -1;
429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000430
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000432}
433
Tim Peters84e87f32001-03-17 04:50:51 +0000434static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000435write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436{
437 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000438 if (n > INT_MAX) return -1;
439 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000440}
441
Tim Peters84e87f32001-03-17 04:50:51 +0000442static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444{
445 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000447
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448 if (_n > INT_MAX)
449 return -1;
450 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000451 if (s == NULL) {
452 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000453 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000455 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456 return -1;
457 }
458 else {
459 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
460 if (write_other(self, NULL, 0) < 0)
461 return -1;
462 }
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (n > WRITE_BUF_SIZE) {
465 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000466 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 return -1;
468 }
469 else {
470 memcpy(self->write_buf + self->buf_size, s, n);
471 self->buf_size += n;
472 return n;
473 }
474 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (self->write) {
477 /* object with write method */
478 ARG_TUP(self, py_str);
479 if (self->arg) {
480 junk = PyObject_Call(self->write, self->arg, NULL);
481 FREE_ARG_TUP(self);
482 }
483 if (junk) Py_DECREF(junk);
484 else return -1;
485 }
486 else
487 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 self->buf_size = 0;
490 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000491}
492
493
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494static Py_ssize_t
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000496{
497 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000499 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
500 PyErr_SetNone(PyExc_EOFError);
501 return -1;
502 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000513 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000516 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
517 return -1;
518 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523}
524
525
Martin v. Löwis18e16552006-02-15 17:27:45 +0000526static Py_ssize_t
527read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528{
529 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000530
Martin v. Löwis18e16552006-02-15 17:27:45 +0000531 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 ARG_TUP(self, bytes);
534 if (self->arg) {
535 str = PyObject_Call(self->read, self->arg, NULL);
536 FREE_ARG_TUP(self);
537 }
538 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 Py_XDECREF(self->last_string);
541 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 if (! (*s = PyString_AsString(str))) return -1;
544 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000545}
546
547
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000549readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000550{
551 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 if ((str_size = PyString_Size(str)) < 0)
559 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 Py_XDECREF(self->last_string);
562 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 if (! (*s = PyString_AsString(str)))
565 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568}
569
Tim Petersee1a53c2003-02-02 02:57:53 +0000570/* Copy the first n bytes from s into newly malloc'ed memory, plus a
571 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
572 * The caller is responsible for free()'ing the return value.
573 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000575pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576{
Tim Petersee1a53c2003-02-02 02:57:53 +0000577 char *r = (char *)malloc(n+1);
578 if (r == NULL)
579 return (char*)PyErr_NoMemory();
580 memcpy(r, s, n);
581 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000583}
584
585
586static int
Tim Peterscba30e22003-02-01 06:24:36 +0000587get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588{
589 PyObject *value, *mv;
590 long c_value;
591 char s[30];
592 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 if (!( mv = PyDict_GetItem(self->memo, id))) {
595 PyErr_SetObject(PyExc_KeyError, id);
596 return -1;
597 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000598
Tim Peterscba30e22003-02-01 06:24:36 +0000599 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 if (!( PyInt_Check(value))) {
603 PyErr_SetString(PicklingError, "no int where int expected in memo");
604 return -1;
605 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000606 c_value = PyInt_AsLong(value);
607 if (c_value == -1 && PyErr_Occurred())
608 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (!self->bin) {
611 s[0] = GET;
612 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
613 len = strlen(s);
614 }
615 else if (Pdata_Check(self->file)) {
616 if (write_other(self, NULL, 0) < 0) return -1;
617 PDATA_APPEND(self->file, mv, -1);
618 return 0;
619 }
620 else {
621 if (c_value < 256) {
622 s[0] = BINGET;
623 s[1] = (int)(c_value & 0xff);
624 len = 2;
625 }
626 else {
627 s[0] = LONG_BINGET;
628 s[1] = (int)(c_value & 0xff);
629 s[2] = (int)((c_value >> 8) & 0xff);
630 s[3] = (int)((c_value >> 16) & 0xff);
631 s[4] = (int)((c_value >> 24) & 0xff);
632 len = 5;
633 }
634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Tim Peters0bc93f52003-02-02 18:29:33 +0000636 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000638
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000639 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000640}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000641
Guido van Rossum60456fd1997-04-09 17:36:32 +0000642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643static int
Tim Peterscba30e22003-02-01 06:24:36 +0000644put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000645{
Tim Peterscba30e22003-02-01 06:24:36 +0000646 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 return put2(self, ob);
650}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000651
Guido van Rossum053b8df1998-11-25 16:18:00 +0000652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000653static int
Tim Peterscba30e22003-02-01 06:24:36 +0000654put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655{
656 char c_str[30];
657 int p;
658 size_t len;
659 int res = -1;
660 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (self->fast)
663 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if ((p = PyDict_Size(self->memo)) < 0)
666 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000669 /* XXX Why?
670 * XXX And does "positive" really mean non-negative?
671 * XXX pickle.py starts with PUT index 0, not 1. This makes for
672 * XXX gratuitous differences between the pickling modules.
673 */
Tim Peterscba30e22003-02-01 06:24:36 +0000674 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000675
Tim Peterscba30e22003-02-01 06:24:36 +0000676 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000677 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000678
Tim Peterscba30e22003-02-01 06:24:36 +0000679 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000680 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000681
Tim Peterscba30e22003-02-01 06:24:36 +0000682 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000685 PyTuple_SET_ITEM(t, 0, memo_len);
686 Py_INCREF(memo_len);
687 PyTuple_SET_ITEM(t, 1, ob);
688 Py_INCREF(ob);
689
690 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
691 goto finally;
692
693 if (!self->bin) {
694 c_str[0] = PUT;
695 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
696 len = strlen(c_str);
697 }
698 else if (Pdata_Check(self->file)) {
699 if (write_other(self, NULL, 0) < 0) return -1;
700 PDATA_APPEND(self->file, memo_len, -1);
701 res=0; /* Job well done ;) */
702 goto finally;
703 }
704 else {
705 if (p >= 256) {
706 c_str[0] = LONG_BINPUT;
707 c_str[1] = (int)(p & 0xff);
708 c_str[2] = (int)((p >> 8) & 0xff);
709 c_str[3] = (int)((p >> 16) & 0xff);
710 c_str[4] = (int)((p >> 24) & 0xff);
711 len = 5;
712 }
713 else {
714 c_str[0] = BINPUT;
715 c_str[1] = p;
716 len = 2;
717 }
718 }
719
Tim Peters0bc93f52003-02-02 18:29:33 +0000720 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 goto finally;
722
723 res = 0;
724
725 finally:
726 Py_XDECREF(py_ob_id);
727 Py_XDECREF(memo_len);
728 Py_XDECREF(t);
729
730 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000731}
732
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000733static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000734whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000735{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000736 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737 PyObject *module = 0, *modules_dict = 0,
738 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000740 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000741 if (module)
742 return module;
743 if (PyErr_ExceptionMatches(PyExc_AttributeError))
744 PyErr_Clear();
745 else
746 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000747
Tim Peterscba30e22003-02-01 06:24:36 +0000748 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751 i = 0;
752 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 global_name_attr = PyObject_GetAttr(module, global_name);
757 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000758 if (PyErr_ExceptionMatches(PyExc_AttributeError))
759 PyErr_Clear();
760 else
761 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 continue;
763 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765 if (global_name_attr != global) {
766 Py_DECREF(global_name_attr);
767 continue;
768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000772 break;
773 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 /* The following implements the rule in pickle.py added in 1.5
776 that used __main__ if no module is found. I don't actually
777 like this rule. jlf
778 */
779 if (!j) {
780 j=1;
781 name=__main___str;
782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000784 Py_INCREF(name);
785 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000786}
787
788
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000790fast_save_enter(Picklerobject *self, PyObject *obj)
791{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 /* if fast_container < 0, we're doing an error exit. */
793 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
794 PyObject *key = NULL;
795 if (self->fast_memo == NULL) {
796 self->fast_memo = PyDict_New();
797 if (self->fast_memo == NULL) {
798 self->fast_container = -1;
799 return 0;
800 }
801 }
802 key = PyLong_FromVoidPtr(obj);
803 if (key == NULL)
804 return 0;
805 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000806 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000807 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000808 "fast mode: can't pickle cyclic objects "
809 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 obj->ob_type->tp_name, obj);
811 self->fast_container = -1;
812 return 0;
813 }
814 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000815 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 self->fast_container = -1;
817 return 0;
818 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000819 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000820 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000822}
823
Tim Peterscba30e22003-02-01 06:24:36 +0000824int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000825fast_save_leave(Picklerobject *self, PyObject *obj)
826{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
828 PyObject *key = PyLong_FromVoidPtr(obj);
829 if (key == NULL)
830 return 0;
831 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000832 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 return 0;
834 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000835 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000836 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000838}
839
840static int
Tim Peterscba30e22003-02-01 06:24:36 +0000841save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842{
843 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000844 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848}
849
Guido van Rossum77f6a652002-04-03 22:41:51 +0000850static int
Tim Peterscba30e22003-02-01 06:24:36 +0000851save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000852{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000853 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000854 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000855 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000856
Tim Peters3c67d792003-02-02 17:59:11 +0000857 if (self->proto >= 2) {
858 char opcode = l ? NEWTRUE : NEWFALSE;
859 if (self->write_func(self, &opcode, 1) < 0)
860 return -1;
861 }
862 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000863 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000864 return 0;
865}
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Guido van Rossum60456fd1997-04-09 17:36:32 +0000867static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000868save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869{
870 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000874#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 || l > 0x7fffffffL
876 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000877#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 ) {
879 /* Text-mode pickle, or long too big to fit in the 4-byte
880 * signed BININT format: store as a string.
881 */
882 c_str[0] = INT;
883 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000884 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 return -1;
886 }
887 else {
888 /* Binary pickle and l fits in a signed 4-byte int. */
889 c_str[1] = (int)( l & 0xff);
890 c_str[2] = (int)((l >> 8) & 0xff);
891 c_str[3] = (int)((l >> 16) & 0xff);
892 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 if ((c_str[4] == 0) && (c_str[3] == 0)) {
895 if (c_str[2] == 0) {
896 c_str[0] = BININT1;
897 len = 2;
898 }
899 else {
900 c_str[0] = BININT2;
901 len = 3;
902 }
903 }
904 else {
905 c_str[0] = BININT;
906 len = 5;
907 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Tim Peters0bc93f52003-02-02 18:29:33 +0000909 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 return -1;
911 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914}
915
916
917static int
Tim Peterscba30e22003-02-01 06:24:36 +0000918save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +0000921 int res = -1;
922 PyObject *repr = NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000923 long val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000925
Guido van Rossumddefaf32007-01-14 03:31:43 +0000926 if (val == -1 && PyErr_Occurred()) {
927 /* out of range for int pickling */
928 PyErr_Clear();
929 }
930 else
931 return save_int(self, val);
932
Tim Petersee1a53c2003-02-02 02:57:53 +0000933 if (self->proto >= 2) {
934 /* Linear-time pickling. */
935 size_t nbits;
936 size_t nbytes;
937 unsigned char *pdata;
938 char c_str[5];
939 int i;
940 int sign = _PyLong_Sign(args);
941
942 if (sign == 0) {
943 /* It's 0 -- an empty bytestring. */
944 c_str[0] = LONG1;
945 c_str[1] = 0;
946 i = self->write_func(self, c_str, 2);
947 if (i < 0) goto finally;
948 res = 0;
949 goto finally;
950 }
951 nbits = _PyLong_NumBits(args);
952 if (nbits == (size_t)-1 && PyErr_Occurred())
953 goto finally;
954 /* How many bytes do we need? There are nbits >> 3 full
955 * bytes of data, and nbits & 7 leftover bits. If there
956 * are any leftover bits, then we clearly need another
957 * byte. Wnat's not so obvious is that we *probably*
958 * need another byte even if there aren't any leftovers:
959 * the most-significant bit of the most-significant byte
960 * acts like a sign bit, and it's usually got a sense
961 * opposite of the one we need. The exception is longs
962 * of the form -(2**(8*j-1)) for j > 0. Such a long is
963 * its own 256's-complement, so has the right sign bit
964 * even without the extra byte. That's a pain to check
965 * for in advance, though, so we always grab an extra
966 * byte at the start, and cut it back later if possible.
967 */
968 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000970 PyErr_SetString(PyExc_OverflowError, "long too large "
971 "to pickle");
972 goto finally;
973 }
974 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
975 if (repr == NULL) goto finally;
976 pdata = (unsigned char *)PyString_AS_STRING(repr);
977 i = _PyLong_AsByteArray((PyLongObject *)args,
978 pdata, nbytes,
979 1 /* little endian */, 1 /* signed */);
980 if (i < 0) goto finally;
981 /* If the long is negative, this may be a byte more than
982 * needed. This is so iff the MSB is all redundant sign
983 * bits.
984 */
985 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
986 (pdata[nbytes - 2] & 0x80) != 0)
987 --nbytes;
988
989 if (nbytes < 256) {
990 c_str[0] = LONG1;
991 c_str[1] = (char)nbytes;
992 size = 2;
993 }
994 else {
995 c_str[0] = LONG4;
996 size = (int)nbytes;
997 for (i = 1; i < 5; i++) {
998 c_str[i] = (char)(size & 0xff);
999 size >>= 8;
1000 }
1001 size = 5;
1002 }
1003 i = self->write_func(self, c_str, size);
1004 if (i < 0) goto finally;
1005 i = self->write_func(self, (char *)pdata, (int)nbytes);
1006 if (i < 0) goto finally;
1007 res = 0;
1008 goto finally;
1009 }
1010
1011 /* proto < 2: write the repr and newline. This is quadratic-time
1012 * (in the number of digits), in both directions.
1013 */
Walter Dörwald1ab83302007-05-18 17:15:44 +00001014 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 if ((size = PyString_Size(repr)) < 0)
1018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Tim Peters0bc93f52003-02-02 18:29:33 +00001023 if (self->write_func(self,
1024 PyString_AS_STRING((PyStringObject *)repr),
1025 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027
Tim Peters0bc93f52003-02-02 18:29:33 +00001028 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001033 finally:
1034 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036}
1037
1038
1039static int
Tim Peterscba30e22003-02-01 06:24:36 +00001040save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001041{
1042 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001044 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001046 str[0] = BINFLOAT;
1047 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001048 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001049 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 return -1;
1051 }
1052 else {
1053 char c_str[250];
1054 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1056 /* Extend the formatted string with a newline character */
1057 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001058
Tim Peters0bc93f52003-02-02 18:29:33 +00001059 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001060 return -1;
1061 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001063 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001064}
1065
1066
1067static int
Tim Peterscba30e22003-02-01 06:24:36 +00001068save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001069{
1070 int size, len;
1071 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001073 if ((size = PyString_Size(args)) < 0)
1074 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001076 if (!self->bin) {
1077 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001079 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001080
Walter Dörwald1ab83302007-05-18 17:15:44 +00001081 if (!( repr = PyObject_ReprStr8(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001082 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001084 if ((len = PyString_Size(repr)) < 0)
1085 goto err;
1086 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001087
Guido van Rossumaa588c42007-06-15 03:35:38 +00001088 /* Strip leading 's' due to repr() of str8() returning s'...' */
1089 if (repr_str[0] == 's')
1090 repr_str++;
1091
Tim Peters0bc93f52003-02-02 18:29:33 +00001092 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001093 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001094
Tim Peters0bc93f52003-02-02 18:29:33 +00001095 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001096 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001097
Tim Peters0bc93f52003-02-02 18:29:33 +00001098 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001099 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001101 Py_XDECREF(repr);
1102 }
1103 else {
1104 int i;
1105 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001107 if ((size = PyString_Size(args)) < 0)
1108 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001110 if (size < 256) {
1111 c_str[0] = SHORT_BINSTRING;
1112 c_str[1] = size;
1113 len = 2;
1114 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001115 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 c_str[0] = BINSTRING;
1117 for (i = 1; i < 5; i++)
1118 c_str[i] = (int)(size >> ((i - 1) * 8));
1119 len = 5;
1120 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001121 else
1122 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001123
Tim Peters0bc93f52003-02-02 18:29:33 +00001124 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 if (size > 128 && Pdata_Check(self->file)) {
1128 if (write_other(self, NULL, 0) < 0) return -1;
1129 PDATA_APPEND(self->file, args, -1);
1130 }
1131 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001132 if (self->write_func(self,
1133 PyString_AS_STRING(
1134 (PyStringObject *)args),
1135 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 return -1;
1137 }
1138 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 if (doput)
1141 if (put(self, args) < 0)
1142 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 err:
1147 Py_XDECREF(repr);
1148 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149}
1150
1151
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001152/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1153 backslash and newline characters to \uXXXX escapes. */
1154static PyObject *
1155modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1156{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 PyObject *repr;
1158 char *p;
1159 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 repr = PyString_FromStringAndSize(NULL, 6 * size);
1164 if (repr == NULL)
1165 return NULL;
1166 if (size == 0)
1167 return repr;
1168
1169 p = q = PyString_AS_STRING(repr);
1170 while (size-- > 0) {
1171 Py_UNICODE ch = *s++;
1172 /* Map 16-bit characters to '\uxxxx' */
1173 if (ch >= 256 || ch == '\\' || ch == '\n') {
1174 *p++ = '\\';
1175 *p++ = 'u';
1176 *p++ = hexdigit[(ch >> 12) & 0xf];
1177 *p++ = hexdigit[(ch >> 8) & 0xf];
1178 *p++ = hexdigit[(ch >> 4) & 0xf];
1179 *p++ = hexdigit[ch & 15];
1180 }
1181 /* Copy everything else as-is */
1182 else
1183 *p++ = (char) ch;
1184 }
1185 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001186 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001187 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001188}
1189
1190
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191static int
Tim Peterscba30e22003-02-01 06:24:36 +00001192save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001194 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if (!PyUnicode_Check(args))
1198 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 if (!self->bin) {
1201 char *repr_str;
1202 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 repr = modified_EncodeRawUnicodeEscape(
1205 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001206 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if ((len = PyString_Size(repr)) < 0)
1210 goto err;
1211 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001212
Tim Peters0bc93f52003-02-02 18:29:33 +00001213 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001215
Tim Peters0bc93f52003-02-02 18:29:33 +00001216 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001218
Tim Peters0bc93f52003-02-02 18:29:33 +00001219 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001222 Py_XDECREF(repr);
1223 }
1224 else {
1225 int i;
1226 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001227
Tim Peterscba30e22003-02-01 06:24:36 +00001228 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001230
Guido van Rossum617dbc42007-05-07 23:57:08 +00001231 assert(PyBytes_Check(repr));
1232 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001234 if (size > INT_MAX)
1235 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001237 c_str[0] = BINUNICODE;
1238 for (i = 1; i < 5; i++)
1239 c_str[i] = (int)(size >> ((i - 1) * 8));
1240 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001241
Tim Peters0bc93f52003-02-02 18:29:33 +00001242 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 if (size > 128 && Pdata_Check(self->file)) {
1246 if (write_other(self, NULL, 0) < 0)
1247 goto err;
1248 PDATA_APPEND(self->file, repr, -1);
1249 }
1250 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001251 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001252 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 goto err;
1254 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001256 Py_DECREF(repr);
1257 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 if (doput)
1260 if (put(self, args) < 0)
1261 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 err:
1266 Py_XDECREF(repr);
1267 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001268}
1269
Tim Peters1d63c9f2003-02-02 20:29:39 +00001270/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1271static int
Tim Peters67920142003-02-05 03:46:17 +00001272store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001273{
1274 int i;
1275 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001276
Tim Peters1d63c9f2003-02-02 20:29:39 +00001277 assert(PyTuple_Size(t) == len);
1278
1279 for (i = 0; i < len; i++) {
1280 PyObject *element = PyTuple_GET_ITEM(t, i);
1281
1282 if (element == NULL)
1283 goto finally;
1284 if (save(self, element, 0) < 0)
1285 goto finally;
1286 }
1287 res = 0;
1288
1289 finally:
1290 return res;
1291}
1292
1293/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1294 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001295 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001296 * (a tuple can be reached from itself), and that requires some subtle
1297 * magic so that it works in all cases. IOW, this is a long routine.
1298 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299static int
Tim Peterscba30e22003-02-01 06:24:36 +00001300save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001302 PyObject *py_tuple_id = NULL;
1303 int len, i;
1304 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001307 static char pop = POP;
1308 static char pop_mark = POP_MARK;
1309 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 if ((len = PyTuple_Size(args)) < 0)
1312 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001313
Tim Peters1d63c9f2003-02-02 20:29:39 +00001314 if (len == 0) {
1315 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001316
Tim Peters1d63c9f2003-02-02 20:29:39 +00001317 if (self->proto) {
1318 c_str[0] = EMPTY_TUPLE;
1319 len = 1;
1320 }
1321 else {
1322 c_str[0] = MARK;
1323 c_str[1] = TUPLE;
1324 len = 2;
1325 }
1326 if (self->write_func(self, c_str, len) >= 0)
1327 res = 0;
1328 /* Don't memoize an empty tuple. */
1329 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001331
Tim Peters1d63c9f2003-02-02 20:29:39 +00001332 /* A non-empty tuple. */
1333
1334 /* id(tuple) isn't in the memo now. If it shows up there after
1335 * saving the tuple elements, the tuple must be recursive, in
1336 * which case we'll pop everything we put on the stack, and fetch
1337 * its value from the memo.
1338 */
1339 py_tuple_id = PyLong_FromVoidPtr(args);
1340 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001342
Tim Peters1d63c9f2003-02-02 20:29:39 +00001343 if (len <= 3 && self->proto >= 2) {
1344 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001345 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001346 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001348 /* pop the len elements */
1349 for (i = 0; i < len; ++i)
1350 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001352 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353 if (get(self, py_tuple_id) < 0)
1354 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 res = 0;
1356 goto finally;
1357 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001358 /* Not recursive. */
1359 if (self->write_func(self, len2opcode + len, 1) < 0)
1360 goto finally;
1361 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001363
Tim Peters1d63c9f2003-02-02 20:29:39 +00001364 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1365 * Generate MARK elt1 elt2 ... TUPLE
1366 */
1367 if (self->write_func(self, &MARKv, 1) < 0)
1368 goto finally;
1369
Tim Peters67920142003-02-05 03:46:17 +00001370 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001371 goto finally;
1372
1373 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1374 /* pop the stack stuff we pushed */
1375 if (self->bin) {
1376 if (self->write_func(self, &pop_mark, 1) < 0)
1377 goto finally;
1378 }
1379 else {
1380 /* Note that we pop one more than len, to remove
1381 * the MARK too.
1382 */
1383 for (i = 0; i <= len; i++)
1384 if (self->write_func(self, &pop, 1) < 0)
1385 goto finally;
1386 }
1387 /* fetch from memo */
1388 if (get(self, py_tuple_id) >= 0)
1389 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 goto finally;
1391 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001392
Tim Peters1d63c9f2003-02-02 20:29:39 +00001393 /* Not recursive. */
1394 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001396
Tim Peters1d63c9f2003-02-02 20:29:39 +00001397 memoize:
1398 if (put(self, args) >= 0)
1399 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 finally:
1402 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001404}
1405
Tim Peters1092d642003-02-11 21:06:20 +00001406/* iter is an iterator giving items, and we batch up chunks of
1407 * MARK item item ... item APPENDS
1408 * opcode sequences. Calling code should have arranged to first create an
1409 * empty list, or list-like object, for the APPENDS to operate on.
1410 * Returns 0 on success, <0 on error.
1411 */
1412static int
1413batch_list(Picklerobject *self, PyObject *iter)
1414{
1415 PyObject *obj;
1416 PyObject *slice[BATCHSIZE];
1417 int i, n;
1418
1419 static char append = APPEND;
1420 static char appends = APPENDS;
1421
1422 assert(iter != NULL);
1423
1424 if (self->proto == 0) {
1425 /* APPENDS isn't available; do one at a time. */
1426 for (;;) {
1427 obj = PyIter_Next(iter);
1428 if (obj == NULL) {
1429 if (PyErr_Occurred())
1430 return -1;
1431 break;
1432 }
1433 i = save(self, obj, 0);
1434 Py_DECREF(obj);
1435 if (i < 0)
1436 return -1;
1437 if (self->write_func(self, &append, 1) < 0)
1438 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001439 }
1440 return 0;
1441 }
1442
1443 /* proto > 0: write in batches of BATCHSIZE. */
1444 do {
1445 /* Get next group of (no more than) BATCHSIZE elements. */
1446 for (n = 0; n < BATCHSIZE; ++n) {
1447 obj = PyIter_Next(iter);
1448 if (obj == NULL) {
1449 if (PyErr_Occurred())
1450 goto BatchFailed;
1451 break;
1452 }
1453 slice[n] = obj;
1454 }
1455
1456 if (n > 1) {
1457 /* Pump out MARK, slice[0:n], APPENDS. */
1458 if (self->write_func(self, &MARKv, 1) < 0)
1459 goto BatchFailed;
1460 for (i = 0; i < n; ++i) {
1461 if (save(self, slice[i], 0) < 0)
1462 goto BatchFailed;
1463 }
1464 if (self->write_func(self, &appends, 1) < 0)
1465 goto BatchFailed;
1466 }
1467 else if (n == 1) {
1468 if (save(self, slice[0], 0) < 0)
1469 goto BatchFailed;
1470 if (self->write_func(self, &append, 1) < 0)
1471 goto BatchFailed;
1472 }
1473
1474 for (i = 0; i < n; ++i) {
1475 Py_DECREF(slice[i]);
1476 }
Tim Peters90975f12003-02-12 05:28:58 +00001477 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001478 return 0;
1479
1480BatchFailed:
1481 while (--n >= 0) {
1482 Py_DECREF(slice[n]);
1483 }
1484 return -1;
1485}
1486
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487static int
Tim Peterscba30e22003-02-01 06:24:36 +00001488save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001489{
Tim Peters1092d642003-02-11 21:06:20 +00001490 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001492 int len;
1493 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 if (self->fast && !fast_save_enter(self, args))
1496 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001497
Tim Peters1092d642003-02-11 21:06:20 +00001498 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 if (self->bin) {
1500 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001501 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 }
1503 else {
1504 s[0] = MARK;
1505 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001506 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508
Tim Peters1092d642003-02-11 21:06:20 +00001509 if (self->write_func(self, s, len) < 0)
1510 goto finally;
1511
1512 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513 if ((len = PyList_Size(args)) < 0)
1514 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001515
Tim Peters1092d642003-02-11 21:06:20 +00001516 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001517 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001518 if (put(self, args) >= 0)
1519 res = 0;
1520 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001521 }
Tim Peters90975f12003-02-12 05:28:58 +00001522 if (put2(self, args) < 0)
1523 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001524
Tim Peters1092d642003-02-11 21:06:20 +00001525 /* Materialize the list elements. */
1526 iter = PyObject_GetIter(args);
1527 if (iter == NULL)
1528 goto finally;
1529 res = batch_list(self, iter);
1530 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 finally:
1533 if (self->fast && !fast_save_leave(self, args))
1534 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001537}
1538
1539
Tim Peters42f08ac2003-02-11 22:43:24 +00001540/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1541 * MARK key value ... key value SETITEMS
1542 * opcode sequences. Calling code should have arranged to first create an
1543 * empty dict, or dict-like object, for the SETITEMS to operate on.
1544 * Returns 0 on success, <0 on error.
1545 *
1546 * This is very much like batch_list(). The difference between saving
1547 * elements directly, and picking apart two-tuples, is so long-winded at
1548 * the C level, though, that attempts to combine these routines were too
1549 * ugly to bear.
1550 */
1551static int
1552batch_dict(Picklerobject *self, PyObject *iter)
1553{
1554 PyObject *p;
1555 PyObject *slice[BATCHSIZE];
1556 int i, n;
1557
1558 static char setitem = SETITEM;
1559 static char setitems = SETITEMS;
1560
1561 assert(iter != NULL);
1562
1563 if (self->proto == 0) {
1564 /* SETITEMS isn't available; do one at a time. */
1565 for (;;) {
1566 p = PyIter_Next(iter);
1567 if (p == NULL) {
1568 if (PyErr_Occurred())
1569 return -1;
1570 break;
1571 }
1572 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1573 PyErr_SetString(PyExc_TypeError, "dict items "
1574 "iterator must return 2-tuples");
1575 return -1;
1576 }
1577 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1578 if (i >= 0)
1579 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1580 Py_DECREF(p);
1581 if (i < 0)
1582 return -1;
1583 if (self->write_func(self, &setitem, 1) < 0)
1584 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001585 }
1586 return 0;
1587 }
1588
1589 /* proto > 0: write in batches of BATCHSIZE. */
1590 do {
1591 /* Get next group of (no more than) BATCHSIZE elements. */
1592 for (n = 0; n < BATCHSIZE; ++n) {
1593 p = PyIter_Next(iter);
1594 if (p == NULL) {
1595 if (PyErr_Occurred())
1596 goto BatchFailed;
1597 break;
1598 }
1599 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1600 PyErr_SetString(PyExc_TypeError, "dict items "
1601 "iterator must return 2-tuples");
1602 goto BatchFailed;
1603 }
1604 slice[n] = p;
1605 }
1606
1607 if (n > 1) {
1608 /* Pump out MARK, slice[0:n], SETITEMS. */
1609 if (self->write_func(self, &MARKv, 1) < 0)
1610 goto BatchFailed;
1611 for (i = 0; i < n; ++i) {
1612 p = slice[i];
1613 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1614 goto BatchFailed;
1615 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1616 goto BatchFailed;
1617 }
1618 if (self->write_func(self, &setitems, 1) < 0)
1619 goto BatchFailed;
1620 }
1621 else if (n == 1) {
1622 p = slice[0];
1623 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1624 goto BatchFailed;
1625 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1626 goto BatchFailed;
1627 if (self->write_func(self, &setitem, 1) < 0)
1628 goto BatchFailed;
1629 }
1630
1631 for (i = 0; i < n; ++i) {
1632 Py_DECREF(slice[i]);
1633 }
Tim Peters90975f12003-02-12 05:28:58 +00001634 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001635 return 0;
1636
1637BatchFailed:
1638 while (--n >= 0) {
1639 Py_DECREF(slice[n]);
1640 }
1641 return -1;
1642}
1643
Guido van Rossum60456fd1997-04-09 17:36:32 +00001644static int
Tim Peterscba30e22003-02-01 06:24:36 +00001645save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646{
Tim Peters42f08ac2003-02-11 22:43:24 +00001647 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001649 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001650 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652 if (self->fast && !fast_save_enter(self, args))
1653 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001654
Tim Peters42f08ac2003-02-11 22:43:24 +00001655 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001656 if (self->bin) {
1657 s[0] = EMPTY_DICT;
1658 len = 1;
1659 }
1660 else {
1661 s[0] = MARK;
1662 s[1] = DICT;
1663 len = 2;
1664 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001665
Tim Peters0bc93f52003-02-02 18:29:33 +00001666 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Tim Peters42f08ac2003-02-11 22:43:24 +00001669 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001670 if ((len = PyDict_Size(args)) < 0)
1671 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001674 if (put(self, args) >= 0)
1675 res = 0;
1676 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001677 }
Tim Peters90975f12003-02-12 05:28:58 +00001678 if (put2(self, args) < 0)
1679 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001680
Tim Peters42f08ac2003-02-11 22:43:24 +00001681 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001682 items = PyObject_CallMethod(args, "items", "()");
1683 if (items == NULL)
1684 goto finally;
1685 iter = PyObject_GetIter(items);
1686 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001687 if (iter == NULL)
1688 goto finally;
1689 res = batch_dict(self, iter);
1690 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 finally:
1693 if (self->fast && !fast_save_leave(self, args))
1694 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001697}
1698
1699
Guido van Rossum60456fd1997-04-09 17:36:32 +00001700static int
Tim Peterscba30e22003-02-01 06:24:36 +00001701save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001703 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 char *name_str, *module_str;
1705 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001709 if (name) {
1710 global_name = name;
1711 Py_INCREF(global_name);
1712 }
1713 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001714 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 goto finally;
1716 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001717
Tim Peterscba30e22003-02-01 06:24:36 +00001718 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001719 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 if ((module_size = PyString_Size(module)) < 0 ||
1722 (name_size = PyString_Size(global_name)) < 0)
1723 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001724
Martin v. Löwis5b222132007-06-10 09:51:05 +00001725 module_str = PyUnicode_AsString(module);
1726 name_str = PyUnicode_AsString(global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727
Guido van Rossum75bfd052002-12-24 18:10:07 +00001728 /* XXX This can be doing a relative import. Clearly it shouldn't,
1729 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 mod = PyImport_ImportModule(module_str);
1731 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001733 "Can't pickle %s: import of module %s "
1734 "failed",
1735 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 goto finally;
1737 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001738 klass = PyObject_GetAttr(mod, global_name);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 if (klass == NULL) {
1740 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001741 "Can't pickle %s: attribute lookup %s.%s "
1742 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743 "OSS", args, module, global_name);
1744 goto finally;
1745 }
1746 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001747 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001749 "Can't pickle %s: it's not the same object "
1750 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751 "OSS", args, module, global_name);
1752 goto finally;
1753 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001754 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001755
Tim Peters731098b2003-02-04 20:56:09 +00001756 if (self->proto >= 2) {
1757 /* See whether this is in the extension registry, and if
1758 * so generate an EXT opcode.
1759 */
1760 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001761 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001762 char c_str[5];
1763 int n;
1764
1765 PyTuple_SET_ITEM(two_tuple, 0, module);
1766 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1767 py_code = PyDict_GetItem(extension_registry, two_tuple);
1768 if (py_code == NULL)
1769 goto gen_global; /* not registered */
1770
1771 /* Verify py_code has the right type and value. */
1772 if (!PyInt_Check(py_code)) {
1773 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001774 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001775 "OO", args, py_code);
1776 goto finally;
1777 }
1778 code = PyInt_AS_LONG(py_code);
1779 if (code <= 0 || code > 0x7fffffffL) {
1780 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1781 "extension code %ld is out of range",
1782 "Ol", args, code);
1783 goto finally;
1784 }
1785
1786 /* Generate an EXT opcode. */
1787 if (code <= 0xff) {
1788 c_str[0] = EXT1;
1789 c_str[1] = (char)code;
1790 n = 2;
1791 }
1792 else if (code <= 0xffff) {
1793 c_str[0] = EXT2;
1794 c_str[1] = (char)(code & 0xff);
1795 c_str[2] = (char)((code >> 8) & 0xff);
1796 n = 3;
1797 }
1798 else {
1799 c_str[0] = EXT4;
1800 c_str[1] = (char)(code & 0xff);
1801 c_str[2] = (char)((code >> 8) & 0xff);
1802 c_str[3] = (char)((code >> 16) & 0xff);
1803 c_str[4] = (char)((code >> 24) & 0xff);
1804 n = 5;
1805 }
1806
1807 if (self->write_func(self, c_str, n) >= 0)
1808 res = 0;
1809 goto finally; /* and don't memoize */
1810 }
1811
1812 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001813 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Tim Peters0bc93f52003-02-02 18:29:33 +00001816 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Tim Peters0bc93f52003-02-02 18:29:33 +00001819 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Tim Peters0bc93f52003-02-02 18:29:33 +00001822 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peters0bc93f52003-02-02 18:29:33 +00001825 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if (put(self, args) < 0)
1829 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 finally:
1834 Py_XDECREF(module);
1835 Py_XDECREF(global_name);
1836 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839}
1840
Guido van Rossum60456fd1997-04-09 17:36:32 +00001841static int
Tim Peterscba30e22003-02-01 06:24:36 +00001842save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843{
1844 PyObject *pid = 0;
1845 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 Py_INCREF(args);
1850 ARG_TUP(self, args);
1851 if (self->arg) {
1852 pid = PyObject_Call(f, self->arg, NULL);
1853 FREE_ARG_TUP(self);
1854 }
1855 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if (pid != Py_None) {
1858 if (!self->bin) {
1859 if (!PyString_Check(pid)) {
1860 PyErr_SetString(PicklingError,
1861 "persistent id must be string");
1862 goto finally;
1863 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001864
Tim Peters0bc93f52003-02-02 18:29:33 +00001865 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 if ((size = PyString_Size(pid)) < 0)
1869 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Tim Peters0bc93f52003-02-02 18:29:33 +00001871 if (self->write_func(self,
1872 PyString_AS_STRING(
1873 (PyStringObject *)pid),
1874 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001875 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Tim Peters0bc93f52003-02-02 18:29:33 +00001877 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 res = 1;
1881 goto finally;
1882 }
1883 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001884 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 res = -1;
1886 else
1887 res = 1;
1888 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 goto finally;
1891 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 finally:
1896 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001899}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001900
Tim Peters71fcda52003-02-14 23:05:28 +00001901/* We're saving ob, and args is the 2-thru-5 tuple returned by the
1902 * appropriate __reduce__ method for ob.
1903 */
Tim Peters84e87f32001-03-17 04:50:51 +00001904static int
Tim Peters71fcda52003-02-14 23:05:28 +00001905save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001906{
Tim Peters71fcda52003-02-14 23:05:28 +00001907 PyObject *callable;
1908 PyObject *argtup;
1909 PyObject *state = NULL;
1910 PyObject *listitems = NULL;
1911 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001912
Tim Peters71fcda52003-02-14 23:05:28 +00001913 int use_newobj = self->proto >= 2;
1914
1915 static char reduce = REDUCE;
1916 static char build = BUILD;
1917 static char newobj = NEWOBJ;
1918
1919 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
1920 &callable,
1921 &argtup,
1922 &state,
1923 &listitems,
1924 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001926
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00001927 if (!PyTuple_Check(argtup)) {
1928 PyErr_SetString(PicklingError,
1929 "args from reduce() should be a tuple");
1930 return -1;
1931 }
1932
Tim Peters71fcda52003-02-14 23:05:28 +00001933 if (state == Py_None)
1934 state = NULL;
1935 if (listitems == Py_None)
1936 listitems = NULL;
1937 if (dictitems == Py_None)
1938 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001939
Tim Peters71fcda52003-02-14 23:05:28 +00001940 /* Protocol 2 special case: if callable's name is __newobj__, use
1941 * NEWOBJ. This consumes a lot of code.
1942 */
1943 if (use_newobj) {
1944 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Tim Peters71fcda52003-02-14 23:05:28 +00001946 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001947 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1948 PyErr_Clear();
1949 else
1950 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00001951 use_newobj = 0;
1952 }
1953 else {
1954 use_newobj = PyString_Check(temp) &&
1955 strcmp(PyString_AS_STRING(temp),
1956 "__newobj__") == 0;
1957 Py_DECREF(temp);
1958 }
1959 }
1960 if (use_newobj) {
1961 PyObject *cls;
1962 PyObject *newargtup;
1963 int n, i;
1964
1965 /* Sanity checks. */
1966 n = PyTuple_Size(argtup);
1967 if (n < 1) {
1968 PyErr_SetString(PicklingError, "__newobj__ arglist "
1969 "is empty");
1970 return -1;
1971 }
1972
1973 cls = PyTuple_GET_ITEM(argtup, 0);
1974 if (! PyObject_HasAttrString(cls, "__new__")) {
1975 PyErr_SetString(PicklingError, "args[0] from "
1976 "__newobj__ args has no __new__");
1977 return -1;
1978 }
1979
1980 /* XXX How could ob be NULL? */
1981 if (ob != NULL) {
1982 PyObject *ob_dot_class;
1983
1984 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001985 if (ob_dot_class == NULL) {
1986 if (PyErr_ExceptionMatches(
1987 PyExc_AttributeError))
1988 PyErr_Clear();
1989 else
1990 return -1;
1991 }
Tim Peters71fcda52003-02-14 23:05:28 +00001992 i = ob_dot_class != cls; /* true iff a problem */
1993 Py_XDECREF(ob_dot_class);
1994 if (i) {
1995 PyErr_SetString(PicklingError, "args[0] from "
1996 "__newobj__ args has the wrong class");
1997 return -1;
1998 }
1999 }
2000
2001 /* Save the class and its __new__ arguments. */
2002 if (save(self, cls, 0) < 0)
2003 return -1;
2004
2005 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2006 if (newargtup == NULL)
2007 return -1;
2008 for (i = 1; i < n; ++i) {
2009 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2010 Py_INCREF(temp);
2011 PyTuple_SET_ITEM(newargtup, i-1, temp);
2012 }
2013 i = save(self, newargtup, 0) < 0;
2014 Py_DECREF(newargtup);
2015 if (i < 0)
2016 return -1;
2017
2018 /* Add NEWOBJ opcode. */
2019 if (self->write_func(self, &newobj, 1) < 0)
2020 return -1;
2021 }
2022 else {
2023 /* Not using NEWOBJ. */
2024 if (save(self, callable, 0) < 0 ||
2025 save(self, argtup, 0) < 0 ||
2026 self->write_func(self, &reduce, 1) < 0)
2027 return -1;
2028 }
2029
2030 /* Memoize. */
2031 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 if (ob != NULL) {
2033 if (state && !PyDict_Check(state)) {
2034 if (put2(self, ob) < 0)
2035 return -1;
2036 }
Tim Peters71fcda52003-02-14 23:05:28 +00002037 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 }
Tim Peters84e87f32001-03-17 04:50:51 +00002040
Guido van Rossum60456fd1997-04-09 17:36:32 +00002041
Tim Peters71fcda52003-02-14 23:05:28 +00002042 if (listitems && batch_list(self, listitems) < 0)
2043 return -1;
2044
2045 if (dictitems && batch_dict(self, dictitems) < 0)
2046 return -1;
2047
2048 if (state) {
2049 if (save(self, state, 0) < 0 ||
2050 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 return -1;
2052 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002055}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Guido van Rossum60456fd1997-04-09 17:36:32 +00002057static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002058save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059{
2060 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002061 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2062 PyObject *arg_tup;
2063 int res = -1;
2064 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Martin v. Löwis5a395302002-08-04 08:20:23 +00002066 if (self->nesting++ > Py_GetRecursionLimit()){
2067 PyErr_SetString(PyExc_RuntimeError,
2068 "maximum recursion depth exceeded");
2069 goto finally;
2070 }
2071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 if (!pers_save && self->pers_func) {
2073 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2074 res = tmp;
2075 goto finally;
2076 }
2077 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002079 if (args == Py_None) {
2080 res = save_none(self, args);
2081 goto finally;
2082 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002087 case 'b':
2088 if (args == Py_False || args == Py_True) {
2089 res = save_bool(self, args);
2090 goto finally;
2091 }
2092 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002093 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 if (type == &PyLong_Type) {
2095 res = save_long(self, args);
2096 goto finally;
2097 }
2098 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002099
Guido van Rossum60456fd1997-04-09 17:36:32 +00002100 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 if (type == &PyFloat_Type) {
2102 res = save_float(self, args);
2103 goto finally;
2104 }
2105 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002106
Guido van Rossum60456fd1997-04-09 17:36:32 +00002107 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002108 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2109 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110 goto finally;
2111 }
2112 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002113
Guido van Rossum32c38e72007-05-07 17:15:57 +00002114 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2116 res = save_string(self, args, 0);
2117 goto finally;
2118 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002119 if ((type == &PyUnicode_Type) && (PyUnicode_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 res = save_unicode(self, args, 0);
2121 goto finally;
2122 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002125 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002126 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 if (PyDict_GetItem(self->memo, py_ob_id)) {
2130 if (get(self, py_ob_id) < 0)
2131 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 res = 0;
2134 goto finally;
2135 }
2136 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002139 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (type == &PyString_Type) {
2141 res = save_string(self, args, 1);
2142 goto finally;
2143 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 if (type == &PyUnicode_Type) {
2145 res = save_unicode(self, args, 1);
2146 goto finally;
2147 }
2148 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002149
Guido van Rossum60456fd1997-04-09 17:36:32 +00002150 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002151 if (type == &PyTuple_Type) {
2152 res = save_tuple(self, args);
2153 goto finally;
2154 }
2155 if (type == &PyType_Type) {
2156 res = save_global(self, args, NULL);
2157 goto finally;
2158 }
2159 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002160
Guido van Rossum60456fd1997-04-09 17:36:32 +00002161 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 if (type == &PyList_Type) {
2163 res = save_list(self, args);
2164 goto finally;
2165 }
2166 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002167
2168 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002169 if (type == &PyDict_Type) {
2170 res = save_dict(self, args);
2171 goto finally;
2172 }
2173 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002174
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002175 case 'i':
2176 break;
2177
2178 case 'c':
2179 break;
2180
Guido van Rossum60456fd1997-04-09 17:36:32 +00002181 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 if (type == &PyFunction_Type) {
2183 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002184 if (res && PyErr_ExceptionMatches(PickleError)) {
2185 /* fall back to reduce */
2186 PyErr_Clear();
2187 break;
2188 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 goto finally;
2190 }
2191 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002192
2193 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 if (type == &PyCFunction_Type) {
2195 res = save_global(self, args, NULL);
2196 goto finally;
2197 }
2198 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 if (!pers_save && self->inst_pers_func) {
2201 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2202 res = tmp;
2203 goto finally;
2204 }
2205 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002206
Jeremy Hylton39c61162002-07-16 19:47:43 +00002207 if (PyType_IsSubtype(type, &PyType_Type)) {
2208 res = save_global(self, args, NULL);
2209 goto finally;
2210 }
2211
Guido van Rossumb289b872003-02-19 01:45:13 +00002212 /* Get a reduction callable, and call it. This may come from
2213 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2214 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002215 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002216 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2217 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002219 Py_INCREF(args);
2220 ARG_TUP(self, args);
2221 if (self->arg) {
2222 t = PyObject_Call(__reduce__, self->arg, NULL);
2223 FREE_ARG_TUP(self);
2224 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002225 }
2226 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002227 /* Check for a __reduce_ex__ method. */
2228 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2229 if (__reduce__ != NULL) {
2230 t = PyInt_FromLong(self->proto);
2231 if (t != NULL) {
2232 ARG_TUP(self, t);
2233 t = NULL;
2234 if (self->arg) {
2235 t = PyObject_Call(__reduce__,
2236 self->arg, NULL);
2237 FREE_ARG_TUP(self);
2238 }
2239 }
2240 }
2241 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002242 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2243 PyErr_Clear();
2244 else
2245 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002246 /* Check for a __reduce__ method. */
2247 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2248 if (__reduce__ != NULL) {
2249 t = PyObject_Call(__reduce__,
2250 empty_tuple, NULL);
2251 }
2252 else {
2253 PyErr_SetObject(UnpickleableError, args);
2254 goto finally;
2255 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002256 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002258
Tim Peters71fcda52003-02-14 23:05:28 +00002259 if (t == NULL)
2260 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002261
Tim Peters71fcda52003-02-14 23:05:28 +00002262 if (PyString_Check(t)) {
2263 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 goto finally;
2265 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002266
Tim Peters71fcda52003-02-14 23:05:28 +00002267 if (! PyTuple_Check(t)) {
2268 cPickle_ErrFormat(PicklingError, "Value returned by "
2269 "%s must be string or tuple",
2270 "O", __reduce__);
2271 goto finally;
2272 }
2273
2274 size = PyTuple_Size(t);
2275 if (size < 2 || size > 5) {
2276 cPickle_ErrFormat(PicklingError, "tuple returned by "
2277 "%s must contain 2 through 5 elements",
2278 "O", __reduce__);
2279 goto finally;
2280 }
2281
2282 arg_tup = PyTuple_GET_ITEM(t, 1);
2283 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2284 cPickle_ErrFormat(PicklingError, "Second element of "
2285 "tuple returned by %s must be a tuple",
2286 "O", __reduce__);
2287 goto finally;
2288 }
2289
2290 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002292 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002293 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 Py_XDECREF(py_ob_id);
2295 Py_XDECREF(__reduce__);
2296 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299}
2300
2301
2302static int
Tim Peterscba30e22003-02-01 06:24:36 +00002303dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304{
2305 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
Tim Peters4190fb82003-02-02 16:09:05 +00002307 if (self->proto >= 2) {
2308 char bytes[2];
2309
2310 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002311 assert(self->proto >= 0 && self->proto < 256);
2312 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002313 if (self->write_func(self, bytes, 2) < 0)
2314 return -1;
2315 }
2316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 if (save(self, args, 0) < 0)
2318 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002319
Tim Peters4190fb82003-02-02 16:09:05 +00002320 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002322
Tim Peters4190fb82003-02-02 16:09:05 +00002323 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002327}
2328
2329static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002330Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331{
Tim Peterscba30e22003-02-01 06:24:36 +00002332 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 PyDict_Clear(self->memo);
2334 Py_INCREF(Py_None);
2335 return Py_None;
2336}
2337
2338static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002339Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340{
2341 int l, i, rsize, ssize, clear=1, lm;
2342 long ik;
2343 PyObject *k, *r;
2344 char *s, *p, *have_get;
2345 Pdata *data;
2346
2347 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002348 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 return NULL;
2350
2351 /* Check to make sure we are based on a list */
2352 if (! Pdata_Check(self->file)) {
2353 PyErr_SetString(PicklingError,
2354 "Attempt to getvalue() a non-list-based pickler");
2355 return NULL;
2356 }
2357
2358 /* flush write buffer */
2359 if (write_other(self, NULL, 0) < 0) return NULL;
2360
2361 data=(Pdata*)self->file;
2362 l=data->length;
2363
2364 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002365 lm = PyDict_Size(self->memo);
2366 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002368 have_get = malloc(lm);
2369 if (have_get == NULL) return PyErr_NoMemory();
2370 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371
2372 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002373 for (rsize = 0, i = l; --i >= 0; ) {
2374 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375
Tim Petersac5687a2003-02-02 18:08:34 +00002376 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378
2379 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002380 ik = PyInt_AsLong(k);
2381 if (ik == -1 && PyErr_Occurred())
2382 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002383 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 PyErr_SetString(PicklingError,
2385 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002386 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 }
Tim Petersac5687a2003-02-02 18:08:34 +00002388 if (have_get[ik]) /* with matching get */
2389 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390 }
2391
2392 else if (! (PyTuple_Check(k) &&
2393 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002394 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 ) {
2396 PyErr_SetString(PicklingError,
2397 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002398 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 }
2400
2401 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002402 ik = PyInt_AsLong(k);
2403 if (ik == -1 && PyErr_Occurred())
2404 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002405 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 PyErr_SetString(PicklingError,
2407 "Invalid get data");
2408 return NULL;
2409 }
Tim Petersac5687a2003-02-02 18:08:34 +00002410 have_get[ik] = 1;
2411 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002413 }
2414
2415 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002416 r = PyString_FromStringAndSize(NULL, rsize);
2417 if (r == NULL) goto err;
2418 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419
Tim Petersac5687a2003-02-02 18:08:34 +00002420 for (i = 0; i < l; i++) {
2421 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002422
2423 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002424 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002426 p=PyString_AS_STRING((PyStringObject *)k);
2427 while (--ssize >= 0)
2428 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 }
2430 }
2431
2432 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002433 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2434 if (ik == -1 && PyErr_Occurred())
2435 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002436 if (ik < 256) {
2437 *s++ = BINGET;
2438 *s++ = (int)(ik & 0xff);
2439 }
2440 else {
2441 *s++ = LONG_BINGET;
2442 *s++ = (int)(ik & 0xff);
2443 *s++ = (int)((ik >> 8) & 0xff);
2444 *s++ = (int)((ik >> 16) & 0xff);
2445 *s++ = (int)((ik >> 24) & 0xff);
2446 }
2447 }
2448
2449 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002450 ik = PyLong_AsLong(k);
2451 if (ik == -1 && PyErr_Occurred())
2452 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453
2454 if (have_get[ik]) { /* with matching get */
2455 if (ik < 256) {
2456 *s++ = BINPUT;
2457 *s++ = (int)(ik & 0xff);
2458 }
2459 else {
2460 *s++ = LONG_BINPUT;
2461 *s++ = (int)(ik & 0xff);
2462 *s++ = (int)((ik >> 8) & 0xff);
2463 *s++ = (int)((ik >> 16) & 0xff);
2464 *s++ = (int)((ik >> 24) & 0xff);
2465 }
2466 }
2467 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468 }
2469
2470 if (clear) {
2471 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002472 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002473 }
2474
2475 free(have_get);
2476 return r;
2477 err:
2478 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002479 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002480}
2481
2482static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002483Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002484{
2485 PyObject *ob;
2486 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002487
Tim Peterscba30e22003-02-01 06:24:36 +00002488 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 if (dump(self, ob) < 0)
2492 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002496 /* XXX Why does dump() return self? */
2497 Py_INCREF(self);
2498 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002499}
2500
2501
Tim Peterscba30e22003-02-01 06:24:36 +00002502static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503{
Neal Norwitzb0493252002-03-31 14:44:22 +00002504 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002505 PyDoc_STR("dump(object) -- "
2506 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002507 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002508 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002509 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002510 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002511 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002512};
2513
2514
2515static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002516newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517{
2518 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519
Tim Peters5bd2a792003-02-01 16:45:06 +00002520 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002521 proto = HIGHEST_PROTOCOL;
2522 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002523 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2524 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002525 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002527 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002528
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002529 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002530 if (self == NULL)
2531 return NULL;
2532 self->proto = proto;
2533 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002534 self->fp = NULL;
2535 self->write = NULL;
2536 self->memo = NULL;
2537 self->arg = NULL;
2538 self->pers_func = NULL;
2539 self->inst_pers_func = NULL;
2540 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002541 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002542 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 self->fast_container = 0;
2544 self->fast_memo = NULL;
2545 self->buf_size = 0;
2546 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002547
Tim Peters5bd2a792003-02-01 16:45:06 +00002548 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002549 if (file)
2550 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002551 else {
2552 file = Pdata_New();
2553 if (file == NULL)
2554 goto err;
2555 }
2556 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002557
Tim Peterscba30e22003-02-01 06:24:36 +00002558 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002559 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002560
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002561 if (PycStringIO_OutputCheck(file)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002562 self->write_func = write_cStringIO;
2563 }
2564 else if (file == Py_None) {
2565 self->write_func = write_none;
2566 }
2567 else {
2568 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 if (! Pdata_Check(file)) {
2571 self->write = PyObject_GetAttr(file, write_str);
2572 if (!self->write) {
2573 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002574 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 "argument must have 'write' "
2576 "attribute");
2577 goto err;
2578 }
2579 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002580
Tim Peters5bd2a792003-02-01 16:45:06 +00002581 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2582 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583 PyErr_NoMemory();
2584 goto err;
2585 }
2586 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002587
Guido van Rossuma8add0e2007-05-14 22:03:55 +00002588 self->dispatch_table = dispatch_table;
2589 Py_INCREF(dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002590 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002592 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002595 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002597}
2598
2599
2600static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002601get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002603 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002605 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606
Tim Peters92c8bb32003-02-13 23:00:26 +00002607 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002608 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002609 * accepts Pickler() and Pickler(integer) too. The meaning then
2610 * is clear as mud, undocumented, and not supported by pickle.py.
2611 * I'm told Zope uses this, but I haven't traced into this code
2612 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002613 */
2614 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002615 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002616 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002617 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2618 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 return NULL;
2620 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002621 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002622}
2623
2624
2625static void
Tim Peterscba30e22003-02-01 06:24:36 +00002626Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002628 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002629 Py_XDECREF(self->write);
2630 Py_XDECREF(self->memo);
2631 Py_XDECREF(self->fast_memo);
2632 Py_XDECREF(self->arg);
2633 Py_XDECREF(self->file);
2634 Py_XDECREF(self->pers_func);
2635 Py_XDECREF(self->inst_pers_func);
2636 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002638 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002639}
2640
2641static int
2642Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2643{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002644 Py_VISIT(self->write);
2645 Py_VISIT(self->memo);
2646 Py_VISIT(self->fast_memo);
2647 Py_VISIT(self->arg);
2648 Py_VISIT(self->file);
2649 Py_VISIT(self->pers_func);
2650 Py_VISIT(self->inst_pers_func);
2651 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002652 return 0;
2653}
2654
2655static int
2656Pickler_clear(Picklerobject *self)
2657{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002658 Py_CLEAR(self->write);
2659 Py_CLEAR(self->memo);
2660 Py_CLEAR(self->fast_memo);
2661 Py_CLEAR(self->arg);
2662 Py_CLEAR(self->file);
2663 Py_CLEAR(self->pers_func);
2664 Py_CLEAR(self->inst_pers_func);
2665 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002666 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002667}
2668
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002669static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002670Pickler_get_pers_func(Picklerobject *p)
2671{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 if (p->pers_func == NULL)
2673 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2674 else
2675 Py_INCREF(p->pers_func);
2676 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002677}
2678
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002679static int
2680Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2681{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682 if (v == NULL) {
2683 PyErr_SetString(PyExc_TypeError,
2684 "attribute deletion is not supported");
2685 return -1;
2686 }
2687 Py_XDECREF(p->pers_func);
2688 Py_INCREF(v);
2689 p->pers_func = v;
2690 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002691}
2692
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002693static int
2694Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2695{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002696 if (v == NULL) {
2697 PyErr_SetString(PyExc_TypeError,
2698 "attribute deletion is not supported");
2699 return -1;
2700 }
2701 Py_XDECREF(p->inst_pers_func);
2702 Py_INCREF(v);
2703 p->inst_pers_func = v;
2704 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002705}
2706
2707static PyObject *
2708Pickler_get_memo(Picklerobject *p)
2709{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 if (p->memo == NULL)
2711 PyErr_SetString(PyExc_AttributeError, "memo");
2712 else
2713 Py_INCREF(p->memo);
2714 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002715}
2716
2717static int
2718Pickler_set_memo(Picklerobject *p, PyObject *v)
2719{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 if (v == NULL) {
2721 PyErr_SetString(PyExc_TypeError,
2722 "attribute deletion is not supported");
2723 return -1;
2724 }
2725 if (!PyDict_Check(v)) {
2726 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2727 return -1;
2728 }
2729 Py_XDECREF(p->memo);
2730 Py_INCREF(v);
2731 p->memo = v;
2732 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002733}
2734
2735static PyObject *
2736Pickler_get_error(Picklerobject *p)
2737{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002738 /* why is this an attribute on the Pickler? */
2739 Py_INCREF(PicklingError);
2740 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002741}
2742
2743static PyMemberDef Pickler_members[] = {
2744 {"binary", T_INT, offsetof(Picklerobject, bin)},
2745 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002746 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002747};
2748
2749static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002750 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002751 (setter)Pickler_set_pers_func},
2752 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2753 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002754 {"PicklingError", (getter)Pickler_get_error, NULL},
2755 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002756};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002758PyDoc_STRVAR(Picklertype__doc__,
2759"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002760
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002761static PyTypeObject Picklertype = {
2762 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002764 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002765 sizeof(Picklerobject), /*tp_basicsize*/
2766 0,
2767 (destructor)Pickler_dealloc, /* tp_dealloc */
2768 0, /* tp_print */
2769 0, /* tp_getattr */
2770 0, /* tp_setattr */
2771 0, /* tp_compare */
2772 0, /* tp_repr */
2773 0, /* tp_as_number */
2774 0, /* tp_as_sequence */
2775 0, /* tp_as_mapping */
2776 0, /* tp_hash */
2777 0, /* tp_call */
2778 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002779 PyObject_GenericGetAttr, /* tp_getattro */
2780 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002781 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002782 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002783 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002784 (traverseproc)Pickler_traverse, /* tp_traverse */
2785 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002786 0, /* tp_richcompare */
2787 0, /* tp_weaklistoffset */
2788 0, /* tp_iter */
2789 0, /* tp_iternext */
2790 Pickler_methods, /* tp_methods */
2791 Pickler_members, /* tp_members */
2792 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002793};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002794
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002795static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002796find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797{
2798 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 if (fc) {
2801 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002802 PyErr_SetString(UnpicklingError, "Global and instance "
2803 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 return NULL;
2805 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2807 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 module = PySys_GetObject("modules");
2811 if (module == NULL)
2812 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 module = PyDict_GetItem(module, py_module_name);
2815 if (module == NULL) {
2816 module = PyImport_Import(py_module_name);
2817 if (!module)
2818 return NULL;
2819 global = PyObject_GetAttr(module, py_global_name);
2820 Py_DECREF(module);
2821 }
2822 else
2823 global = PyObject_GetAttr(module, py_global_name);
2824 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002825}
2826
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002827static int
Tim Peterscba30e22003-02-01 06:24:36 +00002828marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829{
2830 if (self->num_marks < 1) {
2831 PyErr_SetString(UnpicklingError, "could not find MARK");
2832 return -1;
2833 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002836}
2837
Tim Peters84e87f32001-03-17 04:50:51 +00002838
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839static int
Tim Peterscba30e22003-02-01 06:24:36 +00002840load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841{
2842 PDATA_APPEND(self->stack, Py_None, -1);
2843 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002844}
2845
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002846static int
Tim Peterscba30e22003-02-01 06:24:36 +00002847bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848{
2849 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2850 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002851}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
2853static int
Tim Peterscba30e22003-02-01 06:24:36 +00002854load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855{
2856 PyObject *py_int = 0;
2857 char *endptr, *s;
2858 int len, res = -1;
2859 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002860
Tim Peters0bc93f52003-02-02 18:29:33 +00002861 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 if (len < 2) return bad_readline();
2863 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 errno = 0;
2866 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2869 /* Hm, maybe we've got something long. Let's try reading
2870 it as a Python long object. */
2871 errno = 0;
2872 py_int = PyLong_FromString(s, NULL, 0);
2873 if (py_int == NULL) {
2874 PyErr_SetString(PyExc_ValueError,
2875 "could not convert string to int");
2876 goto finally;
2877 }
2878 }
2879 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002880 if (len == 3 && (l == 0 || l == 1)) {
2881 if (!( py_int = PyBool_FromLong(l))) goto finally;
2882 }
2883 else {
2884 if (!( py_int = PyInt_FromLong(l))) goto finally;
2885 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 free(s);
2889 PDATA_PUSH(self->stack, py_int, -1);
2890 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 finally:
2893 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896}
2897
Tim Peters3c67d792003-02-02 17:59:11 +00002898static int
2899load_bool(Unpicklerobject *self, PyObject *boolean)
2900{
2901 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00002902 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00002903 return 0;
2904}
2905
Tim Petersee1a53c2003-02-02 02:57:53 +00002906/* s contains x bytes of a little-endian integer. Return its value as a
2907 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2908 * int, but when x is 4 it's a signed one. This is an historical source
2909 * of x-platform bugs.
2910 */
Tim Peters84e87f32001-03-17 04:50:51 +00002911static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002912calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913{
2914 unsigned char c;
2915 int i;
2916 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 for (i = 0, l = 0L; i < x; i++) {
2919 c = (unsigned char)s[i];
2920 l |= (long)c << (i * 8);
2921 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002922#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2924 * is signed, so on a box with longs bigger than 4 bytes we need
2925 * to extend a BININT's sign bit to the full width.
2926 */
2927 if (x == 4 && l & (1L << 31))
2928 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002929#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002931}
2932
2933
2934static int
Tim Peterscba30e22003-02-01 06:24:36 +00002935load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936{
2937 PyObject *py_int = 0;
2938 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Tim Peterscba30e22003-02-01 06:24:36 +00002942 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PDATA_PUSH(self->stack, py_int, -1);
2946 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002947}
2948
2949
2950static int
Tim Peterscba30e22003-02-01 06:24:36 +00002951load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952{
2953 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002954
Tim Peters0bc93f52003-02-02 18:29:33 +00002955 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959}
2960
2961
2962static int
Tim Peterscba30e22003-02-01 06:24:36 +00002963load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964{
2965 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002966
Tim Peters0bc93f52003-02-02 18:29:33 +00002967 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971}
2972
2973
2974static int
Tim Peterscba30e22003-02-01 06:24:36 +00002975load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976{
2977 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978
Tim Peters0bc93f52003-02-02 18:29:33 +00002979 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983}
Tim Peters84e87f32001-03-17 04:50:51 +00002984
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985static int
Tim Peterscba30e22003-02-01 06:24:36 +00002986load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987{
2988 PyObject *l = 0;
2989 char *end, *s;
2990 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002991
Tim Peters0bc93f52003-02-02 18:29:33 +00002992 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 if (len < 2) return bad_readline();
2994 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002995
Tim Peterscba30e22003-02-01 06:24:36 +00002996 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 free(s);
3000 PDATA_PUSH(self->stack, l, -1);
3001 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 finally:
3004 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007}
3008
Tim Petersee1a53c2003-02-02 02:57:53 +00003009/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3010 * data following.
3011 */
3012static int
3013load_counted_long(Unpicklerobject *self, int size)
3014{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003015 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003016 char *nbytes;
3017 unsigned char *pdata;
3018 PyObject *along;
3019
3020 assert(size == 1 || size == 4);
3021 i = self->read_func(self, &nbytes, size);
3022 if (i < 0) return -1;
3023
3024 size = calc_binint(nbytes, size);
3025 if (size < 0) {
3026 /* Corrupt or hostile pickle -- we never write one like
3027 * this.
3028 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003029 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003030 "byte count");
3031 return -1;
3032 }
3033
3034 if (size == 0)
3035 along = PyLong_FromLong(0L);
3036 else {
3037 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003038 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003039 if (i < 0) return -1;
3040 along = _PyLong_FromByteArray(pdata, (size_t)size,
3041 1 /* little endian */, 1 /* signed */);
3042 }
3043 if (along == NULL)
3044 return -1;
3045 PDATA_PUSH(self->stack, along, -1);
3046 return 0;
3047}
Tim Peters84e87f32001-03-17 04:50:51 +00003048
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049static int
Tim Peterscba30e22003-02-01 06:24:36 +00003050load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051{
3052 PyObject *py_float = 0;
3053 char *endptr, *s;
3054 int len, res = -1;
3055 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Tim Peters0bc93f52003-02-02 18:29:33 +00003057 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003058 if (len < 2) return bad_readline();
3059 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003062 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003064 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3065 PyErr_SetString(PyExc_ValueError,
3066 "could not convert string to float");
3067 goto finally;
3068 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069
Tim Peterscba30e22003-02-01 06:24:36 +00003070 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 free(s);
3074 PDATA_PUSH(self->stack, py_float, -1);
3075 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 finally:
3078 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081}
3082
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083static int
Tim Peterscba30e22003-02-01 06:24:36 +00003084load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085{
Tim Peters9905b942003-03-20 20:53:32 +00003086 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 double x;
3088 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003089
Tim Peters0bc93f52003-02-02 18:29:33 +00003090 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
Tim Peters9905b942003-03-20 20:53:32 +00003093 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3094 if (x == -1.0 && PyErr_Occurred())
3095 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Tim Peters9905b942003-03-20 20:53:32 +00003097 py_float = PyFloat_FromDouble(x);
3098 if (py_float == NULL)
3099 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 PDATA_PUSH(self->stack, py_float, -1);
3102 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003103}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
3105static int
Tim Peterscba30e22003-02-01 06:24:36 +00003106load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107{
3108 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003109 int len, res = -1;
3110 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Tim Peters0bc93f52003-02-02 18:29:33 +00003112 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 if (len < 2) return bad_readline();
3114 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003116
3117 /* Strip outermost quotes */
3118 while (s[len-1] <= ' ')
3119 len--;
3120 if(s[0]=='"' && s[len-1]=='"'){
3121 s[len-1] = '\0';
3122 p = s + 1 ;
3123 len -= 2;
3124 } else if(s[0]=='\'' && s[len-1]=='\''){
3125 s[len-1] = '\0';
3126 p = s + 1 ;
3127 len -= 2;
3128 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 goto insecure;
3130 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003131
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003132 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003133 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003134 if (str) {
3135 PDATA_PUSH(self->stack, str, -1);
3136 res = 0;
3137 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 insecure:
3141 free(s);
3142 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3143 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003144}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003145
3146
3147static int
Tim Peterscba30e22003-02-01 06:24:36 +00003148load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149{
3150 PyObject *py_string = 0;
3151 long l;
3152 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003153
Tim Peters0bc93f52003-02-02 18:29:33 +00003154 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003157
Tim Peters0bc93f52003-02-02 18:29:33 +00003158 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003160
Tim Peterscba30e22003-02-01 06:24:36 +00003161 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003162 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 PDATA_PUSH(self->stack, py_string, -1);
3165 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003166}
3167
3168
3169static int
Tim Peterscba30e22003-02-01 06:24:36 +00003170load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171{
3172 PyObject *py_string = 0;
3173 unsigned char l;
3174 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003175
Tim Peters0bc93f52003-02-02 18:29:33 +00003176 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003180
Tim Peters0bc93f52003-02-02 18:29:33 +00003181 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 PDATA_PUSH(self->stack, py_string, -1);
3186 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003187}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
3189
3190static int
Tim Peterscba30e22003-02-01 06:24:36 +00003191load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003192{
3193 PyObject *str = 0;
3194 int len, res = -1;
3195 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003196
Tim Peters0bc93f52003-02-02 18:29:33 +00003197 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003199
Tim Peterscba30e22003-02-01 06:24:36 +00003200 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 PDATA_PUSH(self->stack, str, -1);
3204 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 finally:
3207 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003208}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003209
3210
3211static int
Tim Peterscba30e22003-02-01 06:24:36 +00003212load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213{
3214 PyObject *unicode;
3215 long l;
3216 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003217
Tim Peters0bc93f52003-02-02 18:29:33 +00003218 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003221
Tim Peters0bc93f52003-02-02 18:29:33 +00003222 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003224
Tim Peterscba30e22003-02-01 06:24:36 +00003225 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 PDATA_PUSH(self->stack, unicode, -1);
3229 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003230}
3231
3232
3233static int
Tim Peterscba30e22003-02-01 06:24:36 +00003234load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235{
3236 PyObject *tup;
3237 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 if ((i = marker(self)) < 0) return -1;
3240 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3241 PDATA_PUSH(self->stack, tup, -1);
3242 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243}
3244
3245static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003246load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003247{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003248 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003249
Tim Peters1d63c9f2003-02-02 20:29:39 +00003250 if (tup == NULL)
3251 return -1;
3252
3253 while (--len >= 0) {
3254 PyObject *element;
3255
3256 PDATA_POP(self->stack, element);
3257 if (element == NULL)
3258 return -1;
3259 PyTuple_SET_ITEM(tup, len, element);
3260 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 PDATA_PUSH(self->stack, tup, -1);
3262 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263}
3264
3265static int
Tim Peterscba30e22003-02-01 06:24:36 +00003266load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267{
3268 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 if (!( list=PyList_New(0))) return -1;
3271 PDATA_PUSH(self->stack, list, -1);
3272 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273}
3274
3275static int
Tim Peterscba30e22003-02-01 06:24:36 +00003276load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277{
3278 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 if (!( dict=PyDict_New())) return -1;
3281 PDATA_PUSH(self->stack, dict, -1);
3282 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283}
3284
3285
3286static int
Tim Peterscba30e22003-02-01 06:24:36 +00003287load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288{
3289 PyObject *list = 0;
3290 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292 if ((i = marker(self)) < 0) return -1;
3293 if (!( list=Pdata_popList(self->stack, i))) return -1;
3294 PDATA_PUSH(self->stack, list, -1);
3295 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296}
3297
3298static int
Tim Peterscba30e22003-02-01 06:24:36 +00003299load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300{
3301 PyObject *dict, *key, *value;
3302 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304 if ((i = marker(self)) < 0) return -1;
3305 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003307 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309 for (k = i+1; k < j; k += 2) {
3310 key =self->stack->data[k-1];
3311 value=self->stack->data[k ];
3312 if (PyDict_SetItem(dict, key, value) < 0) {
3313 Py_DECREF(dict);
3314 return -1;
3315 }
3316 }
3317 Pdata_clear(self->stack, i);
3318 PDATA_PUSH(self->stack, dict, -1);
3319 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320}
3321
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003322static PyObject *
3323Instance_New(PyObject *cls, PyObject *args)
3324{
3325 PyObject *r = 0;
3326
3327 if ((r=PyObject_CallObject(cls, args))) return r;
3328
3329 {
3330 PyObject *tp, *v, *tb, *tmp_value;
3331
3332 PyErr_Fetch(&tp, &v, &tb);
3333 tmp_value = v;
3334 /* NULL occurs when there was a KeyboardInterrupt */
3335 if (tmp_value == NULL)
3336 tmp_value = Py_None;
3337 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3338 Py_XDECREF(v);
3339 v=r;
3340 }
3341 PyErr_Restore(tp,v,tb);
3342 }
3343 return NULL;
3344}
3345
Guido van Rossum60456fd1997-04-09 17:36:32 +00003346
3347static int
Tim Peterscba30e22003-02-01 06:24:36 +00003348load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349{
3350 PyObject *class, *tup, *obj=0;
3351 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 if ((i = marker(self)) < 0) return -1;
3354 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3355 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003356 if (class) {
3357 obj = Instance_New(class, tup);
3358 Py_DECREF(class);
3359 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 if (! obj) return -1;
3363 PDATA_PUSH(self->stack, obj, -1);
3364 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365}
3366
3367
3368static int
Tim Peterscba30e22003-02-01 06:24:36 +00003369load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370{
3371 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3372 int i, len;
3373 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003376
Tim Peters0bc93f52003-02-02 18:29:33 +00003377 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378 if (len < 2) return bad_readline();
3379 module_name = PyString_FromStringAndSize(s, len - 1);
3380 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003381
Tim Peters0bc93f52003-02-02 18:29:33 +00003382 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383 if (len < 2) return bad_readline();
3384 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003385 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 self->find_class);
3387 Py_DECREF(class_name);
3388 }
3389 }
3390 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003395 obj = Instance_New(class, tup);
3396 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 }
3398 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003402 PDATA_PUSH(self->stack, obj, -1);
3403 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003404}
3405
Tim Peterseab7db32003-02-13 18:24:14 +00003406static int
3407load_newobj(Unpicklerobject *self)
3408{
3409 PyObject *args = NULL;
3410 PyObject *clsraw = NULL;
3411 PyTypeObject *cls; /* clsraw cast to its true type */
3412 PyObject *obj;
3413
3414 /* Stack is ... cls argtuple, and we want to call
3415 * cls.__new__(cls, *argtuple).
3416 */
3417 PDATA_POP(self->stack, args);
3418 if (args == NULL) goto Fail;
3419 if (! PyTuple_Check(args)) {
3420 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3421 "tuple.");
3422 goto Fail;
3423 }
3424
3425 PDATA_POP(self->stack, clsraw);
3426 cls = (PyTypeObject *)clsraw;
3427 if (cls == NULL) goto Fail;
3428 if (! PyType_Check(cls)) {
3429 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3430 "isn't a type object");
3431 goto Fail;
3432 }
3433 if (cls->tp_new == NULL) {
3434 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3435 "has NULL tp_new");
3436 goto Fail;
3437 }
3438
3439 /* Call __new__. */
3440 obj = cls->tp_new(cls, args, NULL);
3441 if (obj == NULL) goto Fail;
3442
3443 Py_DECREF(args);
3444 Py_DECREF(clsraw);
3445 PDATA_PUSH(self->stack, obj, -1);
3446 return 0;
3447
3448 Fail:
3449 Py_XDECREF(args);
3450 Py_XDECREF(clsraw);
3451 return -1;
3452}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453
3454static int
Tim Peterscba30e22003-02-01 06:24:36 +00003455load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456{
3457 PyObject *class = 0, *module_name = 0, *class_name = 0;
3458 int len;
3459 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460
Tim Peters0bc93f52003-02-02 18:29:33 +00003461 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 if (len < 2) return bad_readline();
3463 module_name = PyString_FromStringAndSize(s, len - 1);
3464 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
Tim Peters0bc93f52003-02-02 18:29:33 +00003466 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003467 if (len < 2) {
3468 Py_DECREF(module_name);
3469 return bad_readline();
3470 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00003471 if ((class_name = PyUnicode_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003472 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 self->find_class);
3474 Py_DECREF(class_name);
3475 }
3476 }
3477 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479 if (! class) return -1;
3480 PDATA_PUSH(self->stack, class, -1);
3481 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482}
3483
3484
3485static int
Tim Peterscba30e22003-02-01 06:24:36 +00003486load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487{
3488 PyObject *pid = 0;
3489 int len;
3490 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003493 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 if (len < 2) return bad_readline();
3495
3496 pid = PyString_FromStringAndSize(s, len - 1);
3497 if (!pid) return -1;
3498
3499 if (PyList_Check(self->pers_func)) {
3500 if (PyList_Append(self->pers_func, pid) < 0) {
3501 Py_DECREF(pid);
3502 return -1;
3503 }
3504 }
3505 else {
3506 ARG_TUP(self, pid);
3507 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003508 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 NULL);
3510 FREE_ARG_TUP(self);
3511 }
3512 }
3513
3514 if (! pid) return -1;
3515
3516 PDATA_PUSH(self->stack, pid, -1);
3517 return 0;
3518 }
3519 else {
3520 PyErr_SetString(UnpicklingError,
3521 "A load persistent id instruction was encountered,\n"
3522 "but no persistent_load function was specified.");
3523 return -1;
3524 }
3525}
3526
3527static int
Tim Peterscba30e22003-02-01 06:24:36 +00003528load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529{
3530 PyObject *pid = 0;
3531
3532 if (self->pers_func) {
3533 PDATA_POP(self->stack, pid);
3534 if (! pid) return -1;
3535
3536 if (PyList_Check(self->pers_func)) {
3537 if (PyList_Append(self->pers_func, pid) < 0) {
3538 Py_DECREF(pid);
3539 return -1;
3540 }
3541 }
3542 else {
3543 ARG_TUP(self, pid);
3544 if (self->arg) {
3545 pid = PyObject_Call(self->pers_func, self->arg,
3546 NULL);
3547 FREE_ARG_TUP(self);
3548 }
3549 if (! pid) return -1;
3550 }
3551
3552 PDATA_PUSH(self->stack, pid, -1);
3553 return 0;
3554 }
3555 else {
3556 PyErr_SetString(UnpicklingError,
3557 "A load persistent id instruction was encountered,\n"
3558 "but no persistent_load function was specified.");
3559 return -1;
3560 }
3561}
3562
3563
3564static int
Tim Peterscba30e22003-02-01 06:24:36 +00003565load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566{
3567 int len;
3568
3569 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3570
3571 /* Note that we split the (pickle.py) stack into two stacks,
3572 an object stack and a mark stack. We have to be clever and
3573 pop the right one. We do this by looking at the top of the
3574 mark stack.
3575 */
3576
3577 if ((self->num_marks > 0) &&
3578 (self->marks[self->num_marks - 1] == len))
3579 self->num_marks--;
3580 else {
3581 len--;
3582 Py_DECREF(self->stack->data[len]);
3583 self->stack->length=len;
3584 }
3585
3586 return 0;
3587}
3588
3589
3590static int
Tim Peterscba30e22003-02-01 06:24:36 +00003591load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592{
3593 int i;
3594
3595 if ((i = marker(self)) < 0)
3596 return -1;
3597
3598 Pdata_clear(self->stack, i);
3599
3600 return 0;
3601}
3602
3603
3604static int
Tim Peterscba30e22003-02-01 06:24:36 +00003605load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606{
3607 PyObject *last;
3608 int len;
3609
3610 if ((len = self->stack->length) <= 0) return stackUnderflow();
3611 last=self->stack->data[len-1];
3612 Py_INCREF(last);
3613 PDATA_PUSH(self->stack, last, -1);
3614 return 0;
3615}
3616
3617
3618static int
Tim Peterscba30e22003-02-01 06:24:36 +00003619load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620{
3621 PyObject *py_str = 0, *value = 0;
3622 int len;
3623 char *s;
3624 int rc;
3625
Tim Peters0bc93f52003-02-02 18:29:33 +00003626 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003627 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 value = PyDict_GetItem(self->memo, py_str);
3632 if (! value) {
3633 PyErr_SetObject(BadPickleGet, py_str);
3634 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003635 }
3636 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637 PDATA_APPEND(self->stack, value, -1);
3638 rc = 0;
3639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641 Py_DECREF(py_str);
3642 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643}
3644
3645
3646static int
Tim Peterscba30e22003-02-01 06:24:36 +00003647load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648{
3649 PyObject *py_key = 0, *value = 0;
3650 unsigned char key;
3651 char *s;
3652 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003653
Tim Peters0bc93f52003-02-02 18:29:33 +00003654 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003656 key = (unsigned char)s[0];
3657 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003659 value = PyDict_GetItem(self->memo, py_key);
3660 if (! value) {
3661 PyErr_SetObject(BadPickleGet, py_key);
3662 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003663 }
3664 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665 PDATA_APPEND(self->stack, value, -1);
3666 rc = 0;
3667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669 Py_DECREF(py_key);
3670 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671}
3672
3673
3674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *py_key = 0, *value = 0;
3678 unsigned char c;
3679 char *s;
3680 long key;
3681 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003682
Tim Peters0bc93f52003-02-02 18:29:33 +00003683 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 c = (unsigned char)s[0];
3686 key = (long)c;
3687 c = (unsigned char)s[1];
3688 key |= (long)c << 8;
3689 c = (unsigned char)s[2];
3690 key |= (long)c << 16;
3691 c = (unsigned char)s[3];
3692 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3695
3696 value = PyDict_GetItem(self->memo, py_key);
3697 if (! value) {
3698 PyErr_SetObject(BadPickleGet, py_key);
3699 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003700 }
3701 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702 PDATA_APPEND(self->stack, value, -1);
3703 rc = 0;
3704 }
3705
3706 Py_DECREF(py_key);
3707 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003708}
3709
Tim Peters2d629652003-02-04 05:06:17 +00003710/* Push an object from the extension registry (EXT[124]). nbytes is
3711 * the number of bytes following the opcode, holding the index (code) value.
3712 */
3713static int
3714load_extension(Unpicklerobject *self, int nbytes)
3715{
3716 char *codebytes; /* the nbytes bytes after the opcode */
3717 long code; /* calc_binint returns long */
3718 PyObject *py_code; /* code as a Python int */
3719 PyObject *obj; /* the object to push */
3720 PyObject *pair; /* (module_name, class_name) */
3721 PyObject *module_name, *class_name;
3722
3723 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3724 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3725 code = calc_binint(codebytes, nbytes);
3726 if (code <= 0) { /* note that 0 is forbidden */
3727 /* Corrupt or hostile pickle. */
3728 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3729 return -1;
3730 }
3731
3732 /* Look for the code in the cache. */
3733 py_code = PyInt_FromLong(code);
3734 if (py_code == NULL) return -1;
3735 obj = PyDict_GetItem(extension_cache, py_code);
3736 if (obj != NULL) {
3737 /* Bingo. */
3738 Py_DECREF(py_code);
3739 PDATA_APPEND(self->stack, obj, -1);
3740 return 0;
3741 }
3742
3743 /* Look up the (module_name, class_name) pair. */
3744 pair = PyDict_GetItem(inverted_registry, py_code);
3745 if (pair == NULL) {
3746 Py_DECREF(py_code);
3747 PyErr_Format(PyExc_ValueError, "unregistered extension "
3748 "code %ld", code);
3749 return -1;
3750 }
3751 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003752 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003753 */
3754 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3755 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3756 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3757 Py_DECREF(py_code);
3758 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3759 "isn't a 2-tuple of strings", code);
3760 return -1;
3761 }
3762 /* Load the object. */
3763 obj = find_class(module_name, class_name, self->find_class);
3764 if (obj == NULL) {
3765 Py_DECREF(py_code);
3766 return -1;
3767 }
3768 /* Cache code -> obj. */
3769 code = PyDict_SetItem(extension_cache, py_code, obj);
3770 Py_DECREF(py_code);
3771 if (code < 0) {
3772 Py_DECREF(obj);
3773 return -1;
3774 }
3775 PDATA_PUSH(self->stack, obj, -1);
3776 return 0;
3777}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
3779static int
Tim Peterscba30e22003-02-01 06:24:36 +00003780load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781{
3782 PyObject *py_str = 0, *value = 0;
3783 int len, l;
3784 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003785
Tim Peters0bc93f52003-02-02 18:29:33 +00003786 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if (l < 2) return bad_readline();
3788 if (!( len=self->stack->length )) return stackUnderflow();
3789 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3790 value=self->stack->data[len-1];
3791 l=PyDict_SetItem(self->memo, py_str, value);
3792 Py_DECREF(py_str);
3793 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794}
3795
3796
3797static int
Tim Peterscba30e22003-02-01 06:24:36 +00003798load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799{
3800 PyObject *py_key = 0, *value = 0;
3801 unsigned char key;
3802 char *s;
3803 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Tim Peters0bc93f52003-02-02 18:29:33 +00003805 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003806 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3811 value=self->stack->data[len-1];
3812 len=PyDict_SetItem(self->memo, py_key, value);
3813 Py_DECREF(py_key);
3814 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815}
3816
3817
3818static int
Tim Peterscba30e22003-02-01 06:24:36 +00003819load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820{
3821 PyObject *py_key = 0, *value = 0;
3822 long key;
3823 unsigned char c;
3824 char *s;
3825 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Tim Peters0bc93f52003-02-02 18:29:33 +00003827 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003828 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 c = (unsigned char)s[0];
3831 key = (long)c;
3832 c = (unsigned char)s[1];
3833 key |= (long)c << 8;
3834 c = (unsigned char)s[2];
3835 key |= (long)c << 16;
3836 c = (unsigned char)s[3];
3837 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 if (!( py_key = PyInt_FromLong(key))) return -1;
3840 value=self->stack->data[len-1];
3841 len=PyDict_SetItem(self->memo, py_key, value);
3842 Py_DECREF(py_key);
3843 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003844}
3845
3846
3847static int
Tim Peterscba30e22003-02-01 06:24:36 +00003848do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849{
3850 PyObject *value = 0, *list = 0, *append_method = 0;
3851 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003853 len=self->stack->length;
3854 if (!( len >= x && x > 0 )) return stackUnderflow();
3855 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003856 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003858 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 if (PyList_Check(list)) {
3861 PyObject *slice;
3862 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003865 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 list_len = PyList_GET_SIZE(list);
3867 i=PyList_SetSlice(list, list_len, list_len, slice);
3868 Py_DECREF(slice);
3869 return i;
3870 }
3871 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872
Tim Peterscba30e22003-02-01 06:24:36 +00003873 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 return -1;
3875
3876 for (i = x; i < len; i++) {
3877 PyObject *junk;
3878
3879 value=self->stack->data[i];
3880 junk=0;
3881 ARG_TUP(self, value);
3882 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003883 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 NULL);
3885 FREE_ARG_TUP(self);
3886 }
3887 if (! junk) {
3888 Pdata_clear(self->stack, i+1);
3889 self->stack->length=x;
3890 Py_DECREF(append_method);
3891 return -1;
3892 }
3893 Py_DECREF(junk);
3894 }
3895 self->stack->length=x;
3896 Py_DECREF(append_method);
3897 }
3898
3899 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003900}
3901
3902
3903static int
Tim Peterscba30e22003-02-01 06:24:36 +00003904load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905{
3906 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907}
3908
3909
3910static int
Tim Peterscba30e22003-02-01 06:24:36 +00003911load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912{
3913 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914}
3915
3916
3917static int
Tim Peterscba30e22003-02-01 06:24:36 +00003918do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919{
3920 PyObject *value = 0, *key = 0, *dict = 0;
3921 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003923 if (!( (len=self->stack->length) >= x
3924 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928 for (i = x+1; i < len; i += 2) {
3929 key =self->stack->data[i-1];
3930 value=self->stack->data[i ];
3931 if (PyObject_SetItem(dict, key, value) < 0) {
3932 r=-1;
3933 break;
3934 }
3935 }
3936
3937 Pdata_clear(self->stack, x);
3938
3939 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940}
3941
3942
Tim Peters84e87f32001-03-17 04:50:51 +00003943static int
Tim Peterscba30e22003-02-01 06:24:36 +00003944load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945{
3946 return do_setitems(self, self->stack->length - 2);
3947}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949static int
Tim Peterscba30e22003-02-01 06:24:36 +00003950load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951{
3952 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003953}
3954
Tim Peters84e87f32001-03-17 04:50:51 +00003955
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956static int
Tim Peterscba30e22003-02-01 06:24:36 +00003957load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003958{
Tim Peters080c88b2003-02-15 03:01:11 +00003959 PyObject *state, *inst, *slotstate;
3960 PyObject *__setstate__;
3961 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003962 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00003963 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964
Tim Peters080c88b2003-02-15 03:01:11 +00003965 /* Stack is ... instance, state. We want to leave instance at
3966 * the stack top, possibly mutated via instance.__setstate__(state).
3967 */
3968 if (self->stack->length < 2)
3969 return stackUnderflow();
3970 PDATA_POP(self->stack, state);
3971 if (state == NULL)
3972 return -1;
3973 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974
Tim Peters080c88b2003-02-15 03:01:11 +00003975 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
3976 if (__setstate__ != NULL) {
3977 PyObject *junk = NULL;
3978
3979 /* The explicit __setstate__ is responsible for everything. */
3980 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981 if (self->arg) {
3982 junk = PyObject_Call(__setstate__, self->arg, NULL);
3983 FREE_ARG_TUP(self);
3984 }
3985 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00003986 if (junk == NULL)
3987 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 Py_DECREF(junk);
3989 return 0;
3990 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003991 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3992 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00003994
3995 /* A default __setstate__. First see whether state embeds a
3996 * slot state dict too (a proto 2 addition).
3997 */
3998 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
3999 PyObject *temp = state;
4000 state = PyTuple_GET_ITEM(temp, 0);
4001 slotstate = PyTuple_GET_ITEM(temp, 1);
4002 Py_INCREF(state);
4003 Py_INCREF(slotstate);
4004 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004005 }
Tim Peters080c88b2003-02-15 03:01:11 +00004006 else
4007 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008
Tim Peters080c88b2003-02-15 03:01:11 +00004009 /* Set inst.__dict__ from the state dict (if any). */
4010 if (state != Py_None) {
4011 PyObject *dict;
4012 if (! PyDict_Check(state)) {
4013 PyErr_SetString(UnpicklingError, "state is not a "
4014 "dictionary");
4015 goto finally;
4016 }
4017 dict = PyObject_GetAttr(inst, __dict___str);
4018 if (dict == NULL)
4019 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004020
Tim Peters080c88b2003-02-15 03:01:11 +00004021 i = 0;
4022 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4023 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4024 goto finally;
4025 }
4026 Py_DECREF(dict);
4027 }
4028
4029 /* Also set instance attributes from the slotstate dict (if any). */
4030 if (slotstate != NULL) {
4031 if (! PyDict_Check(slotstate)) {
4032 PyErr_SetString(UnpicklingError, "slot state is not "
4033 "a dictionary");
4034 goto finally;
4035 }
4036 i = 0;
4037 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4038 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4039 goto finally;
4040 }
4041 }
4042 res = 0;
4043
4044 finally:
4045 Py_DECREF(state);
4046 Py_XDECREF(slotstate);
4047 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048}
4049
4050
4051static int
Tim Peterscba30e22003-02-01 06:24:36 +00004052load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053{
4054 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 /* Note that we split the (pickle.py) stack into two stacks, an
4057 object stack and a mark stack. Here we push a mark onto the
4058 mark stack.
4059 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004062 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 s=self->marks_size+20;
4064 if (s <= self->num_marks) s=self->num_marks + 1;
4065 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004066 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004068 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004070 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 PyErr_NoMemory();
4072 return -1;
4073 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004074 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004075 self->marks_size = s;
4076 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004081}
4082
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083static int
Tim Peterscba30e22003-02-01 06:24:36 +00004084load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085{
4086 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 PDATA_POP(self->stack, arg_tup);
4089 if (! arg_tup) return -1;
4090 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004091 if (callable) {
4092 ob = Instance_New(callable, arg_tup);
4093 Py_DECREF(callable);
4094 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 PDATA_PUSH(self->stack, ob, -1);
4100 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004101}
Tim Peters84e87f32001-03-17 04:50:51 +00004102
Tim Peters4190fb82003-02-02 16:09:05 +00004103/* Just raises an error if we don't know the protocol specified. PROTO
4104 * is the first opcode for protocols >= 2.
4105 */
4106static int
4107load_proto(Unpicklerobject *self)
4108{
4109 int i;
4110 char *protobyte;
4111
4112 i = self->read_func(self, &protobyte, 1);
4113 if (i < 0)
4114 return -1;
4115
4116 i = calc_binint(protobyte, 1);
4117 /* No point checking for < 0, since calc_binint returns an unsigned
4118 * int when chewing on 1 byte.
4119 */
4120 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004121 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004122 return 0;
4123
4124 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4125 return -1;
4126}
4127
Guido van Rossum60456fd1997-04-09 17:36:32 +00004128static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004129load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004130{
4131 PyObject *err = 0, *val = 0;
4132 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 self->num_marks = 0;
4135 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004138 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 switch (s[0]) {
4142 case NONE:
4143 if (load_none(self) < 0)
4144 break;
4145 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case BININT:
4148 if (load_binint(self) < 0)
4149 break;
4150 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 case BININT1:
4153 if (load_binint1(self) < 0)
4154 break;
4155 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 case BININT2:
4158 if (load_binint2(self) < 0)
4159 break;
4160 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 case INT:
4163 if (load_int(self) < 0)
4164 break;
4165 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004167 case LONG:
4168 if (load_long(self) < 0)
4169 break;
4170 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Tim Petersee1a53c2003-02-02 02:57:53 +00004172 case LONG1:
4173 if (load_counted_long(self, 1) < 0)
4174 break;
4175 continue;
4176
4177 case LONG4:
4178 if (load_counted_long(self, 4) < 0)
4179 break;
4180 continue;
4181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 case FLOAT:
4183 if (load_float(self) < 0)
4184 break;
4185 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 case BINFLOAT:
4188 if (load_binfloat(self) < 0)
4189 break;
4190 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 case BINSTRING:
4193 if (load_binstring(self) < 0)
4194 break;
4195 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 case SHORT_BINSTRING:
4198 if (load_short_binstring(self) < 0)
4199 break;
4200 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 case STRING:
4203 if (load_string(self) < 0)
4204 break;
4205 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 case UNICODE:
4208 if (load_unicode(self) < 0)
4209 break;
4210 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 case BINUNICODE:
4213 if (load_binunicode(self) < 0)
4214 break;
4215 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004218 if (load_counted_tuple(self, 0) < 0)
4219 break;
4220 continue;
4221
4222 case TUPLE1:
4223 if (load_counted_tuple(self, 1) < 0)
4224 break;
4225 continue;
4226
4227 case TUPLE2:
4228 if (load_counted_tuple(self, 2) < 0)
4229 break;
4230 continue;
4231
4232 case TUPLE3:
4233 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 break;
4235 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 case TUPLE:
4238 if (load_tuple(self) < 0)
4239 break;
4240 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 case EMPTY_LIST:
4243 if (load_empty_list(self) < 0)
4244 break;
4245 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 case LIST:
4248 if (load_list(self) < 0)
4249 break;
4250 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004252 case EMPTY_DICT:
4253 if (load_empty_dict(self) < 0)
4254 break;
4255 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 case DICT:
4258 if (load_dict(self) < 0)
4259 break;
4260 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004262 case OBJ:
4263 if (load_obj(self) < 0)
4264 break;
4265 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 case INST:
4268 if (load_inst(self) < 0)
4269 break;
4270 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271
Tim Peterseab7db32003-02-13 18:24:14 +00004272 case NEWOBJ:
4273 if (load_newobj(self) < 0)
4274 break;
4275 continue;
4276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 case GLOBAL:
4278 if (load_global(self) < 0)
4279 break;
4280 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 case APPEND:
4283 if (load_append(self) < 0)
4284 break;
4285 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 case APPENDS:
4288 if (load_appends(self) < 0)
4289 break;
4290 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292 case BUILD:
4293 if (load_build(self) < 0)
4294 break;
4295 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004297 case DUP:
4298 if (load_dup(self) < 0)
4299 break;
4300 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004302 case BINGET:
4303 if (load_binget(self) < 0)
4304 break;
4305 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004307 case LONG_BINGET:
4308 if (load_long_binget(self) < 0)
4309 break;
4310 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 case GET:
4313 if (load_get(self) < 0)
4314 break;
4315 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Tim Peters2d629652003-02-04 05:06:17 +00004317 case EXT1:
4318 if (load_extension(self, 1) < 0)
4319 break;
4320 continue;
4321
4322 case EXT2:
4323 if (load_extension(self, 2) < 0)
4324 break;
4325 continue;
4326
4327 case EXT4:
4328 if (load_extension(self, 4) < 0)
4329 break;
4330 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case MARK:
4332 if (load_mark(self) < 0)
4333 break;
4334 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case BINPUT:
4337 if (load_binput(self) < 0)
4338 break;
4339 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 case LONG_BINPUT:
4342 if (load_long_binput(self) < 0)
4343 break;
4344 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 case PUT:
4347 if (load_put(self) < 0)
4348 break;
4349 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 case POP:
4352 if (load_pop(self) < 0)
4353 break;
4354 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356 case POP_MARK:
4357 if (load_pop_mark(self) < 0)
4358 break;
4359 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 case SETITEM:
4362 if (load_setitem(self) < 0)
4363 break;
4364 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 case SETITEMS:
4367 if (load_setitems(self) < 0)
4368 break;
4369 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 case STOP:
4372 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 case PERSID:
4375 if (load_persid(self) < 0)
4376 break;
4377 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 case BINPERSID:
4380 if (load_binpersid(self) < 0)
4381 break;
4382 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 case REDUCE:
4385 if (load_reduce(self) < 0)
4386 break;
4387 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004388
Tim Peters4190fb82003-02-02 16:09:05 +00004389 case PROTO:
4390 if (load_proto(self) < 0)
4391 break;
4392 continue;
4393
Tim Peters3c67d792003-02-02 17:59:11 +00004394 case NEWTRUE:
4395 if (load_bool(self, Py_True) < 0)
4396 break;
4397 continue;
4398
4399 case NEWFALSE:
4400 if (load_bool(self, Py_False) < 0)
4401 break;
4402 continue;
4403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004404 case '\0':
4405 /* end of file */
4406 PyErr_SetNone(PyExc_EOFError);
4407 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004410 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 "invalid load key, '%s'.",
4412 "c", s[0]);
4413 return NULL;
4414 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 break;
4417 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 if ((err = PyErr_Occurred())) {
4420 if (err == PyExc_EOFError) {
4421 PyErr_SetNone(PyExc_EOFError);
4422 }
4423 return NULL;
4424 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 PDATA_POP(self->stack, val);
4427 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428}
Tim Peters84e87f32001-03-17 04:50:51 +00004429
Guido van Rossum60456fd1997-04-09 17:36:32 +00004430
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004431/* No-load functions to support noload, which is used to
4432 find persistent references. */
4433
4434static int
Tim Peterscba30e22003-02-01 06:24:36 +00004435noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436{
4437 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 if ((i = marker(self)) < 0) return -1;
4440 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004441}
4442
4443
4444static int
Tim Peterscba30e22003-02-01 06:24:36 +00004445noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446{
4447 int i;
4448 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 if ((i = marker(self)) < 0) return -1;
4451 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004452 if (self->readline_func(self, &s) < 0) return -1;
4453 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004454 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004456}
4457
4458static int
Tim Peterseab7db32003-02-13 18:24:14 +00004459noload_newobj(Unpicklerobject *self)
4460{
4461 PyObject *obj;
4462
4463 PDATA_POP(self->stack, obj); /* pop argtuple */
4464 if (obj == NULL) return -1;
4465 Py_DECREF(obj);
4466
4467 PDATA_POP(self->stack, obj); /* pop cls */
4468 if (obj == NULL) return -1;
4469 Py_DECREF(obj);
4470
4471 PDATA_APPEND(self->stack, Py_None, -1);
4472 return 0;
4473}
4474
4475static int
Tim Peterscba30e22003-02-01 06:24:36 +00004476noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477{
4478 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004479
Tim Peters0bc93f52003-02-02 18:29:33 +00004480 if (self->readline_func(self, &s) < 0) return -1;
4481 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 PDATA_APPEND(self->stack, Py_None,-1);
4483 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004484}
4485
4486static int
Tim Peterscba30e22003-02-01 06:24:36 +00004487noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 if (self->stack->length < 2) return stackUnderflow();
4491 Pdata_clear(self->stack, self->stack->length-2);
4492 PDATA_APPEND(self->stack, Py_None,-1);
4493 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004494}
4495
4496static int
4497noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004498
Guido van Rossum053b8df1998-11-25 16:18:00 +00004499 if (self->stack->length < 1) return stackUnderflow();
4500 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004501 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004502}
4503
Tim Peters2d629652003-02-04 05:06:17 +00004504static int
4505noload_extension(Unpicklerobject *self, int nbytes)
4506{
4507 char *codebytes;
4508
4509 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4510 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4511 PDATA_APPEND(self->stack, Py_None, -1);
4512 return 0;
4513}
4514
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004515
4516static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004517noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518{
4519 PyObject *err = 0, *val = 0;
4520 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 self->num_marks = 0;
4523 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004526 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 switch (s[0]) {
4530 case NONE:
4531 if (load_none(self) < 0)
4532 break;
4533 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 case BININT:
4536 if (load_binint(self) < 0)
4537 break;
4538 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 case BININT1:
4541 if (load_binint1(self) < 0)
4542 break;
4543 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 case BININT2:
4546 if (load_binint2(self) < 0)
4547 break;
4548 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 case INT:
4551 if (load_int(self) < 0)
4552 break;
4553 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 case LONG:
4556 if (load_long(self) < 0)
4557 break;
4558 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004559
Tim Peters4190fb82003-02-02 16:09:05 +00004560 case LONG1:
4561 if (load_counted_long(self, 1) < 0)
4562 break;
4563 continue;
4564
4565 case LONG4:
4566 if (load_counted_long(self, 4) < 0)
4567 break;
4568 continue;
4569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004570 case FLOAT:
4571 if (load_float(self) < 0)
4572 break;
4573 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 case BINFLOAT:
4576 if (load_binfloat(self) < 0)
4577 break;
4578 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004580 case BINSTRING:
4581 if (load_binstring(self) < 0)
4582 break;
4583 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 case SHORT_BINSTRING:
4586 if (load_short_binstring(self) < 0)
4587 break;
4588 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 case STRING:
4591 if (load_string(self) < 0)
4592 break;
4593 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 case UNICODE:
4596 if (load_unicode(self) < 0)
4597 break;
4598 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 case BINUNICODE:
4601 if (load_binunicode(self) < 0)
4602 break;
4603 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004606 if (load_counted_tuple(self, 0) < 0)
4607 break;
4608 continue;
4609
4610 case TUPLE1:
4611 if (load_counted_tuple(self, 1) < 0)
4612 break;
4613 continue;
4614
4615 case TUPLE2:
4616 if (load_counted_tuple(self, 2) < 0)
4617 break;
4618 continue;
4619
4620 case TUPLE3:
4621 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 break;
4623 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004625 case TUPLE:
4626 if (load_tuple(self) < 0)
4627 break;
4628 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 case EMPTY_LIST:
4631 if (load_empty_list(self) < 0)
4632 break;
4633 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004635 case LIST:
4636 if (load_list(self) < 0)
4637 break;
4638 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004640 case EMPTY_DICT:
4641 if (load_empty_dict(self) < 0)
4642 break;
4643 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004645 case DICT:
4646 if (load_dict(self) < 0)
4647 break;
4648 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004650 case OBJ:
4651 if (noload_obj(self) < 0)
4652 break;
4653 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655 case INST:
4656 if (noload_inst(self) < 0)
4657 break;
4658 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004659
Tim Peterseab7db32003-02-13 18:24:14 +00004660 case NEWOBJ:
4661 if (noload_newobj(self) < 0)
4662 break;
4663 continue;
4664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 case GLOBAL:
4666 if (noload_global(self) < 0)
4667 break;
4668 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 case APPEND:
4671 if (load_append(self) < 0)
4672 break;
4673 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675 case APPENDS:
4676 if (load_appends(self) < 0)
4677 break;
4678 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 case BUILD:
4681 if (noload_build(self) < 0)
4682 break;
4683 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 case DUP:
4686 if (load_dup(self) < 0)
4687 break;
4688 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 case BINGET:
4691 if (load_binget(self) < 0)
4692 break;
4693 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 case LONG_BINGET:
4696 if (load_long_binget(self) < 0)
4697 break;
4698 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 case GET:
4701 if (load_get(self) < 0)
4702 break;
4703 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004704
Tim Peters2d629652003-02-04 05:06:17 +00004705 case EXT1:
4706 if (noload_extension(self, 1) < 0)
4707 break;
4708 continue;
4709
4710 case EXT2:
4711 if (noload_extension(self, 2) < 0)
4712 break;
4713 continue;
4714
4715 case EXT4:
4716 if (noload_extension(self, 4) < 0)
4717 break;
4718 continue;
4719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case MARK:
4721 if (load_mark(self) < 0)
4722 break;
4723 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 case BINPUT:
4726 if (load_binput(self) < 0)
4727 break;
4728 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 case LONG_BINPUT:
4731 if (load_long_binput(self) < 0)
4732 break;
4733 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 case PUT:
4736 if (load_put(self) < 0)
4737 break;
4738 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 case POP:
4741 if (load_pop(self) < 0)
4742 break;
4743 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 case POP_MARK:
4746 if (load_pop_mark(self) < 0)
4747 break;
4748 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 case SETITEM:
4751 if (load_setitem(self) < 0)
4752 break;
4753 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 case SETITEMS:
4756 if (load_setitems(self) < 0)
4757 break;
4758 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 case STOP:
4761 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 case PERSID:
4764 if (load_persid(self) < 0)
4765 break;
4766 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 case BINPERSID:
4769 if (load_binpersid(self) < 0)
4770 break;
4771 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 case REDUCE:
4774 if (noload_reduce(self) < 0)
4775 break;
4776 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004777
Tim Peters4190fb82003-02-02 16:09:05 +00004778 case PROTO:
4779 if (load_proto(self) < 0)
4780 break;
4781 continue;
4782
Tim Peters3c67d792003-02-02 17:59:11 +00004783 case NEWTRUE:
4784 if (load_bool(self, Py_True) < 0)
4785 break;
4786 continue;
4787
4788 case NEWFALSE:
4789 if (load_bool(self, Py_False) < 0)
4790 break;
4791 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004793 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 "invalid load key, '%s'.",
4795 "c", s[0]);
4796 return NULL;
4797 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 break;
4800 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802 if ((err = PyErr_Occurred())) {
4803 if (err == PyExc_EOFError) {
4804 PyErr_SetNone(PyExc_EOFError);
4805 }
4806 return NULL;
4807 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 PDATA_POP(self->stack, val);
4810 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004811}
Tim Peters84e87f32001-03-17 04:50:51 +00004812
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004813
Guido van Rossum60456fd1997-04-09 17:36:32 +00004814static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004815Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818}
4819
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004821Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004824}
4825
Guido van Rossum60456fd1997-04-09 17:36:32 +00004826
4827static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004828 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004829 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004830 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004831 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004832 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004833 "noload() -- not load a pickle, but go through most of the motions\n"
4834 "\n"
4835 "This function can be used to read past a pickle without instantiating\n"
4836 "any objects or importing any modules. It can also be used to find all\n"
4837 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004838 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004839 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004840 {NULL, NULL} /* sentinel */
4841};
4842
4843
4844static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004845newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846{
4847 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004848
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004849 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004850 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 self->file = NULL;
4853 self->arg = NULL;
4854 self->stack = (Pdata*)Pdata_New();
4855 self->pers_func = NULL;
4856 self->last_string = NULL;
4857 self->marks = NULL;
4858 self->num_marks = 0;
4859 self->marks_size = 0;
4860 self->buf_size = 0;
4861 self->read = NULL;
4862 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004864
Tim Peterscba30e22003-02-01 06:24:36 +00004865 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004866 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004867
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004868 if (!self->stack)
4869 goto err;
4870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004871 Py_INCREF(f);
4872 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004874 /* Set read, readline based on type of f */
Guido van Rossumda5b8f22007-06-12 23:30:11 +00004875 if (PycStringIO_InputCheck(f)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004876 self->fp = NULL;
4877 self->read_func = read_cStringIO;
4878 self->readline_func = readline_cStringIO;
4879 }
4880 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 self->fp = NULL;
4883 self->read_func = read_other;
4884 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4887 (self->read = PyObject_GetAttr(f, read_str)))) {
4888 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004889 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004890 "argument must have 'read' and "
4891 "'readline' attributes" );
4892 goto err;
4893 }
4894 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004895 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004899 err:
4900 Py_DECREF((PyObject *)self);
4901 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004902}
4903
4904
4905static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004906get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004909}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004910
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004911
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912static void
Tim Peterscba30e22003-02-01 06:24:36 +00004913Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004915 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 Py_XDECREF(self->readline);
4917 Py_XDECREF(self->read);
4918 Py_XDECREF(self->file);
4919 Py_XDECREF(self->memo);
4920 Py_XDECREF(self->stack);
4921 Py_XDECREF(self->pers_func);
4922 Py_XDECREF(self->arg);
4923 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00004924 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 if (self->marks) {
4927 free(self->marks);
4928 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 if (self->buf_size) {
4931 free(self->buf);
4932 }
Tim Peters84e87f32001-03-17 04:50:51 +00004933
Tim Peters3cfe7542003-05-21 21:29:48 +00004934 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004935}
4936
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004937static int
4938Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
4939{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004940 Py_VISIT(self->readline);
4941 Py_VISIT(self->read);
4942 Py_VISIT(self->file);
4943 Py_VISIT(self->memo);
4944 Py_VISIT(self->stack);
4945 Py_VISIT(self->pers_func);
4946 Py_VISIT(self->arg);
4947 Py_VISIT(self->last_string);
4948 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004949 return 0;
4950}
4951
4952static int
4953Unpickler_clear(Unpicklerobject *self)
4954{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004955 Py_CLEAR(self->readline);
4956 Py_CLEAR(self->read);
4957 Py_CLEAR(self->file);
4958 Py_CLEAR(self->memo);
4959 Py_CLEAR(self->stack);
4960 Py_CLEAR(self->pers_func);
4961 Py_CLEAR(self->arg);
4962 Py_CLEAR(self->last_string);
4963 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004964 return 0;
4965}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004966
4967static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004968Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969{
4970 if (!strcmp(name, "persistent_load")) {
4971 if (!self->pers_func) {
4972 PyErr_SetString(PyExc_AttributeError, name);
4973 return NULL;
4974 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 Py_INCREF(self->pers_func);
4977 return self->pers_func;
4978 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004980 if (!strcmp(name, "find_global")) {
4981 if (!self->find_class) {
4982 PyErr_SetString(PyExc_AttributeError, name);
4983 return NULL;
4984 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 Py_INCREF(self->find_class);
4987 return self->find_class;
4988 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 if (!strcmp(name, "memo")) {
4991 if (!self->memo) {
4992 PyErr_SetString(PyExc_AttributeError, name);
4993 return NULL;
4994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 Py_INCREF(self->memo);
4997 return self->memo;
4998 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000 if (!strcmp(name, "UnpicklingError")) {
5001 Py_INCREF(UnpicklingError);
5002 return UnpicklingError;
5003 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005005 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005006}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005007
Guido van Rossum60456fd1997-04-09 17:36:32 +00005008
5009static int
Tim Peterscba30e22003-02-01 06:24:36 +00005010Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005011{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 if (!strcmp(name, "persistent_load")) {
5014 Py_XDECREF(self->pers_func);
5015 self->pers_func = value;
5016 Py_XINCREF(value);
5017 return 0;
5018 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005020 if (!strcmp(name, "find_global")) {
5021 Py_XDECREF(self->find_class);
5022 self->find_class = value;
5023 Py_XINCREF(value);
5024 return 0;
5025 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005027 if (! value) {
5028 PyErr_SetString(PyExc_TypeError,
5029 "attribute deletion is not supported");
5030 return -1;
5031 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 if (strcmp(name, "memo") == 0) {
5034 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005035 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 "memo must be a dictionary");
5037 return -1;
5038 }
5039 Py_XDECREF(self->memo);
5040 self->memo = value;
5041 Py_INCREF(value);
5042 return 0;
5043 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005045 PyErr_SetString(PyExc_AttributeError, name);
5046 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005047}
5048
Tim Peters5bd2a792003-02-01 16:45:06 +00005049/* ---------------------------------------------------------------------------
5050 * Module-level functions.
5051 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005052
Martin v. Löwis544f1192004-07-27 05:22:33 +00005053/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005054static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005055cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005057 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 PyObject *ob, *file, *res = NULL;
5059 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005060 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005061
Martin v. Löwis544f1192004-07-27 05:22:33 +00005062 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5063 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005065
Tim Peters5bd2a792003-02-01 16:45:06 +00005066 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 if (dump(pickler, ob) < 0)
5070 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 Py_INCREF(Py_None);
5073 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005075 finally:
5076 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005078 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005079}
5080
5081
Martin v. Löwis544f1192004-07-27 05:22:33 +00005082/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005083static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005084cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005086 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 PyObject *ob, *file = 0, *res = NULL;
5088 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005089 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005090
Martin v. Löwis544f1192004-07-27 05:22:33 +00005091 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5092 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005093 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005094
Tim Peterscba30e22003-02-01 06:24:36 +00005095 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005096 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005097
Tim Peters5bd2a792003-02-01 16:45:06 +00005098 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005099 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005101 if (dump(pickler, ob) < 0)
5102 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005104 res = PycStringIO->cgetvalue(file);
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005105 if (res == NULL)
5106 goto finally;
5107 if (!PyBytes_Check(res)) {
5108 PyObject *tmp = res;
5109 res = PyBytes_FromObject(res);
5110 Py_DECREF(tmp);
5111 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005113 finally:
5114 Py_XDECREF(pickler);
5115 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005118}
5119
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005120
Tim Peters5bd2a792003-02-01 16:45:06 +00005121/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005122static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005123cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124{
5125 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005126 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127
Tim Peterscba30e22003-02-01 06:24:36 +00005128 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 finally:
5134 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005136 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005137}
5138
5139
Tim Peters5bd2a792003-02-01 16:45:06 +00005140/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005141static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005142cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005143{
5144 PyObject *ob, *file = 0, *res = NULL;
5145 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005146
Guido van Rossum617dbc42007-05-07 23:57:08 +00005147 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5148 PyErr_Clear();
5149 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5150 goto finally;
5151 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005152
Tim Peterscba30e22003-02-01 06:24:36 +00005153 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005155
Tim Peterscba30e22003-02-01 06:24:36 +00005156 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 finally:
5162 Py_XDECREF(file);
5163 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005166}
5167
5168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005169PyDoc_STRVAR(Unpicklertype__doc__,
5170"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005171
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005172static PyTypeObject Unpicklertype = {
5173 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005174 0, /*ob_size*/
5175 "cPickle.Unpickler", /*tp_name*/
5176 sizeof(Unpicklerobject), /*tp_basicsize*/
5177 0,
5178 (destructor)Unpickler_dealloc, /* tp_dealloc */
5179 0, /* tp_print */
5180 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5181 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5182 0, /* tp_compare */
5183 0, /* tp_repr */
5184 0, /* tp_as_number */
5185 0, /* tp_as_sequence */
5186 0, /* tp_as_mapping */
5187 0, /* tp_hash */
5188 0, /* tp_call */
5189 0, /* tp_str */
5190 0, /* tp_getattro */
5191 0, /* tp_setattro */
5192 0, /* tp_as_buffer */
5193 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5194 Unpicklertype__doc__, /* tp_doc */
5195 (traverseproc)Unpickler_traverse, /* tp_traverse */
5196 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005197};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005198
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005200 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5201 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005202 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005203 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005204 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005205 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005206
Martin v. Löwis544f1192004-07-27 05:22:33 +00005207 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5208 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005209 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005210 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005211 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005212 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005213
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005214 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005215 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005216
Neal Norwitzb0493252002-03-31 14:44:22 +00005217 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005218 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005219
Martin v. Löwis544f1192004-07-27 05:22:33 +00005220 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5221 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005222 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005223 "This takes a file-like object for writing a pickle data stream.\n"
5224 "The optional proto argument tells the pickler to use the given\n"
5225 "protocol; supported protocols are 0, 1, 2. The default\n"
5226 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5227 "only protocol that can be written to a file opened in text\n"
5228 "mode and read back successfully. When using a protocol higher\n"
5229 "than 0, make sure the file is opened in binary mode, both when\n"
5230 "pickling and unpickling.)\n"
5231 "\n"
5232 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5233 "more efficient than protocol 1.\n"
5234 "\n"
5235 "Specifying a negative protocol version selects the highest\n"
5236 "protocol version supported. The higher the protocol used, the\n"
5237 "more recent the version of Python needed to read the pickle\n"
5238 "produced.\n"
5239 "\n"
5240 "The file parameter must have a write() method that accepts a single\n"
5241 "string argument. It can thus be an open file object, a StringIO\n"
5242 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005243 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005244
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005245 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005246 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5247
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005248 { NULL, NULL }
5249};
5250
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251static int
Tim Peterscba30e22003-02-01 06:24:36 +00005252init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253{
5254 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005255
Martin v. Löwis5b222132007-06-10 09:51:05 +00005256#define INIT_STR(S) if (!( S ## _str=PyUnicode_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Tim Peters3cfe7542003-05-21 21:29:48 +00005258 if (PyType_Ready(&Unpicklertype) < 0)
5259 return -1;
5260 if (PyType_Ready(&Picklertype) < 0)
5261 return -1;
5262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005263 INIT_STR(__class__);
5264 INIT_STR(__getinitargs__);
5265 INIT_STR(__dict__);
5266 INIT_STR(__getstate__);
5267 INIT_STR(__setstate__);
5268 INIT_STR(__name__);
5269 INIT_STR(__main__);
5270 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005271 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005272 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005273 INIT_STR(append);
5274 INIT_STR(read);
5275 INIT_STR(readline);
5276 INIT_STR(copy_reg);
5277 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005278
Tim Peterscba30e22003-02-01 06:24:36 +00005279 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005280 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005281
Tim Peters1f1b2d22003-02-01 02:16:37 +00005282 /* This is special because we want to use a different
5283 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005284 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005285 if (!dispatch_table) return -1;
5286
5287 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005288 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005289 if (!extension_registry) return -1;
5290
5291 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005292 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005293 if (!inverted_registry) return -1;
5294
5295 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005296 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005297 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005299 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005300
Tim Peters731098b2003-02-04 20:56:09 +00005301 if (!(empty_tuple = PyTuple_New(0)))
5302 return -1;
5303
5304 two_tuple = PyTuple_New(2);
5305 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005307 /* We use this temp container with no regard to refcounts, or to
5308 * keeping containees alive. Exempt from GC, because we don't
5309 * want anything looking at two_tuple() by magic.
5310 */
5311 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005313 /* Ugh */
5314 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5315 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5316 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005318 if (!( t=PyDict_New())) return -1;
5319 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005320 "def __str__(self):\n"
5321 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5322 Py_file_input,
5323 module_dict, t) )) return -1;
5324 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005327 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005328 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005330 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005331
Tim Peterscba30e22003-02-01 06:24:36 +00005332 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005334 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005337 if (!( t=PyDict_New())) return -1;
5338 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005339 "def __str__(self):\n"
5340 " a=self.args\n"
5341 " a=a and type(a[0]) or '(what)'\n"
5342 " return 'Cannot pickle %s objects' % a\n"
5343 , Py_file_input,
5344 module_dict, t) )) return -1;
5345 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005347 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005348 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005353 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005354 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005356
Martin v. Löwis658009a2002-09-16 17:26:24 +00005357 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5358 UnpicklingError, NULL)))
5359 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005361 if (PyDict_SetItemString(module_dict, "PickleError",
5362 PickleError) < 0)
5363 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005365 if (PyDict_SetItemString(module_dict, "PicklingError",
5366 PicklingError) < 0)
5367 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005369 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5370 UnpicklingError) < 0)
5371 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5374 UnpickleableError) < 0)
5375 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005377 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5378 BadPickleGet) < 0)
5379 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005381 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005383 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005384}
5385
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005386#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5387#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005388#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005389PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005390initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391{
5392 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005393 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005394 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395 PyObject *format_version;
5396 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005399 Unpicklertype.ob_type = &PyType_Type;
5400 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005403 * so we're forced to use a temporary dictionary. :(
5404 */
5405 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 if (!di) return;
5407 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005409 /* Create the module and add the functions */
5410 m = Py_InitModule4("cPickle", cPickle_methods,
5411 cPickle_module_documentation,
5412 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005413 if (m == NULL)
5414 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005416 /* Add some symbolic constants to the module */
5417 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005418 v = PyString_FromString(rev);
5419 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005420 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 /* Copy data from di. Waaa. */
5423 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5424 if (PyObject_SetItem(d, k, v) < 0) {
5425 Py_DECREF(di);
5426 return;
5427 }
5428 }
5429 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005430
Tim Peters8587b3c2003-02-13 15:44:41 +00005431 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5432 if (i < 0)
5433 return;
5434
Tim Peters5b7da392003-02-04 00:21:07 +00005435 /* These are purely informational; no code uses them. */
5436 /* File format version we write. */
5437 format_version = PyString_FromString("2.0");
5438 /* Format versions we can read. */
5439 compatible_formats = Py_BuildValue("[sssss]",
5440 "1.0", /* Original protocol 0 */
5441 "1.1", /* Protocol 0 + INST */
5442 "1.2", /* Original protocol 1 */
5443 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005444 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005445 PyDict_SetItemString(d, "format_version", format_version);
5446 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5447 Py_XDECREF(format_version);
5448 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005449}