blob: 95d619dc9100612fb969acb2d1094297b11e04cd [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
Georg Brandldffbf5f2008-05-20 07:49:57 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
Tim Peters5b7da392003-02-04 00:21:07 +0000109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Georg Brandldffbf5f2008-05-20 07:49:57 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Georg Brandldffbf5f2008-05-20 07:49:57 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
Tim Peters731098b2003-02-04 20:56:09 +0000120static 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,
Neal Norwitzb183a252006-04-10 01:03:32 +0000126 *read_str, *readline_str, *__main___str,
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +0000127 *copyreg_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öwis68192102007-07-21 06:55:02 +0000154 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155 (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
Christian Heimese93237d2007-12-19 02:37:44 +0000159#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000160
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++) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +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;
Neal Norwitzb59d08c2006-07-22 16:20:49 +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;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +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) { \
Christian Heimese93237d2007-12-19 02:37:44 +0000319 if (Py_REFCNT(self->arg) > 1) { \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000320 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öwis18e16552006-02-15 17:27:45 +0000342 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000343 char *write_buf;
344 int buf_size;
345 PyObject *dispatch_table;
346 int fast_container; /* count nested container dumps */
347 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000348} Picklerobject;
349
Barry Warsaw52acb492001-12-21 20:04:22 +0000350#ifndef PY_CPICKLE_FAST_LIMIT
351#define PY_CPICKLE_FAST_LIMIT 50
352#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000353
Jeremy Hylton938ace62002-07-17 16:30:39 +0000354static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000355
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000356typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000357 PyObject_HEAD
358 FILE *fp;
359 PyObject *file;
360 PyObject *readline;
361 PyObject *read;
362 PyObject *memo;
363 PyObject *arg;
364 Pdata *stack;
365 PyObject *mark;
366 PyObject *pers_func;
367 PyObject *last_string;
368 int *marks;
369 int num_marks;
370 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000371 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
372 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000373 int buf_size;
374 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000375 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000376} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000377
Jeremy Hylton938ace62002-07-17 16:30:39 +0000378static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000379
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000380/* Forward decls that need the above structs */
381static int save(Picklerobject *, PyObject *, int);
382static int put2(Picklerobject *, PyObject *);
383
Guido van Rossumd385d591997-04-09 17:47:47 +0000384static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000385PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000386cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
387{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 va_list va;
389 PyObject *args=0, *retval=0;
390 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000392 if (format) args = Py_VaBuildValue(format, va);
393 va_end(va);
394 if (format && ! args) return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000395 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000396 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000398 if (retval) {
399 if (args) {
400 PyObject *v;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000401 v=PyString_Format(retval, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000402 Py_DECREF(retval);
403 Py_DECREF(args);
404 if (! v) return NULL;
405 retval=v;
406 }
407 }
408 else
409 if (args) retval=args;
410 else {
411 PyErr_SetObject(ErrType,Py_None);
412 return NULL;
413 }
414 PyErr_SetObject(ErrType,retval);
415 Py_DECREF(retval);
416 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000417}
418
Tim Peters84e87f32001-03-17 04:50:51 +0000419static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000420write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000421{
422 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000424 if (s == NULL) {
425 return 0;
426 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000427
Martin v. Löwis18e16552006-02-15 17:27:45 +0000428 if (n > INT_MAX) {
429 /* String too large */
430 return -1;
431 }
432
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000433 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000437 PyFile_DecUseCount((PyFileObject *)self->file);
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000438 if (nbyteswritten != (size_t)n) {
439 PyErr_SetFromErrno(PyExc_IOError);
440 return -1;
441 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000442
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000444}
445
Tim Peters84e87f32001-03-17 04:50:51 +0000446static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000447write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000448{
449 if (s == NULL) {
450 return 0;
451 }
Tim Peterscba30e22003-02-01 06:24:36 +0000452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000453 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
454 return -1;
455 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000456
Martin v. Löwis18e16552006-02-15 17:27:45 +0000457 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000458}
459
Tim Peters84e87f32001-03-17 04:50:51 +0000460static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000462{
463 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000464 if (n > INT_MAX) return -1;
465 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000466}
467
Tim Peters84e87f32001-03-17 04:50:51 +0000468static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000469write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470{
471 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000472 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000473
Martin v. Löwis18e16552006-02-15 17:27:45 +0000474 if (_n > INT_MAX)
475 return -1;
476 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000477 if (s == NULL) {
478 if (!( self->buf_size )) return 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000479 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000481 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000482 return -1;
483 }
484 else {
485 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
486 if (write_other(self, NULL, 0) < 0)
487 return -1;
488 }
Tim Peterscba30e22003-02-01 06:24:36 +0000489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000490 if (n > WRITE_BUF_SIZE) {
491 if (!( py_str =
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000492 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000493 return -1;
494 }
495 else {
496 memcpy(self->write_buf + self->buf_size, s, n);
497 self->buf_size += n;
498 return n;
499 }
500 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 if (self->write) {
503 /* object with write method */
504 ARG_TUP(self, py_str);
505 if (self->arg) {
506 junk = PyObject_Call(self->write, self->arg, NULL);
507 FREE_ARG_TUP(self);
508 }
509 if (junk) Py_DECREF(junk);
510 else return -1;
511 }
512 else
513 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 self->buf_size = 0;
516 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000517}
518
519
Martin v. Löwis18e16552006-02-15 17:27:45 +0000520static Py_ssize_t
521read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000522{
523 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 if (self->buf_size == 0) {
526 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000529 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530 PyErr_NoMemory();
531 return -1;
532 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000534 self->buf_size = size;
535 }
536 else if (n > self->buf_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000537 char *newbuf = (char *)realloc(self->buf, n);
538 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000539 PyErr_NoMemory();
540 return -1;
541 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000542 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000543 self->buf_size = n;
544 }
Tim Peters84e87f32001-03-17 04:50:51 +0000545
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000546 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 Py_BEGIN_ALLOW_THREADS
548 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
549 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000550 PyFile_DecUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 if (nbytesread != (size_t)n) {
552 if (feof(self->fp)) {
553 PyErr_SetNone(PyExc_EOFError);
554 return -1;
555 }
Tim Peterscba30e22003-02-01 06:24:36 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 PyErr_SetFromErrno(PyExc_IOError);
558 return -1;
559 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000563 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000564}
565
566
Martin v. Löwis18e16552006-02-15 17:27:45 +0000567static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000568readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569{
570 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000572 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000573 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 PyErr_NoMemory();
575 return -1;
576 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 self->buf_size = 40;
578 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 i = 0;
581 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000582 int bigger;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000583 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000584 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000585 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 (self->buf[i] = getc(self->fp)) == '\n') {
587 self->buf[i + 1] = '\0';
588 *s = self->buf;
589 return i + 1;
590 }
591 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000592 bigger = self->buf_size << 1;
593 if (bigger <= 0) { /* overflow */
594 PyErr_NoMemory();
595 return -1;
596 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000597 newbuf = (char *)realloc(self->buf, bigger);
598 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000599 PyErr_NoMemory();
600 return -1;
601 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000602 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000603 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604 }
Tim Peters84e87f32001-03-17 04:50:51 +0000605}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000606
607
Martin v. Löwis18e16552006-02-15 17:27:45 +0000608static Py_ssize_t
609read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610{
611 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
614 PyErr_SetNone(PyExc_EOFError);
615 return -1;
616 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621}
622
623
Martin v. Löwis18e16552006-02-15 17:27:45 +0000624static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000625readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000627 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
631 return -1;
632 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000637}
638
639
Martin v. Löwis18e16552006-02-15 17:27:45 +0000640static Py_ssize_t
641read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642{
643 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000644
Martin v. Löwis18e16552006-02-15 17:27:45 +0000645 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000647 ARG_TUP(self, bytes);
648 if (self->arg) {
649 str = PyObject_Call(self->read, self->arg, NULL);
650 FREE_ARG_TUP(self);
651 }
652 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 Py_XDECREF(self->last_string);
655 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000657 if (! (*s = PyString_AsString(str))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659}
660
661
Martin v. Löwis18e16552006-02-15 17:27:45 +0000662static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000663readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000664{
665 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000668 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
669 return -1;
670 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000672 if ((str_size = PyString_Size(str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000673 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 Py_XDECREF(self->last_string);
676 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000678 if (! (*s = PyString_AsString(str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000679 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682}
683
Tim Petersee1a53c2003-02-02 02:57:53 +0000684/* Copy the first n bytes from s into newly malloc'ed memory, plus a
685 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
686 * The caller is responsible for free()'ing the return value.
687 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000689pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690{
Tim Petersee1a53c2003-02-02 02:57:53 +0000691 char *r = (char *)malloc(n+1);
692 if (r == NULL)
693 return (char*)PyErr_NoMemory();
694 memcpy(r, s, n);
695 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000697}
698
699
700static int
Tim Peterscba30e22003-02-01 06:24:36 +0000701get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702{
703 PyObject *value, *mv;
704 long c_value;
705 char s[30];
706 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 if (!( mv = PyDict_GetItem(self->memo, id))) {
709 PyErr_SetObject(PyExc_KeyError, id);
710 return -1;
711 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000712
Tim Peterscba30e22003-02-01 06:24:36 +0000713 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000714 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!( PyInt_Check(value))) {
717 PyErr_SetString(PicklingError, "no int where int expected in memo");
718 return -1;
719 }
720 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 if (!self->bin) {
723 s[0] = GET;
724 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
725 len = strlen(s);
726 }
727 else if (Pdata_Check(self->file)) {
728 if (write_other(self, NULL, 0) < 0) return -1;
729 PDATA_APPEND(self->file, mv, -1);
730 return 0;
731 }
732 else {
733 if (c_value < 256) {
734 s[0] = BINGET;
735 s[1] = (int)(c_value & 0xff);
736 len = 2;
737 }
738 else {
739 s[0] = LONG_BINGET;
740 s[1] = (int)(c_value & 0xff);
741 s[2] = (int)((c_value >> 8) & 0xff);
742 s[3] = (int)((c_value >> 16) & 0xff);
743 s[4] = (int)((c_value >> 24) & 0xff);
744 len = 5;
745 }
746 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000747
Tim Peters0bc93f52003-02-02 18:29:33 +0000748 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000750
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000751 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000752}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000753
Guido van Rossum60456fd1997-04-09 17:36:32 +0000754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755static int
Tim Peterscba30e22003-02-01 06:24:36 +0000756put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757{
Christian Heimese93237d2007-12-19 02:37:44 +0000758 if (Py_REFCNT(ob) < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761 return put2(self, ob);
762}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000763
Guido van Rossum053b8df1998-11-25 16:18:00 +0000764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765static int
Tim Peterscba30e22003-02-01 06:24:36 +0000766put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767{
768 char c_str[30];
769 int p;
770 size_t len;
771 int res = -1;
772 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 if (self->fast)
775 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 if ((p = PyDict_Size(self->memo)) < 0)
778 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000780 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000781 /* XXX Why?
782 * XXX And does "positive" really mean non-negative?
783 * XXX pickle.py starts with PUT index 0, not 1. This makes for
784 * XXX gratuitous differences between the pickling modules.
785 */
Tim Peterscba30e22003-02-01 06:24:36 +0000786 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000787
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000790
Tim Peterscba30e22003-02-01 06:24:36 +0000791 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000793
Tim Peterscba30e22003-02-01 06:24:36 +0000794 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 PyTuple_SET_ITEM(t, 0, memo_len);
798 Py_INCREF(memo_len);
799 PyTuple_SET_ITEM(t, 1, ob);
800 Py_INCREF(ob);
801
802 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
803 goto finally;
804
805 if (!self->bin) {
806 c_str[0] = PUT;
807 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
808 len = strlen(c_str);
809 }
810 else if (Pdata_Check(self->file)) {
811 if (write_other(self, NULL, 0) < 0) return -1;
812 PDATA_APPEND(self->file, memo_len, -1);
813 res=0; /* Job well done ;) */
814 goto finally;
815 }
816 else {
817 if (p >= 256) {
818 c_str[0] = LONG_BINPUT;
819 c_str[1] = (int)(p & 0xff);
820 c_str[2] = (int)((p >> 8) & 0xff);
821 c_str[3] = (int)((p >> 16) & 0xff);
822 c_str[4] = (int)((p >> 24) & 0xff);
823 len = 5;
824 }
825 else {
826 c_str[0] = BINPUT;
827 c_str[1] = p;
828 len = 2;
829 }
830 }
831
Tim Peters0bc93f52003-02-02 18:29:33 +0000832 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 goto finally;
834
835 res = 0;
836
837 finally:
838 Py_XDECREF(py_ob_id);
839 Py_XDECREF(memo_len);
840 Py_XDECREF(t);
841
842 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000843}
844
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000845static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000846whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000848 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 PyObject *module = 0, *modules_dict = 0,
850 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000853 if (module)
854 return module;
855 if (PyErr_ExceptionMatches(PyExc_AttributeError))
856 PyErr_Clear();
857 else
858 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000859
Tim Peterscba30e22003-02-01 06:24:36 +0000860 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 i = 0;
864 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 global_name_attr = PyObject_GetAttr(module, global_name);
869 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000870 if (PyErr_ExceptionMatches(PyExc_AttributeError))
871 PyErr_Clear();
872 else
873 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 continue;
875 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 if (global_name_attr != global) {
878 Py_DECREF(global_name_attr);
879 continue;
880 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 break;
885 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000887 /* The following implements the rule in pickle.py added in 1.5
888 that used __main__ if no module is found. I don't actually
889 like this rule. jlf
890 */
891 if (!j) {
892 j=1;
893 name=__main___str;
894 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 Py_INCREF(name);
897 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000898}
899
900
Guido van Rossum60456fd1997-04-09 17:36:32 +0000901static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000902fast_save_enter(Picklerobject *self, PyObject *obj)
903{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000904 /* if fast_container < 0, we're doing an error exit. */
905 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
906 PyObject *key = NULL;
907 if (self->fast_memo == NULL) {
908 self->fast_memo = PyDict_New();
909 if (self->fast_memo == NULL) {
910 self->fast_container = -1;
911 return 0;
912 }
913 }
914 key = PyLong_FromVoidPtr(obj);
915 if (key == NULL)
916 return 0;
917 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000918 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000920 "fast mode: can't pickle cyclic objects "
921 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000922 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000923 self->fast_container = -1;
924 return 0;
925 }
926 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000927 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000928 self->fast_container = -1;
929 return 0;
930 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000931 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000932 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934}
935
Tim Peterscba30e22003-02-01 06:24:36 +0000936int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000937fast_save_leave(Picklerobject *self, PyObject *obj)
938{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000939 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
940 PyObject *key = PyLong_FromVoidPtr(obj);
941 if (key == NULL)
942 return 0;
943 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000945 return 0;
946 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000947 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000948 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000949 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000950}
951
952static int
Tim Peterscba30e22003-02-01 06:24:36 +0000953save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000954{
955 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000956 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000960}
961
Guido van Rossum77f6a652002-04-03 22:41:51 +0000962static int
Tim Peterscba30e22003-02-01 06:24:36 +0000963save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000965 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000966 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967 long l = PyInt_AS_LONG((PyIntObject *)args);
968
Tim Peters3c67d792003-02-02 17:59:11 +0000969 if (self->proto >= 2) {
970 char opcode = l ? NEWTRUE : NEWFALSE;
971 if (self->write_func(self, &opcode, 1) < 0)
972 return -1;
973 }
974 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000976 return 0;
977}
Tim Peters84e87f32001-03-17 04:50:51 +0000978
Guido van Rossum60456fd1997-04-09 17:36:32 +0000979static int
Tim Peterscba30e22003-02-01 06:24:36 +0000980save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981{
982 char c_str[32];
983 long l = PyInt_AS_LONG((PyIntObject *)args);
984 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000987#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 || l > 0x7fffffffL
989 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000990#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000991 ) {
992 /* Text-mode pickle, or long too big to fit in the 4-byte
993 * signed BININT format: store as a string.
994 */
995 c_str[0] = INT;
996 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000997 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000998 return -1;
999 }
1000 else {
1001 /* Binary pickle and l fits in a signed 4-byte int. */
1002 c_str[1] = (int)( l & 0xff);
1003 c_str[2] = (int)((l >> 8) & 0xff);
1004 c_str[3] = (int)((l >> 16) & 0xff);
1005 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1008 if (c_str[2] == 0) {
1009 c_str[0] = BININT1;
1010 len = 2;
1011 }
1012 else {
1013 c_str[0] = BININT2;
1014 len = 3;
1015 }
1016 }
1017 else {
1018 c_str[0] = BININT;
1019 len = 5;
1020 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021
Tim Peters0bc93f52003-02-02 18:29:33 +00001022 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 return -1;
1024 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001027}
1028
1029
1030static int
Tim Peterscba30e22003-02-01 06:24:36 +00001031save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001033 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001034 int res = -1;
1035 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Tim Petersee1a53c2003-02-02 02:57:53 +00001039 if (self->proto >= 2) {
1040 /* Linear-time pickling. */
1041 size_t nbits;
1042 size_t nbytes;
1043 unsigned char *pdata;
1044 char c_str[5];
1045 int i;
1046 int sign = _PyLong_Sign(args);
1047
1048 if (sign == 0) {
1049 /* It's 0 -- an empty bytestring. */
1050 c_str[0] = LONG1;
1051 c_str[1] = 0;
1052 i = self->write_func(self, c_str, 2);
1053 if (i < 0) goto finally;
1054 res = 0;
1055 goto finally;
1056 }
1057 nbits = _PyLong_NumBits(args);
1058 if (nbits == (size_t)-1 && PyErr_Occurred())
1059 goto finally;
1060 /* How many bytes do we need? There are nbits >> 3 full
1061 * bytes of data, and nbits & 7 leftover bits. If there
1062 * are any leftover bits, then we clearly need another
1063 * byte. Wnat's not so obvious is that we *probably*
1064 * need another byte even if there aren't any leftovers:
1065 * the most-significant bit of the most-significant byte
1066 * acts like a sign bit, and it's usually got a sense
1067 * opposite of the one we need. The exception is longs
1068 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1069 * its own 256's-complement, so has the right sign bit
1070 * even without the extra byte. That's a pain to check
1071 * for in advance, though, so we always grab an extra
1072 * byte at the start, and cut it back later if possible.
1073 */
1074 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001075 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001076 PyErr_SetString(PyExc_OverflowError, "long too large "
1077 "to pickle");
1078 goto finally;
1079 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001080 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001081 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001082 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001083 i = _PyLong_AsByteArray((PyLongObject *)args,
1084 pdata, nbytes,
1085 1 /* little endian */, 1 /* signed */);
1086 if (i < 0) goto finally;
1087 /* If the long is negative, this may be a byte more than
1088 * needed. This is so iff the MSB is all redundant sign
1089 * bits.
1090 */
1091 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1092 (pdata[nbytes - 2] & 0x80) != 0)
1093 --nbytes;
1094
1095 if (nbytes < 256) {
1096 c_str[0] = LONG1;
1097 c_str[1] = (char)nbytes;
1098 size = 2;
1099 }
1100 else {
1101 c_str[0] = LONG4;
1102 size = (int)nbytes;
1103 for (i = 1; i < 5; i++) {
1104 c_str[i] = (char)(size & 0xff);
1105 size >>= 8;
1106 }
1107 size = 5;
1108 }
1109 i = self->write_func(self, c_str, size);
1110 if (i < 0) goto finally;
1111 i = self->write_func(self, (char *)pdata, (int)nbytes);
1112 if (i < 0) goto finally;
1113 res = 0;
1114 goto finally;
1115 }
1116
1117 /* proto < 2: write the repr and newline. This is quadratic-time
1118 * (in the number of digits), in both directions.
1119 */
Tim Peterscba30e22003-02-01 06:24:36 +00001120 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001123 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001128
Tim Peters0bc93f52003-02-02 18:29:33 +00001129 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001130 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 finally:
1140 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142}
1143
1144
1145static int
Tim Peterscba30e22003-02-01 06:24:36 +00001146save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147{
1148 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001152 str[0] = BINFLOAT;
1153 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001155 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 return -1;
1157 }
1158 else {
1159 char c_str[250];
1160 c_str[0] = FLOAT;
Georg Brandlde9b6242006-04-30 11:13:56 +00001161 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1162 /* Extend the formatted string with a newline character */
1163 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164
Tim Peters0bc93f52003-02-02 18:29:33 +00001165 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 return -1;
1167 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170}
1171
1172
1173static int
Tim Peterscba30e22003-02-01 06:24:36 +00001174save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175{
1176 int size, len;
1177 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001179 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 if (!self->bin) {
1183 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Tim Peterscba30e22003-02-01 06:24:36 +00001187 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001190 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001192 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Tim Peters0bc93f52003-02-02 18:29:33 +00001194 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Tim Peters0bc93f52003-02-02 18:29:33 +00001197 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Tim Peters0bc93f52003-02-02 18:29:33 +00001200 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001201 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 Py_XDECREF(repr);
1204 }
1205 else {
1206 int i;
1207 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001209 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 if (size < 256) {
1213 c_str[0] = SHORT_BINSTRING;
1214 c_str[1] = size;
1215 len = 2;
1216 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001217 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001218 c_str[0] = BINSTRING;
1219 for (i = 1; i < 5; i++)
1220 c_str[i] = (int)(size >> ((i - 1) * 8));
1221 len = 5;
1222 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001223 else
1224 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Tim Peters0bc93f52003-02-02 18:29:33 +00001226 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 if (size > 128 && Pdata_Check(self->file)) {
1230 if (write_other(self, NULL, 0) < 0) return -1;
1231 PDATA_APPEND(self->file, args, -1);
1232 }
1233 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001234 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001235 PyString_AS_STRING(
1236 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001237 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 return -1;
1239 }
1240 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 if (doput)
1243 if (put(self, args) < 0)
1244 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001246 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001248 err:
1249 Py_XDECREF(repr);
1250 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001251}
1252
1253
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001254#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001255/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1256 backslash and newline characters to \uXXXX escapes. */
1257static PyObject *
1258modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1259{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 PyObject *repr;
1261 char *p;
1262 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001265
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001266 repr = PyString_FromStringAndSize(NULL, 6 * size);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 if (repr == NULL)
1268 return NULL;
1269 if (size == 0)
1270 return repr;
1271
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001272 p = q = PyString_AS_STRING(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 while (size-- > 0) {
1274 Py_UNICODE ch = *s++;
1275 /* Map 16-bit characters to '\uxxxx' */
1276 if (ch >= 256 || ch == '\\' || ch == '\n') {
1277 *p++ = '\\';
1278 *p++ = 'u';
1279 *p++ = hexdigit[(ch >> 12) & 0xf];
1280 *p++ = hexdigit[(ch >> 8) & 0xf];
1281 *p++ = hexdigit[(ch >> 4) & 0xf];
1282 *p++ = hexdigit[ch & 15];
1283 }
1284 /* Copy everything else as-is */
1285 else
1286 *p++ = (char) ch;
1287 }
1288 *p = '\0';
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001289 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001290 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001291}
1292
1293
Guido van Rossum60456fd1997-04-09 17:36:32 +00001294static int
Tim Peterscba30e22003-02-01 06:24:36 +00001295save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001296{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001297 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if (!PyUnicode_Check(args))
1301 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 if (!self->bin) {
1304 char *repr_str;
1305 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 repr = modified_EncodeRawUnicodeEscape(
1308 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001309 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001310 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001312 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001314 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Tim Peters0bc93f52003-02-02 18:29:33 +00001316 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Tim Peters0bc93f52003-02-02 18:29:33 +00001319 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001321
Tim Peters0bc93f52003-02-02 18:29:33 +00001322 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001323 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 Py_XDECREF(repr);
1326 }
1327 else {
1328 int i;
1329 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Tim Peterscba30e22003-02-01 06:24:36 +00001331 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001332 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001333
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001334 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001335 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001336 if (size > INT_MAX)
1337 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 c_str[0] = BINUNICODE;
1340 for (i = 1; i < 5; i++)
1341 c_str[i] = (int)(size >> ((i - 1) * 8));
1342 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Tim Peters0bc93f52003-02-02 18:29:33 +00001344 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001345 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 if (size > 128 && Pdata_Check(self->file)) {
1348 if (write_other(self, NULL, 0) < 0)
1349 goto err;
1350 PDATA_APPEND(self->file, repr, -1);
1351 }
1352 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001353 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001354 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 goto err;
1356 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 Py_DECREF(repr);
1359 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if (doput)
1362 if (put(self, args) < 0)
1363 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 err:
1368 Py_XDECREF(repr);
1369 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001370}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001371#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372
Tim Peters1d63c9f2003-02-02 20:29:39 +00001373/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1374static int
Tim Peters67920142003-02-05 03:46:17 +00001375store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001376{
1377 int i;
1378 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001379
Tim Peters1d63c9f2003-02-02 20:29:39 +00001380 assert(PyTuple_Size(t) == len);
1381
1382 for (i = 0; i < len; i++) {
1383 PyObject *element = PyTuple_GET_ITEM(t, i);
1384
1385 if (element == NULL)
1386 goto finally;
1387 if (save(self, element, 0) < 0)
1388 goto finally;
1389 }
1390 res = 0;
1391
1392 finally:
1393 return res;
1394}
1395
1396/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1397 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001398 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001399 * (a tuple can be reached from itself), and that requires some subtle
1400 * magic so that it works in all cases. IOW, this is a long routine.
1401 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001402static int
Tim Peterscba30e22003-02-01 06:24:36 +00001403save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001405 PyObject *py_tuple_id = NULL;
1406 int len, i;
1407 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001410 static char pop = POP;
1411 static char pop_mark = POP_MARK;
1412 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 if ((len = PyTuple_Size(args)) < 0)
1415 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001416
Tim Peters1d63c9f2003-02-02 20:29:39 +00001417 if (len == 0) {
1418 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001419
Tim Peters1d63c9f2003-02-02 20:29:39 +00001420 if (self->proto) {
1421 c_str[0] = EMPTY_TUPLE;
1422 len = 1;
1423 }
1424 else {
1425 c_str[0] = MARK;
1426 c_str[1] = TUPLE;
1427 len = 2;
1428 }
1429 if (self->write_func(self, c_str, len) >= 0)
1430 res = 0;
1431 /* Don't memoize an empty tuple. */
1432 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001434
Tim Peters1d63c9f2003-02-02 20:29:39 +00001435 /* A non-empty tuple. */
1436
1437 /* id(tuple) isn't in the memo now. If it shows up there after
1438 * saving the tuple elements, the tuple must be recursive, in
1439 * which case we'll pop everything we put on the stack, and fetch
1440 * its value from the memo.
1441 */
1442 py_tuple_id = PyLong_FromVoidPtr(args);
1443 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001445
Tim Peters1d63c9f2003-02-02 20:29:39 +00001446 if (len <= 3 && self->proto >= 2) {
1447 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001448 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001449 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 /* pop the len elements */
1452 for (i = 0; i < len; ++i)
1453 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001455 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 if (get(self, py_tuple_id) < 0)
1457 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 res = 0;
1459 goto finally;
1460 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001461 /* Not recursive. */
1462 if (self->write_func(self, len2opcode + len, 1) < 0)
1463 goto finally;
1464 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001465 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Tim Peters1d63c9f2003-02-02 20:29:39 +00001467 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1468 * Generate MARK elt1 elt2 ... TUPLE
1469 */
1470 if (self->write_func(self, &MARKv, 1) < 0)
1471 goto finally;
1472
Tim Peters67920142003-02-05 03:46:17 +00001473 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001474 goto finally;
1475
1476 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1477 /* pop the stack stuff we pushed */
1478 if (self->bin) {
1479 if (self->write_func(self, &pop_mark, 1) < 0)
1480 goto finally;
1481 }
1482 else {
1483 /* Note that we pop one more than len, to remove
1484 * the MARK too.
1485 */
1486 for (i = 0; i <= len; i++)
1487 if (self->write_func(self, &pop, 1) < 0)
1488 goto finally;
1489 }
1490 /* fetch from memo */
1491 if (get(self, py_tuple_id) >= 0)
1492 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001493 goto finally;
1494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Tim Peters1d63c9f2003-02-02 20:29:39 +00001496 /* Not recursive. */
1497 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001498 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001499
Tim Peters1d63c9f2003-02-02 20:29:39 +00001500 memoize:
1501 if (put(self, args) >= 0)
1502 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 finally:
1505 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507}
1508
Tim Peters1092d642003-02-11 21:06:20 +00001509/* iter is an iterator giving items, and we batch up chunks of
1510 * MARK item item ... item APPENDS
1511 * opcode sequences. Calling code should have arranged to first create an
1512 * empty list, or list-like object, for the APPENDS to operate on.
1513 * Returns 0 on success, <0 on error.
1514 */
1515static int
1516batch_list(Picklerobject *self, PyObject *iter)
1517{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001518 PyObject *obj = NULL;
1519 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001520 int i, n;
1521
1522 static char append = APPEND;
1523 static char appends = APPENDS;
1524
1525 assert(iter != NULL);
1526
1527 if (self->proto == 0) {
1528 /* APPENDS isn't available; do one at a time. */
1529 for (;;) {
1530 obj = PyIter_Next(iter);
1531 if (obj == NULL) {
1532 if (PyErr_Occurred())
1533 return -1;
1534 break;
1535 }
1536 i = save(self, obj, 0);
1537 Py_DECREF(obj);
1538 if (i < 0)
1539 return -1;
1540 if (self->write_func(self, &append, 1) < 0)
1541 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001542 }
1543 return 0;
1544 }
1545
1546 /* proto > 0: write in batches of BATCHSIZE. */
1547 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001548 /* Get first item */
1549 firstitem = PyIter_Next(iter);
1550 if (firstitem == NULL) {
1551 if (PyErr_Occurred())
1552 goto BatchFailed;
1553
1554 /* nothing more to add */
1555 break;
1556 }
1557
1558 /* Try to get a second item */
1559 obj = PyIter_Next(iter);
1560 if (obj == NULL) {
1561 if (PyErr_Occurred())
1562 goto BatchFailed;
1563
1564 /* Only one item to write */
1565 if (save(self, firstitem, 0) < 0)
1566 goto BatchFailed;
1567 if (self->write_func(self, &append, 1) < 0)
1568 goto BatchFailed;
1569 Py_CLEAR(firstitem);
1570 break;
1571 }
1572
1573 /* More than one item to write */
1574
1575 /* Pump out MARK, items, APPENDS. */
1576 if (self->write_func(self, &MARKv, 1) < 0)
1577 goto BatchFailed;
1578
1579 if (save(self, firstitem, 0) < 0)
1580 goto BatchFailed;
1581 Py_CLEAR(firstitem);
1582 n = 1;
1583
1584 /* Fetch and save up to BATCHSIZE items */
1585 while (obj) {
1586 if (save(self, obj, 0) < 0)
1587 goto BatchFailed;
1588 Py_CLEAR(obj);
1589 n += 1;
1590
1591 if (n == BATCHSIZE)
1592 break;
1593
Tim Peters1092d642003-02-11 21:06:20 +00001594 obj = PyIter_Next(iter);
1595 if (obj == NULL) {
1596 if (PyErr_Occurred())
1597 goto BatchFailed;
1598 break;
1599 }
Tim Peters1092d642003-02-11 21:06:20 +00001600 }
1601
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001602 if (self->write_func(self, &appends, 1) < 0)
1603 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001604
Tim Peters90975f12003-02-12 05:28:58 +00001605 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001606 return 0;
1607
1608BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001609 Py_XDECREF(firstitem);
1610 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001611 return -1;
1612}
1613
Guido van Rossum60456fd1997-04-09 17:36:32 +00001614static int
Tim Peterscba30e22003-02-01 06:24:36 +00001615save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001616{
Tim Peters1092d642003-02-11 21:06:20 +00001617 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001619 int len;
1620 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if (self->fast && !fast_save_enter(self, args))
1623 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001624
Tim Peters1092d642003-02-11 21:06:20 +00001625 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if (self->bin) {
1627 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001628 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 }
1630 else {
1631 s[0] = MARK;
1632 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001633 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001635
Tim Peters1092d642003-02-11 21:06:20 +00001636 if (self->write_func(self, s, len) < 0)
1637 goto finally;
1638
1639 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if ((len = PyList_Size(args)) < 0)
1641 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Tim Peters1092d642003-02-11 21:06:20 +00001643 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001645 if (put(self, args) >= 0)
1646 res = 0;
1647 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001648 }
Tim Peters90975f12003-02-12 05:28:58 +00001649 if (put2(self, args) < 0)
1650 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001651
Tim Peters1092d642003-02-11 21:06:20 +00001652 /* Materialize the list elements. */
1653 iter = PyObject_GetIter(args);
1654 if (iter == NULL)
1655 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001656
1657 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1658 {
1659 res = batch_list(self, iter);
1660 Py_LeaveRecursiveCall();
1661 }
Tim Peters1092d642003-02-11 21:06:20 +00001662 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001664 finally:
1665 if (self->fast && !fast_save_leave(self, args))
1666 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001669}
1670
1671
Tim Peters42f08ac2003-02-11 22:43:24 +00001672/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1673 * MARK key value ... key value SETITEMS
1674 * opcode sequences. Calling code should have arranged to first create an
1675 * empty dict, or dict-like object, for the SETITEMS to operate on.
1676 * Returns 0 on success, <0 on error.
1677 *
1678 * This is very much like batch_list(). The difference between saving
1679 * elements directly, and picking apart two-tuples, is so long-winded at
1680 * the C level, though, that attempts to combine these routines were too
1681 * ugly to bear.
1682 */
1683static int
1684batch_dict(Picklerobject *self, PyObject *iter)
1685{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001686 PyObject *p = NULL;
1687 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001688 int i, n;
1689
1690 static char setitem = SETITEM;
1691 static char setitems = SETITEMS;
1692
1693 assert(iter != NULL);
1694
1695 if (self->proto == 0) {
1696 /* SETITEMS isn't available; do one at a time. */
1697 for (;;) {
1698 p = PyIter_Next(iter);
1699 if (p == NULL) {
1700 if (PyErr_Occurred())
1701 return -1;
1702 break;
1703 }
1704 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1705 PyErr_SetString(PyExc_TypeError, "dict items "
1706 "iterator must return 2-tuples");
1707 return -1;
1708 }
1709 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1710 if (i >= 0)
1711 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1712 Py_DECREF(p);
1713 if (i < 0)
1714 return -1;
1715 if (self->write_func(self, &setitem, 1) < 0)
1716 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001717 }
1718 return 0;
1719 }
1720
1721 /* proto > 0: write in batches of BATCHSIZE. */
1722 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001723 /* Get first item */
1724 firstitem = PyIter_Next(iter);
1725 if (firstitem == NULL) {
1726 if (PyErr_Occurred())
1727 goto BatchFailed;
1728
1729 /* nothing more to add */
1730 break;
1731 }
1732 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1733 PyErr_SetString(PyExc_TypeError, "dict items "
1734 "iterator must return 2-tuples");
1735 goto BatchFailed;
1736 }
1737
1738 /* Try to get a second item */
1739 p = PyIter_Next(iter);
1740 if (p == NULL) {
1741 if (PyErr_Occurred())
1742 goto BatchFailed;
1743
1744 /* Only one item to write */
1745 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1746 goto BatchFailed;
1747 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1748 goto BatchFailed;
1749 if (self->write_func(self, &setitem, 1) < 0)
1750 goto BatchFailed;
1751 Py_CLEAR(firstitem);
1752 break;
1753 }
1754
1755 /* More than one item to write */
1756
1757 /* Pump out MARK, items, SETITEMS. */
1758 if (self->write_func(self, &MARKv, 1) < 0)
1759 goto BatchFailed;
1760
1761 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1762 goto BatchFailed;
1763 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1764 goto BatchFailed;
1765 Py_CLEAR(firstitem);
1766 n = 1;
1767
1768 /* Fetch and save up to BATCHSIZE items */
1769 while (p) {
1770 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1771 PyErr_SetString(PyExc_TypeError, "dict items "
1772 "iterator must return 2-tuples");
1773 goto BatchFailed;
1774 }
1775 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1776 goto BatchFailed;
1777 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1778 goto BatchFailed;
1779 Py_CLEAR(p);
1780 n += 1;
1781
1782 if (n == BATCHSIZE)
1783 break;
1784
Tim Peters42f08ac2003-02-11 22:43:24 +00001785 p = PyIter_Next(iter);
1786 if (p == NULL) {
1787 if (PyErr_Occurred())
1788 goto BatchFailed;
1789 break;
1790 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001791 }
1792
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001793 if (self->write_func(self, &setitems, 1) < 0)
1794 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001795
Tim Peters90975f12003-02-12 05:28:58 +00001796 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001797 return 0;
1798
1799BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001800 Py_XDECREF(firstitem);
1801 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001802 return -1;
1803}
1804
Guido van Rossum60456fd1997-04-09 17:36:32 +00001805static int
Tim Peterscba30e22003-02-01 06:24:36 +00001806save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807{
Tim Peters42f08ac2003-02-11 22:43:24 +00001808 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001810 int len;
1811 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 if (self->fast && !fast_save_enter(self, args))
1814 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001815
Tim Peters42f08ac2003-02-11 22:43:24 +00001816 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 if (self->bin) {
1818 s[0] = EMPTY_DICT;
1819 len = 1;
1820 }
1821 else {
1822 s[0] = MARK;
1823 s[1] = DICT;
1824 len = 2;
1825 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Tim Peters0bc93f52003-02-02 18:29:33 +00001827 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001829
Tim Peters42f08ac2003-02-11 22:43:24 +00001830 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 if ((len = PyDict_Size(args)) < 0)
1832 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001834 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001835 if (put(self, args) >= 0)
1836 res = 0;
1837 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 }
Tim Peters90975f12003-02-12 05:28:58 +00001839 if (put2(self, args) < 0)
1840 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001841
Tim Peters42f08ac2003-02-11 22:43:24 +00001842 /* Materialize the dict items. */
1843 iter = PyObject_CallMethod(args, "iteritems", "()");
1844 if (iter == NULL)
1845 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001846 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1847 {
1848 res = batch_dict(self, iter);
1849 Py_LeaveRecursiveCall();
1850 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001851 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 finally:
1854 if (self->fast && !fast_save_leave(self, args))
1855 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858}
1859
1860
Tim Peters84e87f32001-03-17 04:50:51 +00001861static int
Tim Peterscba30e22003-02-01 06:24:36 +00001862save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001863{
1864 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1865 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1866 char *module_str, *name_str;
1867 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001869 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 if (self->fast && !fast_save_enter(self, args))
1872 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001873
Tim Peters0bc93f52003-02-02 18:29:33 +00001874 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001875 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001876
Tim Peterscba30e22003-02-01 06:24:36 +00001877 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 if (self->bin) {
1881 if (save(self, class, 0) < 0)
1882 goto finally;
1883 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1886 PyObject *element = 0;
1887 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001890 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001893 if ((len = PyObject_Size(class_args)) < 0)
1894 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001896 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001897 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 if (save(self, element, 0) < 0) {
1901 Py_DECREF(element);
1902 goto finally;
1903 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001905 Py_DECREF(element);
1906 }
1907 }
1908 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001909 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1910 PyErr_Clear();
1911 else
1912 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 if (!self->bin) {
1916 if (!( name = ((PyClassObject *)class)->cl_name )) {
1917 PyErr_SetString(PicklingError, "class has no name");
1918 goto finally;
1919 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Tim Peterscba30e22003-02-01 06:24:36 +00001921 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001923
Tim Peters84e87f32001-03-17 04:50:51 +00001924
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001925 if ((module_size = PyString_Size(module)) < 0 ||
1926 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001928
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001929 module_str = PyString_AS_STRING((PyStringObject *)module);
1930 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Tim Peters0bc93f52003-02-02 18:29:33 +00001932 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Tim Peters0bc93f52003-02-02 18:29:33 +00001935 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Tim Peters0bc93f52003-02-02 18:29:33 +00001938 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001940
Tim Peters0bc93f52003-02-02 18:29:33 +00001941 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001943
Tim Peters0bc93f52003-02-02 18:29:33 +00001944 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 goto finally;
1946 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001947 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 goto finally;
1949 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1952 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001953 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 goto finally;
1955 }
1956 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001957 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1958 PyErr_Clear();
1959 else
1960 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001963 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1964 PyErr_Clear();
1965 else
1966 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 res = 0;
1968 goto finally;
1969 }
1970 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 if (!PyDict_Check(state)) {
1973 if (put2(self, args) < 0)
1974 goto finally;
1975 }
1976 else {
1977 if (put(self, args) < 0)
1978 goto finally;
1979 }
Tim Peters84e87f32001-03-17 04:50:51 +00001980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 if (save(self, state, 0) < 0)
1982 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983
Tim Peters0bc93f52003-02-02 18:29:33 +00001984 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001989 finally:
1990 if (self->fast && !fast_save_leave(self, args))
1991 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 Py_XDECREF(module);
1994 Py_XDECREF(class);
1995 Py_XDECREF(state);
1996 Py_XDECREF(getinitargs_func);
1997 Py_XDECREF(getstate_func);
1998 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001}
2002
2003
Guido van Rossum60456fd1997-04-09 17:36:32 +00002004static int
Tim Peterscba30e22003-02-01 06:24:36 +00002005save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002007 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002008 char *name_str, *module_str;
2009 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (name) {
2014 global_name = name;
2015 Py_INCREF(global_name);
2016 }
2017 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002018 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 goto finally;
2020 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002021
Tim Peterscba30e22003-02-01 06:24:36 +00002022 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002024
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002025 if ((module_size = PyString_Size(module)) < 0 ||
2026 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002028
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002029 module_str = PyString_AS_STRING((PyStringObject *)module);
2030 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002031
Guido van Rossum75bfd052002-12-24 18:10:07 +00002032 /* XXX This can be doing a relative import. Clearly it shouldn't,
2033 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 mod = PyImport_ImportModule(module_str);
2035 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002037 "Can't pickle %s: import of module %s "
2038 "failed",
2039 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 goto finally;
2041 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002042 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002043 if (klass == NULL) {
2044 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002045 "Can't pickle %s: attribute lookup %s.%s "
2046 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 "OSS", args, module, global_name);
2048 goto finally;
2049 }
2050 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002051 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002053 "Can't pickle %s: it's not the same object "
2054 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 "OSS", args, module, global_name);
2056 goto finally;
2057 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002058 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002059
Tim Peters731098b2003-02-04 20:56:09 +00002060 if (self->proto >= 2) {
2061 /* See whether this is in the extension registry, and if
2062 * so generate an EXT opcode.
2063 */
2064 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002065 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002066 char c_str[5];
2067 int n;
2068
2069 PyTuple_SET_ITEM(two_tuple, 0, module);
2070 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2071 py_code = PyDict_GetItem(extension_registry, two_tuple);
2072 if (py_code == NULL)
2073 goto gen_global; /* not registered */
2074
2075 /* Verify py_code has the right type and value. */
2076 if (!PyInt_Check(py_code)) {
2077 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002078 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002079 "OO", args, py_code);
2080 goto finally;
2081 }
2082 code = PyInt_AS_LONG(py_code);
2083 if (code <= 0 || code > 0x7fffffffL) {
2084 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2085 "extension code %ld is out of range",
2086 "Ol", args, code);
2087 goto finally;
2088 }
2089
2090 /* Generate an EXT opcode. */
2091 if (code <= 0xff) {
2092 c_str[0] = EXT1;
2093 c_str[1] = (char)code;
2094 n = 2;
2095 }
2096 else if (code <= 0xffff) {
2097 c_str[0] = EXT2;
2098 c_str[1] = (char)(code & 0xff);
2099 c_str[2] = (char)((code >> 8) & 0xff);
2100 n = 3;
2101 }
2102 else {
2103 c_str[0] = EXT4;
2104 c_str[1] = (char)(code & 0xff);
2105 c_str[2] = (char)((code >> 8) & 0xff);
2106 c_str[3] = (char)((code >> 16) & 0xff);
2107 c_str[4] = (char)((code >> 24) & 0xff);
2108 n = 5;
2109 }
2110
2111 if (self->write_func(self, c_str, n) >= 0)
2112 res = 0;
2113 goto finally; /* and don't memoize */
2114 }
2115
2116 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002117 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002118 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002119
Tim Peters0bc93f52003-02-02 18:29:33 +00002120 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002122
Tim Peters0bc93f52003-02-02 18:29:33 +00002123 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002125
Tim Peters0bc93f52003-02-02 18:29:33 +00002126 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Tim Peters0bc93f52003-02-02 18:29:33 +00002129 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if (put(self, args) < 0)
2133 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 finally:
2138 Py_XDECREF(module);
2139 Py_XDECREF(global_name);
2140 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002143}
2144
Guido van Rossum60456fd1997-04-09 17:36:32 +00002145static int
Tim Peterscba30e22003-02-01 06:24:36 +00002146save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147{
2148 PyObject *pid = 0;
2149 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002151 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002153 Py_INCREF(args);
2154 ARG_TUP(self, args);
2155 if (self->arg) {
2156 pid = PyObject_Call(f, self->arg, NULL);
2157 FREE_ARG_TUP(self);
2158 }
2159 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 if (pid != Py_None) {
2162 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002163 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 PyErr_SetString(PicklingError,
2165 "persistent id must be string");
2166 goto finally;
2167 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002168
Tim Peters0bc93f52003-02-02 18:29:33 +00002169 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002171
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002172 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002174
Tim Peters0bc93f52003-02-02 18:29:33 +00002175 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002176 PyString_AS_STRING(
2177 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002178 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002180
Tim Peters0bc93f52003-02-02 18:29:33 +00002181 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 res = 1;
2185 goto finally;
2186 }
2187 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002188 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 res = -1;
2190 else
2191 res = 1;
2192 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 goto finally;
2195 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002197 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002199 finally:
2200 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002203}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002204
Tim Peters71fcda52003-02-14 23:05:28 +00002205/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2206 * appropriate __reduce__ method for ob.
2207 */
Tim Peters84e87f32001-03-17 04:50:51 +00002208static int
Tim Peters71fcda52003-02-14 23:05:28 +00002209save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002210{
Tim Peters71fcda52003-02-14 23:05:28 +00002211 PyObject *callable;
2212 PyObject *argtup;
2213 PyObject *state = NULL;
2214 PyObject *listitems = NULL;
2215 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002216
Tim Peters71fcda52003-02-14 23:05:28 +00002217 int use_newobj = self->proto >= 2;
2218
2219 static char reduce = REDUCE;
2220 static char build = BUILD;
2221 static char newobj = NEWOBJ;
2222
2223 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2224 &callable,
2225 &argtup,
2226 &state,
2227 &listitems,
2228 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002229 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002230
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002231 if (!PyTuple_Check(argtup)) {
2232 PyErr_SetString(PicklingError,
2233 "args from reduce() should be a tuple");
2234 return -1;
2235 }
2236
Tim Peters71fcda52003-02-14 23:05:28 +00002237 if (state == Py_None)
2238 state = NULL;
2239 if (listitems == Py_None)
2240 listitems = NULL;
2241 if (dictitems == Py_None)
2242 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002243
Tim Peters71fcda52003-02-14 23:05:28 +00002244 /* Protocol 2 special case: if callable's name is __newobj__, use
2245 * NEWOBJ. This consumes a lot of code.
2246 */
2247 if (use_newobj) {
2248 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002249
Tim Peters71fcda52003-02-14 23:05:28 +00002250 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002251 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2252 PyErr_Clear();
2253 else
2254 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002255 use_newobj = 0;
2256 }
2257 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002258 use_newobj = PyString_Check(temp) &&
2259 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002260 "__newobj__") == 0;
2261 Py_DECREF(temp);
2262 }
2263 }
2264 if (use_newobj) {
2265 PyObject *cls;
2266 PyObject *newargtup;
2267 int n, i;
2268
2269 /* Sanity checks. */
2270 n = PyTuple_Size(argtup);
2271 if (n < 1) {
2272 PyErr_SetString(PicklingError, "__newobj__ arglist "
2273 "is empty");
2274 return -1;
2275 }
2276
2277 cls = PyTuple_GET_ITEM(argtup, 0);
2278 if (! PyObject_HasAttrString(cls, "__new__")) {
2279 PyErr_SetString(PicklingError, "args[0] from "
2280 "__newobj__ args has no __new__");
2281 return -1;
2282 }
2283
2284 /* XXX How could ob be NULL? */
2285 if (ob != NULL) {
2286 PyObject *ob_dot_class;
2287
2288 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002289 if (ob_dot_class == NULL) {
2290 if (PyErr_ExceptionMatches(
2291 PyExc_AttributeError))
2292 PyErr_Clear();
2293 else
2294 return -1;
2295 }
Tim Peters71fcda52003-02-14 23:05:28 +00002296 i = ob_dot_class != cls; /* true iff a problem */
2297 Py_XDECREF(ob_dot_class);
2298 if (i) {
2299 PyErr_SetString(PicklingError, "args[0] from "
2300 "__newobj__ args has the wrong class");
2301 return -1;
2302 }
2303 }
2304
2305 /* Save the class and its __new__ arguments. */
2306 if (save(self, cls, 0) < 0)
2307 return -1;
2308
2309 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2310 if (newargtup == NULL)
2311 return -1;
2312 for (i = 1; i < n; ++i) {
2313 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2314 Py_INCREF(temp);
2315 PyTuple_SET_ITEM(newargtup, i-1, temp);
2316 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002317 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002318 Py_DECREF(newargtup);
2319 if (i < 0)
2320 return -1;
2321
2322 /* Add NEWOBJ opcode. */
2323 if (self->write_func(self, &newobj, 1) < 0)
2324 return -1;
2325 }
2326 else {
2327 /* Not using NEWOBJ. */
2328 if (save(self, callable, 0) < 0 ||
2329 save(self, argtup, 0) < 0 ||
2330 self->write_func(self, &reduce, 1) < 0)
2331 return -1;
2332 }
2333
2334 /* Memoize. */
2335 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 if (ob != NULL) {
2337 if (state && !PyDict_Check(state)) {
2338 if (put2(self, ob) < 0)
2339 return -1;
2340 }
Tim Peters71fcda52003-02-14 23:05:28 +00002341 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343 }
Tim Peters84e87f32001-03-17 04:50:51 +00002344
Guido van Rossum60456fd1997-04-09 17:36:32 +00002345
Tim Peters71fcda52003-02-14 23:05:28 +00002346 if (listitems && batch_list(self, listitems) < 0)
2347 return -1;
2348
2349 if (dictitems && batch_dict(self, dictitems) < 0)
2350 return -1;
2351
2352 if (state) {
2353 if (save(self, state, 0) < 0 ||
2354 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002355 return -1;
2356 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002358 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002359}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Guido van Rossum60456fd1997-04-09 17:36:32 +00002361static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002362save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363{
2364 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002365 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2366 PyObject *arg_tup;
2367 int res = -1;
2368 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002369
Facundo Batista763d3092008-06-30 01:10:55 +00002370 if (Py_EnterRecursiveCall(" while pickling an object"))
2371 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 if (!pers_save && self->pers_func) {
2374 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2375 res = tmp;
2376 goto finally;
2377 }
2378 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 if (args == Py_None) {
2381 res = save_none(self, args);
2382 goto finally;
2383 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002384
Christian Heimese93237d2007-12-19 02:37:44 +00002385 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002388 case 'b':
2389 if (args == Py_False || args == Py_True) {
2390 res = save_bool(self, args);
2391 goto finally;
2392 }
2393 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002394 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 if (type == &PyInt_Type) {
2396 res = save_int(self, args);
2397 goto finally;
2398 }
2399 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002400
Guido van Rossum60456fd1997-04-09 17:36:32 +00002401 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 if (type == &PyLong_Type) {
2403 res = save_long(self, args);
2404 goto finally;
2405 }
2406 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002407
Guido van Rossum60456fd1997-04-09 17:36:32 +00002408 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 if (type == &PyFloat_Type) {
2410 res = save_float(self, args);
2411 goto finally;
2412 }
2413 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414
Guido van Rossum60456fd1997-04-09 17:36:32 +00002415 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002416 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2417 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 goto finally;
2419 }
2420 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002421
Guido van Rossum60456fd1997-04-09 17:36:32 +00002422 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002423 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 res = save_string(self, args, 0);
2425 goto finally;
2426 }
Facundo Batista14618862008-06-22 15:27:10 +00002427 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002428
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002429#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002430 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002431 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 res = save_unicode(self, args, 0);
2433 goto finally;
2434 }
Facundo Batista14618862008-06-22 15:27:10 +00002435 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002436#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002438
Christian Heimese93237d2007-12-19 02:37:44 +00002439 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002440 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 if (PyDict_GetItem(self->memo, py_ob_id)) {
2444 if (get(self, py_ob_id) < 0)
2445 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 res = 0;
2448 goto finally;
2449 }
2450 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002453 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002454 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002455 res = save_string(self, args, 1);
2456 goto finally;
2457 }
2458 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002460#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002461 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 if (type == &PyUnicode_Type) {
2463 res = save_unicode(self, args, 1);
2464 goto finally;
2465 }
2466 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002467#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002468
Guido van Rossum60456fd1997-04-09 17:36:32 +00002469 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002470 if (type == &PyTuple_Type) {
2471 res = save_tuple(self, args);
2472 goto finally;
2473 }
2474 if (type == &PyType_Type) {
2475 res = save_global(self, args, NULL);
2476 goto finally;
2477 }
2478 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002479
Guido van Rossum60456fd1997-04-09 17:36:32 +00002480 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 if (type == &PyList_Type) {
2482 res = save_list(self, args);
2483 goto finally;
2484 }
2485 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002486
2487 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 if (type == &PyDict_Type) {
2489 res = save_dict(self, args);
2490 goto finally;
2491 }
2492 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002493
2494 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 if (type == &PyInstance_Type) {
2496 res = save_inst(self, args);
2497 goto finally;
2498 }
2499 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002500
2501 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 if (type == &PyClass_Type) {
2503 res = save_global(self, args, NULL);
2504 goto finally;
2505 }
2506 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002507
2508 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 if (type == &PyFunction_Type) {
2510 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002511 if (res && PyErr_ExceptionMatches(PickleError)) {
2512 /* fall back to reduce */
2513 PyErr_Clear();
2514 break;
2515 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 goto finally;
2517 }
2518 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002519
2520 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002521 if (type == &PyCFunction_Type) {
2522 res = save_global(self, args, NULL);
2523 goto finally;
2524 }
2525 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 if (!pers_save && self->inst_pers_func) {
2528 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2529 res = tmp;
2530 goto finally;
2531 }
2532 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002533
Jeremy Hylton39c61162002-07-16 19:47:43 +00002534 if (PyType_IsSubtype(type, &PyType_Type)) {
2535 res = save_global(self, args, NULL);
2536 goto finally;
2537 }
2538
Guido van Rossumb289b872003-02-19 01:45:13 +00002539 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002540 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002541 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002542 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002543 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2544 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002546 Py_INCREF(args);
2547 ARG_TUP(self, args);
2548 if (self->arg) {
2549 t = PyObject_Call(__reduce__, self->arg, NULL);
2550 FREE_ARG_TUP(self);
2551 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552 }
2553 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002554 /* Check for a __reduce_ex__ method. */
2555 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2556 if (__reduce__ != NULL) {
2557 t = PyInt_FromLong(self->proto);
2558 if (t != NULL) {
2559 ARG_TUP(self, t);
2560 t = NULL;
2561 if (self->arg) {
2562 t = PyObject_Call(__reduce__,
2563 self->arg, NULL);
2564 FREE_ARG_TUP(self);
2565 }
2566 }
2567 }
2568 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002569 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2570 PyErr_Clear();
2571 else
2572 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002573 /* Check for a __reduce__ method. */
2574 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2575 if (__reduce__ != NULL) {
2576 t = PyObject_Call(__reduce__,
2577 empty_tuple, NULL);
2578 }
2579 else {
2580 PyErr_SetObject(UnpickleableError, args);
2581 goto finally;
2582 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002585
Tim Peters71fcda52003-02-14 23:05:28 +00002586 if (t == NULL)
2587 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002588
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002589 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002590 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 goto finally;
2592 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002593
Tim Peters71fcda52003-02-14 23:05:28 +00002594 if (! PyTuple_Check(t)) {
2595 cPickle_ErrFormat(PicklingError, "Value returned by "
2596 "%s must be string or tuple",
2597 "O", __reduce__);
2598 goto finally;
2599 }
2600
2601 size = PyTuple_Size(t);
2602 if (size < 2 || size > 5) {
2603 cPickle_ErrFormat(PicklingError, "tuple returned by "
2604 "%s must contain 2 through 5 elements",
2605 "O", __reduce__);
2606 goto finally;
2607 }
2608
2609 arg_tup = PyTuple_GET_ITEM(t, 1);
2610 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2611 cPickle_ErrFormat(PicklingError, "Second element of "
2612 "tuple returned by %s must be a tuple",
2613 "O", __reduce__);
2614 goto finally;
2615 }
2616
2617 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002620 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 Py_XDECREF(py_ob_id);
2622 Py_XDECREF(__reduce__);
2623 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002626}
2627
2628
2629static int
Tim Peterscba30e22003-02-01 06:24:36 +00002630dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631{
2632 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002633
Tim Peters4190fb82003-02-02 16:09:05 +00002634 if (self->proto >= 2) {
2635 char bytes[2];
2636
2637 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002638 assert(self->proto >= 0 && self->proto < 256);
2639 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002640 if (self->write_func(self, bytes, 2) < 0)
2641 return -1;
2642 }
2643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 if (save(self, args, 0) < 0)
2645 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646
Tim Peters4190fb82003-02-02 16:09:05 +00002647 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002649
Tim Peters4190fb82003-02-02 16:09:05 +00002650 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002654}
2655
2656static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002657Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658{
Tim Peterscba30e22003-02-01 06:24:36 +00002659 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 PyDict_Clear(self->memo);
2661 Py_INCREF(Py_None);
2662 return Py_None;
2663}
2664
2665static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002666Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667{
2668 int l, i, rsize, ssize, clear=1, lm;
2669 long ik;
2670 PyObject *k, *r;
2671 char *s, *p, *have_get;
2672 Pdata *data;
2673
2674 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002675 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 return NULL;
2677
2678 /* Check to make sure we are based on a list */
2679 if (! Pdata_Check(self->file)) {
2680 PyErr_SetString(PicklingError,
2681 "Attempt to getvalue() a non-list-based pickler");
2682 return NULL;
2683 }
2684
2685 /* flush write buffer */
2686 if (write_other(self, NULL, 0) < 0) return NULL;
2687
2688 data=(Pdata*)self->file;
2689 l=data->length;
2690
2691 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002692 lm = PyDict_Size(self->memo);
2693 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002695 have_get = malloc(lm);
2696 if (have_get == NULL) return PyErr_NoMemory();
2697 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698
2699 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002700 for (rsize = 0, i = l; --i >= 0; ) {
2701 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002703 if (PyString_Check(k))
2704 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705
2706 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002707 ik = PyInt_AS_LONG((PyIntObject*)k);
2708 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 PyErr_SetString(PicklingError,
2710 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002711 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 }
Tim Petersac5687a2003-02-02 18:08:34 +00002713 if (have_get[ik]) /* with matching get */
2714 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 }
2716
2717 else if (! (PyTuple_Check(k) &&
2718 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002719 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 ) {
2721 PyErr_SetString(PicklingError,
2722 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002723 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 }
2725
2726 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002727 ik = PyInt_AS_LONG((PyIntObject *)k);
2728 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 PyErr_SetString(PicklingError,
2730 "Invalid get data");
2731 return NULL;
2732 }
Tim Petersac5687a2003-02-02 18:08:34 +00002733 have_get[ik] = 1;
2734 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 }
2737
2738 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002739 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002740 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002741 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742
Tim Petersac5687a2003-02-02 18:08:34 +00002743 for (i = 0; i < l; i++) {
2744 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002746 if (PyString_Check(k)) {
2747 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002748 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002749 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002750 while (--ssize >= 0)
2751 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 }
2753 }
2754
2755 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002756 ik = PyInt_AS_LONG((PyIntObject *)
2757 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 if (ik < 256) {
2759 *s++ = BINGET;
2760 *s++ = (int)(ik & 0xff);
2761 }
2762 else {
2763 *s++ = LONG_BINGET;
2764 *s++ = (int)(ik & 0xff);
2765 *s++ = (int)((ik >> 8) & 0xff);
2766 *s++ = (int)((ik >> 16) & 0xff);
2767 *s++ = (int)((ik >> 24) & 0xff);
2768 }
2769 }
2770
2771 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002772 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773
2774 if (have_get[ik]) { /* with matching get */
2775 if (ik < 256) {
2776 *s++ = BINPUT;
2777 *s++ = (int)(ik & 0xff);
2778 }
2779 else {
2780 *s++ = LONG_BINPUT;
2781 *s++ = (int)(ik & 0xff);
2782 *s++ = (int)((ik >> 8) & 0xff);
2783 *s++ = (int)((ik >> 16) & 0xff);
2784 *s++ = (int)((ik >> 24) & 0xff);
2785 }
2786 }
2787 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 }
2789
2790 if (clear) {
2791 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002792 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 }
2794
2795 free(have_get);
2796 return r;
2797 err:
2798 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002799 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002800}
2801
2802static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002803Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804{
2805 PyObject *ob;
2806 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002807
Tim Peterscba30e22003-02-01 06:24:36 +00002808 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 if (dump(self, ob) < 0)
2812 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 /* XXX Why does dump() return self? */
2817 Py_INCREF(self);
2818 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002819}
2820
2821
Tim Peterscba30e22003-02-01 06:24:36 +00002822static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823{
Neal Norwitzb0493252002-03-31 14:44:22 +00002824 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002825 PyDoc_STR("dump(object) -- "
2826 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002827 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002828 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002829 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002830 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002831 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002832};
2833
2834
2835static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002836newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837{
2838 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002839
Tim Peters5bd2a792003-02-01 16:45:06 +00002840 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002841 proto = HIGHEST_PROTOCOL;
2842 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002843 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2844 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002845 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002847 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002848
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002849 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002850 if (self == NULL)
2851 return NULL;
2852 self->proto = proto;
2853 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 self->fp = NULL;
2855 self->write = NULL;
2856 self->memo = NULL;
2857 self->arg = NULL;
2858 self->pers_func = NULL;
2859 self->inst_pers_func = NULL;
2860 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002861 self->fast = 0;
2862 self->fast_container = 0;
2863 self->fast_memo = NULL;
2864 self->buf_size = 0;
2865 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002866
Tim Peters5bd2a792003-02-01 16:45:06 +00002867 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 if (file)
2869 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002870 else {
2871 file = Pdata_New();
2872 if (file == NULL)
2873 goto err;
2874 }
2875 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002876
Tim Peterscba30e22003-02-01 06:24:36 +00002877 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 if (PyFile_Check(file)) {
2881 self->fp = PyFile_AsFile(file);
2882 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002883 PyErr_SetString(PyExc_ValueError,
2884 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885 goto err;
2886 }
2887 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002888 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 else if (PycStringIO_OutputCheck(file)) {
2890 self->write_func = write_cStringIO;
2891 }
2892 else if (file == Py_None) {
2893 self->write_func = write_none;
2894 }
2895 else {
2896 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 if (! Pdata_Check(file)) {
2899 self->write = PyObject_GetAttr(file, write_str);
2900 if (!self->write) {
2901 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002902 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002903 "argument must have 'write' "
2904 "attribute");
2905 goto err;
2906 }
2907 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002908
Tim Peters5bd2a792003-02-01 16:45:06 +00002909 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2910 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002911 PyErr_NoMemory();
2912 goto err;
2913 }
2914 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 if (PyEval_GetRestricted()) {
2917 /* Restricted execution, get private tables */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00002918 PyObject *m = PyImport_Import(copyreg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002919
Tim Peters5b7da392003-02-04 00:21:07 +00002920 if (m == NULL)
2921 goto err;
2922 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002924 if (self->dispatch_table == NULL)
2925 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 }
2927 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002928 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929 Py_INCREF(dispatch_table);
2930 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002931 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002935 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002936 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002938}
2939
2940
2941static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002942get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002944 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002946 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002947
Tim Peters92c8bb32003-02-13 23:00:26 +00002948 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002949 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002950 * accepts Pickler() and Pickler(integer) too. The meaning then
2951 * is clear as mud, undocumented, and not supported by pickle.py.
2952 * I'm told Zope uses this, but I haven't traced into this code
2953 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002954 */
2955 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002957 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002958 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2959 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 return NULL;
2961 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002962 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002963}
2964
2965
2966static void
Tim Peterscba30e22003-02-01 06:24:36 +00002967Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002969 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 Py_XDECREF(self->write);
2971 Py_XDECREF(self->memo);
2972 Py_XDECREF(self->fast_memo);
2973 Py_XDECREF(self->arg);
2974 Py_XDECREF(self->file);
2975 Py_XDECREF(self->pers_func);
2976 Py_XDECREF(self->inst_pers_func);
2977 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002978 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00002979 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002980}
2981
2982static int
2983Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2984{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002985 Py_VISIT(self->write);
2986 Py_VISIT(self->memo);
2987 Py_VISIT(self->fast_memo);
2988 Py_VISIT(self->arg);
2989 Py_VISIT(self->file);
2990 Py_VISIT(self->pers_func);
2991 Py_VISIT(self->inst_pers_func);
2992 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002993 return 0;
2994}
2995
2996static int
2997Pickler_clear(Picklerobject *self)
2998{
Thomas Woutersedf17d82006-04-15 17:28:34 +00002999 Py_CLEAR(self->write);
3000 Py_CLEAR(self->memo);
3001 Py_CLEAR(self->fast_memo);
3002 Py_CLEAR(self->arg);
3003 Py_CLEAR(self->file);
3004 Py_CLEAR(self->pers_func);
3005 Py_CLEAR(self->inst_pers_func);
3006 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003007 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003008}
3009
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003010static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003011Pickler_get_pers_func(Picklerobject *p)
3012{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 if (p->pers_func == NULL)
3014 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3015 else
3016 Py_INCREF(p->pers_func);
3017 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003018}
3019
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003020static int
3021Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3022{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if (v == NULL) {
3024 PyErr_SetString(PyExc_TypeError,
3025 "attribute deletion is not supported");
3026 return -1;
3027 }
3028 Py_XDECREF(p->pers_func);
3029 Py_INCREF(v);
3030 p->pers_func = v;
3031 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003032}
3033
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003034static int
3035Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3036{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 if (v == NULL) {
3038 PyErr_SetString(PyExc_TypeError,
3039 "attribute deletion is not supported");
3040 return -1;
3041 }
3042 Py_XDECREF(p->inst_pers_func);
3043 Py_INCREF(v);
3044 p->inst_pers_func = v;
3045 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003046}
3047
3048static PyObject *
3049Pickler_get_memo(Picklerobject *p)
3050{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051 if (p->memo == NULL)
3052 PyErr_SetString(PyExc_AttributeError, "memo");
3053 else
3054 Py_INCREF(p->memo);
3055 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003056}
3057
3058static int
3059Pickler_set_memo(Picklerobject *p, PyObject *v)
3060{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 if (v == NULL) {
3062 PyErr_SetString(PyExc_TypeError,
3063 "attribute deletion is not supported");
3064 return -1;
3065 }
3066 if (!PyDict_Check(v)) {
3067 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3068 return -1;
3069 }
3070 Py_XDECREF(p->memo);
3071 Py_INCREF(v);
3072 p->memo = v;
3073 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003074}
3075
3076static PyObject *
3077Pickler_get_error(Picklerobject *p)
3078{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 /* why is this an attribute on the Pickler? */
3080 Py_INCREF(PicklingError);
3081 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003082}
3083
3084static PyMemberDef Pickler_members[] = {
3085 {"binary", T_INT, offsetof(Picklerobject, bin)},
3086 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003087 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003088};
3089
3090static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003091 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003092 (setter)Pickler_set_pers_func},
3093 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3094 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003095 {"PicklingError", (getter)Pickler_get_error, NULL},
3096 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003097};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003099PyDoc_STRVAR(Picklertype__doc__,
3100"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003101
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003102static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003103 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003104 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003105 sizeof(Picklerobject), /*tp_basicsize*/
3106 0,
3107 (destructor)Pickler_dealloc, /* tp_dealloc */
3108 0, /* tp_print */
3109 0, /* tp_getattr */
3110 0, /* tp_setattr */
3111 0, /* tp_compare */
3112 0, /* tp_repr */
3113 0, /* tp_as_number */
3114 0, /* tp_as_sequence */
3115 0, /* tp_as_mapping */
3116 0, /* tp_hash */
3117 0, /* tp_call */
3118 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003119 PyObject_GenericGetAttr, /* tp_getattro */
3120 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003121 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003122 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003123 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003124 (traverseproc)Pickler_traverse, /* tp_traverse */
3125 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003126 0, /* tp_richcompare */
3127 0, /* tp_weaklistoffset */
3128 0, /* tp_iter */
3129 0, /* tp_iternext */
3130 Pickler_methods, /* tp_methods */
3131 Pickler_members, /* tp_members */
3132 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003133};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003134
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003135static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003136find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003137{
3138 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 if (fc) {
3141 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003142 PyErr_SetString(UnpicklingError, "Global and instance "
3143 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003144 return NULL;
3145 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003146 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3147 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 module = PySys_GetObject("modules");
3151 if (module == NULL)
3152 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 module = PyDict_GetItem(module, py_module_name);
3155 if (module == NULL) {
3156 module = PyImport_Import(py_module_name);
3157 if (!module)
3158 return NULL;
3159 global = PyObject_GetAttr(module, py_global_name);
3160 Py_DECREF(module);
3161 }
3162 else
3163 global = PyObject_GetAttr(module, py_global_name);
3164 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003165}
3166
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003167static int
Tim Peterscba30e22003-02-01 06:24:36 +00003168marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169{
3170 if (self->num_marks < 1) {
3171 PyErr_SetString(UnpicklingError, "could not find MARK");
3172 return -1;
3173 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176}
3177
Tim Peters84e87f32001-03-17 04:50:51 +00003178
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179static int
Tim Peterscba30e22003-02-01 06:24:36 +00003180load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181{
3182 PDATA_APPEND(self->stack, Py_None, -1);
3183 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003184}
3185
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003186static int
Tim Peterscba30e22003-02-01 06:24:36 +00003187bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188{
3189 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3190 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003191}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
3193static int
Tim Peterscba30e22003-02-01 06:24:36 +00003194load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195{
3196 PyObject *py_int = 0;
3197 char *endptr, *s;
3198 int len, res = -1;
3199 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200
Tim Peters0bc93f52003-02-02 18:29:33 +00003201 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 if (len < 2) return bad_readline();
3203 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 errno = 0;
3206 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3209 /* Hm, maybe we've got something long. Let's try reading
3210 it as a Python long object. */
3211 errno = 0;
3212 py_int = PyLong_FromString(s, NULL, 0);
3213 if (py_int == NULL) {
3214 PyErr_SetString(PyExc_ValueError,
3215 "could not convert string to int");
3216 goto finally;
3217 }
3218 }
3219 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003220 if (len == 3 && (l == 0 || l == 1)) {
3221 if (!( py_int = PyBool_FromLong(l))) goto finally;
3222 }
3223 else {
3224 if (!( py_int = PyInt_FromLong(l))) goto finally;
3225 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 free(s);
3229 PDATA_PUSH(self->stack, py_int, -1);
3230 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003232 finally:
3233 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236}
3237
Tim Peters3c67d792003-02-02 17:59:11 +00003238static int
3239load_bool(Unpicklerobject *self, PyObject *boolean)
3240{
3241 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003242 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003243 return 0;
3244}
3245
Tim Petersee1a53c2003-02-02 02:57:53 +00003246/* s contains x bytes of a little-endian integer. Return its value as a
3247 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3248 * int, but when x is 4 it's a signed one. This is an historical source
3249 * of x-platform bugs.
3250 */
Tim Peters84e87f32001-03-17 04:50:51 +00003251static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003252calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253{
3254 unsigned char c;
3255 int i;
3256 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 for (i = 0, l = 0L; i < x; i++) {
3259 c = (unsigned char)s[i];
3260 l |= (long)c << (i * 8);
3261 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003262#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003263 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3264 * is signed, so on a box with longs bigger than 4 bytes we need
3265 * to extend a BININT's sign bit to the full width.
3266 */
3267 if (x == 4 && l & (1L << 31))
3268 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003269#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003271}
3272
3273
3274static int
Tim Peterscba30e22003-02-01 06:24:36 +00003275load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276{
3277 PyObject *py_int = 0;
3278 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
Tim Peterscba30e22003-02-01 06:24:36 +00003282 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003285 PDATA_PUSH(self->stack, py_int, -1);
3286 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287}
3288
3289
3290static int
Tim Peterscba30e22003-02-01 06:24:36 +00003291load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292{
3293 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294
Tim Peters0bc93f52003-02-02 18:29:33 +00003295 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003296 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299}
3300
3301
3302static int
Tim Peterscba30e22003-02-01 06:24:36 +00003303load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304{
3305 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003306
Tim Peters0bc93f52003-02-02 18:29:33 +00003307 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311}
3312
3313
3314static int
Tim Peterscba30e22003-02-01 06:24:36 +00003315load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003316{
3317 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318
Tim Peters0bc93f52003-02-02 18:29:33 +00003319 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003320 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323}
Tim Peters84e87f32001-03-17 04:50:51 +00003324
Guido van Rossum60456fd1997-04-09 17:36:32 +00003325static int
Tim Peterscba30e22003-02-01 06:24:36 +00003326load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327{
3328 PyObject *l = 0;
3329 char *end, *s;
3330 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003331
Tim Peters0bc93f52003-02-02 18:29:33 +00003332 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003333 if (len < 2) return bad_readline();
3334 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335
Tim Peterscba30e22003-02-01 06:24:36 +00003336 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003337 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 free(s);
3340 PDATA_PUSH(self->stack, l, -1);
3341 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003343 finally:
3344 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347}
3348
Tim Petersee1a53c2003-02-02 02:57:53 +00003349/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3350 * data following.
3351 */
3352static int
3353load_counted_long(Unpicklerobject *self, int size)
3354{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003355 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003356 char *nbytes;
3357 unsigned char *pdata;
3358 PyObject *along;
3359
3360 assert(size == 1 || size == 4);
3361 i = self->read_func(self, &nbytes, size);
3362 if (i < 0) return -1;
3363
3364 size = calc_binint(nbytes, size);
3365 if (size < 0) {
3366 /* Corrupt or hostile pickle -- we never write one like
3367 * this.
3368 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003369 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003370 "byte count");
3371 return -1;
3372 }
3373
3374 if (size == 0)
3375 along = PyLong_FromLong(0L);
3376 else {
3377 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003378 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003379 if (i < 0) return -1;
3380 along = _PyLong_FromByteArray(pdata, (size_t)size,
3381 1 /* little endian */, 1 /* signed */);
3382 }
3383 if (along == NULL)
3384 return -1;
3385 PDATA_PUSH(self->stack, along, -1);
3386 return 0;
3387}
Tim Peters84e87f32001-03-17 04:50:51 +00003388
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389static int
Tim Peterscba30e22003-02-01 06:24:36 +00003390load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391{
3392 PyObject *py_float = 0;
3393 char *endptr, *s;
3394 int len, res = -1;
3395 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396
Tim Peters0bc93f52003-02-02 18:29:33 +00003397 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 if (len < 2) return bad_readline();
3399 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003401 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003402 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3405 PyErr_SetString(PyExc_ValueError,
3406 "could not convert string to float");
3407 goto finally;
3408 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Tim Peterscba30e22003-02-01 06:24:36 +00003410 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 free(s);
3414 PDATA_PUSH(self->stack, py_float, -1);
3415 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 finally:
3418 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421}
3422
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423static int
Tim Peterscba30e22003-02-01 06:24:36 +00003424load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425{
Tim Peters9905b942003-03-20 20:53:32 +00003426 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427 double x;
3428 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429
Tim Peters0bc93f52003-02-02 18:29:33 +00003430 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003431 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Tim Peters9905b942003-03-20 20:53:32 +00003433 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3434 if (x == -1.0 && PyErr_Occurred())
3435 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Tim Peters9905b942003-03-20 20:53:32 +00003437 py_float = PyFloat_FromDouble(x);
3438 if (py_float == NULL)
3439 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 PDATA_PUSH(self->stack, py_float, -1);
3442 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
3445static int
Tim Peterscba30e22003-02-01 06:24:36 +00003446load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447{
3448 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003449 int len, res = -1;
3450 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003451
Tim Peters0bc93f52003-02-02 18:29:33 +00003452 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453 if (len < 2) return bad_readline();
3454 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003456
3457 /* Strip outermost quotes */
3458 while (s[len-1] <= ' ')
3459 len--;
3460 if(s[0]=='"' && s[len-1]=='"'){
3461 s[len-1] = '\0';
3462 p = s + 1 ;
3463 len -= 2;
3464 } else if(s[0]=='\'' && s[len-1]=='\''){
3465 s[len-1] = '\0';
3466 p = s + 1 ;
3467 len -= 2;
3468 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 goto insecure;
3470 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003471
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003472 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003473 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003474 if (str) {
3475 PDATA_PUSH(self->stack, str, -1);
3476 res = 0;
3477 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 insecure:
3481 free(s);
3482 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3483 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003484}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
3486
3487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
3490 PyObject *py_string = 0;
3491 long l;
3492 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493
Tim Peters0bc93f52003-02-02 18:29:33 +00003494 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003497 if (l < 0) {
3498 /* Corrupt or hostile pickle -- we never write one like
3499 * this.
3500 */
3501 PyErr_SetString(UnpicklingError,
3502 "BINSTRING pickle has negative byte count");
3503 return -1;
3504 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003505
Tim Peters0bc93f52003-02-02 18:29:33 +00003506 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003509 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 PDATA_PUSH(self->stack, py_string, -1);
3513 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514}
3515
3516
3517static int
Tim Peterscba30e22003-02-01 06:24:36 +00003518load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519{
3520 PyObject *py_string = 0;
3521 unsigned char l;
3522 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523
Tim Peters0bc93f52003-02-02 18:29:33 +00003524 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003528
Tim Peters0bc93f52003-02-02 18:29:33 +00003529 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003531 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 PDATA_PUSH(self->stack, py_string, -1);
3534 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003535}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536
3537
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003538#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539static int
Tim Peterscba30e22003-02-01 06:24:36 +00003540load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541{
3542 PyObject *str = 0;
3543 int len, res = -1;
3544 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003545
Tim Peters0bc93f52003-02-02 18:29:33 +00003546 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003547 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003548
Tim Peterscba30e22003-02-01 06:24:36 +00003549 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003550 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 PDATA_PUSH(self->stack, str, -1);
3553 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 finally:
3556 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003557}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003558#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003559
3560
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003561#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003562static int
Tim Peterscba30e22003-02-01 06:24:36 +00003563load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564{
3565 PyObject *unicode;
3566 long l;
3567 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003568
Tim Peters0bc93f52003-02-02 18:29:33 +00003569 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003572 if (l < 0) {
3573 /* Corrupt or hostile pickle -- we never write one like
3574 * this.
3575 */
3576 PyErr_SetString(UnpicklingError,
3577 "BINUNICODE pickle has negative byte count");
3578 return -1;
3579 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003580
Tim Peters0bc93f52003-02-02 18:29:33 +00003581 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003583
Tim Peterscba30e22003-02-01 06:24:36 +00003584 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003587 PDATA_PUSH(self->stack, unicode, -1);
3588 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003589}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003590#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003591
3592
3593static int
Tim Peterscba30e22003-02-01 06:24:36 +00003594load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595{
3596 PyObject *tup;
3597 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599 if ((i = marker(self)) < 0) return -1;
3600 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3601 PDATA_PUSH(self->stack, tup, -1);
3602 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603}
3604
3605static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003606load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003608 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Tim Peters1d63c9f2003-02-02 20:29:39 +00003610 if (tup == NULL)
3611 return -1;
3612
3613 while (--len >= 0) {
3614 PyObject *element;
3615
3616 PDATA_POP(self->stack, element);
3617 if (element == NULL)
3618 return -1;
3619 PyTuple_SET_ITEM(tup, len, element);
3620 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 PDATA_PUSH(self->stack, tup, -1);
3622 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003623}
3624
3625static int
Tim Peterscba30e22003-02-01 06:24:36 +00003626load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627{
3628 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630 if (!( list=PyList_New(0))) return -1;
3631 PDATA_PUSH(self->stack, list, -1);
3632 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003633}
3634
3635static int
Tim Peterscba30e22003-02-01 06:24:36 +00003636load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637{
3638 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003640 if (!( dict=PyDict_New())) return -1;
3641 PDATA_PUSH(self->stack, dict, -1);
3642 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643}
3644
3645
3646static int
Tim Peterscba30e22003-02-01 06:24:36 +00003647load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648{
3649 PyObject *list = 0;
3650 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652 if ((i = marker(self)) < 0) return -1;
3653 if (!( list=Pdata_popList(self->stack, i))) return -1;
3654 PDATA_PUSH(self->stack, list, -1);
3655 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656}
3657
3658static int
Tim Peterscba30e22003-02-01 06:24:36 +00003659load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660{
3661 PyObject *dict, *key, *value;
3662 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664 if ((i = marker(self)) < 0) return -1;
3665 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003667 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669 for (k = i+1; k < j; k += 2) {
3670 key =self->stack->data[k-1];
3671 value=self->stack->data[k ];
3672 if (PyDict_SetItem(dict, key, value) < 0) {
3673 Py_DECREF(dict);
3674 return -1;
3675 }
3676 }
3677 Pdata_clear(self->stack, i);
3678 PDATA_PUSH(self->stack, dict, -1);
3679 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680}
3681
3682static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003683Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003685 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 if (PyClass_Check(cls)) {
3688 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 if ((l=PyObject_Size(args)) < 0) goto err;
3691 if (!( l )) {
3692 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003693
Tim Peterscba30e22003-02-01 06:24:36 +00003694 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003695 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003697 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 so bypass usual construction */
3699 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003701 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003702 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 goto err;
3704 return inst;
3705 }
3706 Py_DECREF(__getinitargs__);
3707 }
Tim Peters84e87f32001-03-17 04:50:51 +00003708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709 if ((r=PyInstance_New(cls, args, NULL))) return r;
3710 else goto err;
3711 }
Tim Peters84e87f32001-03-17 04:50:51 +00003712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 err:
3716 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003717 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003720 tmp_value = v;
3721 /* NULL occurs when there was a KeyboardInterrupt */
3722 if (tmp_value == NULL)
3723 tmp_value = Py_None;
3724 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725 Py_XDECREF(v);
3726 v=r;
3727 }
3728 PyErr_Restore(tp,v,tb);
3729 }
3730 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003731}
Tim Peters84e87f32001-03-17 04:50:51 +00003732
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733
3734static int
Tim Peterscba30e22003-02-01 06:24:36 +00003735load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736{
3737 PyObject *class, *tup, *obj=0;
3738 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 if ((i = marker(self)) < 0) return -1;
3741 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3742 PDATA_POP(self->stack, class);
3743 if (class) {
3744 obj = Instance_New(class, tup);
3745 Py_DECREF(class);
3746 }
3747 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749 if (! obj) return -1;
3750 PDATA_PUSH(self->stack, obj, -1);
3751 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752}
3753
3754
3755static int
Tim Peterscba30e22003-02-01 06:24:36 +00003756load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757{
3758 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3759 int i, len;
3760 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003763
Tim Peters0bc93f52003-02-02 18:29:33 +00003764 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003766 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003768
Tim Peters0bc93f52003-02-02 18:29:33 +00003769 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003771 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003772 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 self->find_class);
3774 Py_DECREF(class_name);
3775 }
3776 }
3777 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 if ((tup=Pdata_popTuple(self->stack, i))) {
3782 obj = Instance_New(class, tup);
3783 Py_DECREF(tup);
3784 }
3785 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 PDATA_PUSH(self->stack, obj, -1);
3790 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791}
3792
Tim Peterseab7db32003-02-13 18:24:14 +00003793static int
3794load_newobj(Unpicklerobject *self)
3795{
3796 PyObject *args = NULL;
3797 PyObject *clsraw = NULL;
3798 PyTypeObject *cls; /* clsraw cast to its true type */
3799 PyObject *obj;
3800
3801 /* Stack is ... cls argtuple, and we want to call
3802 * cls.__new__(cls, *argtuple).
3803 */
3804 PDATA_POP(self->stack, args);
3805 if (args == NULL) goto Fail;
3806 if (! PyTuple_Check(args)) {
3807 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3808 "tuple.");
3809 goto Fail;
3810 }
3811
3812 PDATA_POP(self->stack, clsraw);
3813 cls = (PyTypeObject *)clsraw;
3814 if (cls == NULL) goto Fail;
3815 if (! PyType_Check(cls)) {
3816 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3817 "isn't a type object");
3818 goto Fail;
3819 }
3820 if (cls->tp_new == NULL) {
3821 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3822 "has NULL tp_new");
3823 goto Fail;
3824 }
3825
3826 /* Call __new__. */
3827 obj = cls->tp_new(cls, args, NULL);
3828 if (obj == NULL) goto Fail;
3829
3830 Py_DECREF(args);
3831 Py_DECREF(clsraw);
3832 PDATA_PUSH(self->stack, obj, -1);
3833 return 0;
3834
3835 Fail:
3836 Py_XDECREF(args);
3837 Py_XDECREF(clsraw);
3838 return -1;
3839}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003840
3841static int
Tim Peterscba30e22003-02-01 06:24:36 +00003842load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843{
3844 PyObject *class = 0, *module_name = 0, *class_name = 0;
3845 int len;
3846 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003847
Tim Peters0bc93f52003-02-02 18:29:33 +00003848 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003850 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003852
Tim Peters0bc93f52003-02-02 18:29:33 +00003853 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003854 if (len < 2) {
3855 Py_DECREF(module_name);
3856 return bad_readline();
3857 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003858 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003859 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 self->find_class);
3861 Py_DECREF(class_name);
3862 }
3863 }
3864 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 if (! class) return -1;
3867 PDATA_PUSH(self->stack, class, -1);
3868 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869}
3870
3871
3872static int
Tim Peterscba30e22003-02-01 06:24:36 +00003873load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874{
3875 PyObject *pid = 0;
3876 int len;
3877 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003880 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 if (len < 2) return bad_readline();
3882
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003883 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 if (!pid) return -1;
3885
3886 if (PyList_Check(self->pers_func)) {
3887 if (PyList_Append(self->pers_func, pid) < 0) {
3888 Py_DECREF(pid);
3889 return -1;
3890 }
3891 }
3892 else {
3893 ARG_TUP(self, pid);
3894 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003895 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003896 NULL);
3897 FREE_ARG_TUP(self);
3898 }
3899 }
3900
3901 if (! pid) return -1;
3902
3903 PDATA_PUSH(self->stack, pid, -1);
3904 return 0;
3905 }
3906 else {
3907 PyErr_SetString(UnpicklingError,
3908 "A load persistent id instruction was encountered,\n"
3909 "but no persistent_load function was specified.");
3910 return -1;
3911 }
3912}
3913
3914static int
Tim Peterscba30e22003-02-01 06:24:36 +00003915load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916{
3917 PyObject *pid = 0;
3918
3919 if (self->pers_func) {
3920 PDATA_POP(self->stack, pid);
3921 if (! pid) return -1;
3922
3923 if (PyList_Check(self->pers_func)) {
3924 if (PyList_Append(self->pers_func, pid) < 0) {
3925 Py_DECREF(pid);
3926 return -1;
3927 }
3928 }
3929 else {
3930 ARG_TUP(self, pid);
3931 if (self->arg) {
3932 pid = PyObject_Call(self->pers_func, self->arg,
3933 NULL);
3934 FREE_ARG_TUP(self);
3935 }
3936 if (! pid) return -1;
3937 }
3938
3939 PDATA_PUSH(self->stack, pid, -1);
3940 return 0;
3941 }
3942 else {
3943 PyErr_SetString(UnpicklingError,
3944 "A load persistent id instruction was encountered,\n"
3945 "but no persistent_load function was specified.");
3946 return -1;
3947 }
3948}
3949
3950
3951static int
Tim Peterscba30e22003-02-01 06:24:36 +00003952load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953{
3954 int len;
3955
3956 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3957
3958 /* Note that we split the (pickle.py) stack into two stacks,
3959 an object stack and a mark stack. We have to be clever and
3960 pop the right one. We do this by looking at the top of the
3961 mark stack.
3962 */
3963
3964 if ((self->num_marks > 0) &&
3965 (self->marks[self->num_marks - 1] == len))
3966 self->num_marks--;
3967 else {
3968 len--;
3969 Py_DECREF(self->stack->data[len]);
3970 self->stack->length=len;
3971 }
3972
3973 return 0;
3974}
3975
3976
3977static int
Tim Peterscba30e22003-02-01 06:24:36 +00003978load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003979{
3980 int i;
3981
3982 if ((i = marker(self)) < 0)
3983 return -1;
3984
3985 Pdata_clear(self->stack, i);
3986
3987 return 0;
3988}
3989
3990
3991static int
Tim Peterscba30e22003-02-01 06:24:36 +00003992load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993{
3994 PyObject *last;
3995 int len;
3996
3997 if ((len = self->stack->length) <= 0) return stackUnderflow();
3998 last=self->stack->data[len-1];
3999 Py_INCREF(last);
4000 PDATA_PUSH(self->stack, last, -1);
4001 return 0;
4002}
4003
4004
4005static int
Tim Peterscba30e22003-02-01 06:24:36 +00004006load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007{
4008 PyObject *py_str = 0, *value = 0;
4009 int len;
4010 char *s;
4011 int rc;
4012
Tim Peters0bc93f52003-02-02 18:29:33 +00004013 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004014 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004015
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004016 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 value = PyDict_GetItem(self->memo, py_str);
4019 if (! value) {
4020 PyErr_SetObject(BadPickleGet, py_str);
4021 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004022 }
4023 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 PDATA_APPEND(self->stack, value, -1);
4025 rc = 0;
4026 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004028 Py_DECREF(py_str);
4029 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030}
4031
4032
4033static int
Tim Peterscba30e22003-02-01 06:24:36 +00004034load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035{
4036 PyObject *py_key = 0, *value = 0;
4037 unsigned char key;
4038 char *s;
4039 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004040
Tim Peters0bc93f52003-02-02 18:29:33 +00004041 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 key = (unsigned char)s[0];
4044 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004046 value = PyDict_GetItem(self->memo, py_key);
4047 if (! value) {
4048 PyErr_SetObject(BadPickleGet, py_key);
4049 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004050 }
4051 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 PDATA_APPEND(self->stack, value, -1);
4053 rc = 0;
4054 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 Py_DECREF(py_key);
4057 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058}
4059
4060
4061static int
Tim Peterscba30e22003-02-01 06:24:36 +00004062load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063{
4064 PyObject *py_key = 0, *value = 0;
4065 unsigned char c;
4066 char *s;
4067 long key;
4068 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069
Tim Peters0bc93f52003-02-02 18:29:33 +00004070 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 c = (unsigned char)s[0];
4073 key = (long)c;
4074 c = (unsigned char)s[1];
4075 key |= (long)c << 8;
4076 c = (unsigned char)s[2];
4077 key |= (long)c << 16;
4078 c = (unsigned char)s[3];
4079 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4082
4083 value = PyDict_GetItem(self->memo, py_key);
4084 if (! value) {
4085 PyErr_SetObject(BadPickleGet, py_key);
4086 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004087 }
4088 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089 PDATA_APPEND(self->stack, value, -1);
4090 rc = 0;
4091 }
4092
4093 Py_DECREF(py_key);
4094 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004095}
4096
Tim Peters2d629652003-02-04 05:06:17 +00004097/* Push an object from the extension registry (EXT[124]). nbytes is
4098 * the number of bytes following the opcode, holding the index (code) value.
4099 */
4100static int
4101load_extension(Unpicklerobject *self, int nbytes)
4102{
4103 char *codebytes; /* the nbytes bytes after the opcode */
4104 long code; /* calc_binint returns long */
4105 PyObject *py_code; /* code as a Python int */
4106 PyObject *obj; /* the object to push */
4107 PyObject *pair; /* (module_name, class_name) */
4108 PyObject *module_name, *class_name;
4109
4110 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4111 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4112 code = calc_binint(codebytes, nbytes);
4113 if (code <= 0) { /* note that 0 is forbidden */
4114 /* Corrupt or hostile pickle. */
4115 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4116 return -1;
4117 }
4118
4119 /* Look for the code in the cache. */
4120 py_code = PyInt_FromLong(code);
4121 if (py_code == NULL) return -1;
4122 obj = PyDict_GetItem(extension_cache, py_code);
4123 if (obj != NULL) {
4124 /* Bingo. */
4125 Py_DECREF(py_code);
4126 PDATA_APPEND(self->stack, obj, -1);
4127 return 0;
4128 }
4129
4130 /* Look up the (module_name, class_name) pair. */
4131 pair = PyDict_GetItem(inverted_registry, py_code);
4132 if (pair == NULL) {
4133 Py_DECREF(py_code);
4134 PyErr_Format(PyExc_ValueError, "unregistered extension "
4135 "code %ld", code);
4136 return -1;
4137 }
4138 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004139 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004140 */
4141 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004142 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4143 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004144 Py_DECREF(py_code);
4145 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4146 "isn't a 2-tuple of strings", code);
4147 return -1;
4148 }
4149 /* Load the object. */
4150 obj = find_class(module_name, class_name, self->find_class);
4151 if (obj == NULL) {
4152 Py_DECREF(py_code);
4153 return -1;
4154 }
4155 /* Cache code -> obj. */
4156 code = PyDict_SetItem(extension_cache, py_code, obj);
4157 Py_DECREF(py_code);
4158 if (code < 0) {
4159 Py_DECREF(obj);
4160 return -1;
4161 }
4162 PDATA_PUSH(self->stack, obj, -1);
4163 return 0;
4164}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165
4166static int
Tim Peterscba30e22003-02-01 06:24:36 +00004167load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168{
4169 PyObject *py_str = 0, *value = 0;
4170 int len, l;
4171 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004172
Tim Peters0bc93f52003-02-02 18:29:33 +00004173 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 if (l < 2) return bad_readline();
4175 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004176 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 value=self->stack->data[len-1];
4178 l=PyDict_SetItem(self->memo, py_str, value);
4179 Py_DECREF(py_str);
4180 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181}
4182
4183
4184static int
Tim Peterscba30e22003-02-01 06:24:36 +00004185load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186{
4187 PyObject *py_key = 0, *value = 0;
4188 unsigned char key;
4189 char *s;
4190 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191
Tim Peters0bc93f52003-02-02 18:29:33 +00004192 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004195 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4198 value=self->stack->data[len-1];
4199 len=PyDict_SetItem(self->memo, py_key, value);
4200 Py_DECREF(py_key);
4201 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004202}
4203
4204
4205static int
Tim Peterscba30e22003-02-01 06:24:36 +00004206load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207{
4208 PyObject *py_key = 0, *value = 0;
4209 long key;
4210 unsigned char c;
4211 char *s;
4212 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213
Tim Peters0bc93f52003-02-02 18:29:33 +00004214 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 c = (unsigned char)s[0];
4218 key = (long)c;
4219 c = (unsigned char)s[1];
4220 key |= (long)c << 8;
4221 c = (unsigned char)s[2];
4222 key |= (long)c << 16;
4223 c = (unsigned char)s[3];
4224 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 if (!( py_key = PyInt_FromLong(key))) return -1;
4227 value=self->stack->data[len-1];
4228 len=PyDict_SetItem(self->memo, py_key, value);
4229 Py_DECREF(py_key);
4230 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231}
4232
4233
4234static int
Tim Peterscba30e22003-02-01 06:24:36 +00004235do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236{
4237 PyObject *value = 0, *list = 0, *append_method = 0;
4238 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 len=self->stack->length;
4241 if (!( len >= x && x > 0 )) return stackUnderflow();
4242 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004243 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004247 if (PyList_Check(list)) {
4248 PyObject *slice;
4249 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004252 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 list_len = PyList_GET_SIZE(list);
4254 i=PyList_SetSlice(list, list_len, list_len, slice);
4255 Py_DECREF(slice);
4256 return i;
4257 }
4258 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259
Tim Peterscba30e22003-02-01 06:24:36 +00004260 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 return -1;
4262
4263 for (i = x; i < len; i++) {
4264 PyObject *junk;
4265
4266 value=self->stack->data[i];
4267 junk=0;
4268 ARG_TUP(self, value);
4269 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004270 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271 NULL);
4272 FREE_ARG_TUP(self);
4273 }
4274 if (! junk) {
4275 Pdata_clear(self->stack, i+1);
4276 self->stack->length=x;
4277 Py_DECREF(append_method);
4278 return -1;
4279 }
4280 Py_DECREF(junk);
4281 }
4282 self->stack->length=x;
4283 Py_DECREF(append_method);
4284 }
4285
4286 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004287}
4288
4289
4290static int
Tim Peterscba30e22003-02-01 06:24:36 +00004291load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004292{
4293 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294}
4295
4296
4297static int
Tim Peterscba30e22003-02-01 06:24:36 +00004298load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299{
4300 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004301}
4302
4303
4304static int
Tim Peterscba30e22003-02-01 06:24:36 +00004305do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306{
4307 PyObject *value = 0, *key = 0, *dict = 0;
4308 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310 if (!( (len=self->stack->length) >= x
4311 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315 for (i = x+1; i < len; i += 2) {
4316 key =self->stack->data[i-1];
4317 value=self->stack->data[i ];
4318 if (PyObject_SetItem(dict, key, value) < 0) {
4319 r=-1;
4320 break;
4321 }
4322 }
4323
4324 Pdata_clear(self->stack, x);
4325
4326 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004327}
4328
4329
Tim Peters84e87f32001-03-17 04:50:51 +00004330static int
Tim Peterscba30e22003-02-01 06:24:36 +00004331load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332{
4333 return do_setitems(self, self->stack->length - 2);
4334}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336static int
Tim Peterscba30e22003-02-01 06:24:36 +00004337load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004338{
4339 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340}
4341
Tim Peters84e87f32001-03-17 04:50:51 +00004342
Guido van Rossum60456fd1997-04-09 17:36:32 +00004343static int
Tim Peterscba30e22003-02-01 06:24:36 +00004344load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345{
Tim Peters080c88b2003-02-15 03:01:11 +00004346 PyObject *state, *inst, *slotstate;
4347 PyObject *__setstate__;
4348 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004349 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004350 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351
Tim Peters080c88b2003-02-15 03:01:11 +00004352 /* Stack is ... instance, state. We want to leave instance at
4353 * the stack top, possibly mutated via instance.__setstate__(state).
4354 */
4355 if (self->stack->length < 2)
4356 return stackUnderflow();
4357 PDATA_POP(self->stack, state);
4358 if (state == NULL)
4359 return -1;
4360 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361
Tim Peters080c88b2003-02-15 03:01:11 +00004362 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4363 if (__setstate__ != NULL) {
4364 PyObject *junk = NULL;
4365
4366 /* The explicit __setstate__ is responsible for everything. */
4367 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 if (self->arg) {
4369 junk = PyObject_Call(__setstate__, self->arg, NULL);
4370 FREE_ARG_TUP(self);
4371 }
4372 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004373 if (junk == NULL)
4374 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 Py_DECREF(junk);
4376 return 0;
4377 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004378 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4379 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004381
4382 /* A default __setstate__. First see whether state embeds a
4383 * slot state dict too (a proto 2 addition).
4384 */
4385 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4386 PyObject *temp = state;
4387 state = PyTuple_GET_ITEM(temp, 0);
4388 slotstate = PyTuple_GET_ITEM(temp, 1);
4389 Py_INCREF(state);
4390 Py_INCREF(slotstate);
4391 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 }
Tim Peters080c88b2003-02-15 03:01:11 +00004393 else
4394 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395
Tim Peters080c88b2003-02-15 03:01:11 +00004396 /* Set inst.__dict__ from the state dict (if any). */
4397 if (state != Py_None) {
4398 PyObject *dict;
4399 if (! PyDict_Check(state)) {
4400 PyErr_SetString(UnpicklingError, "state is not a "
4401 "dictionary");
4402 goto finally;
4403 }
4404 dict = PyObject_GetAttr(inst, __dict___str);
4405 if (dict == NULL)
4406 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407
Tim Peters080c88b2003-02-15 03:01:11 +00004408 i = 0;
4409 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4410 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4411 goto finally;
4412 }
4413 Py_DECREF(dict);
4414 }
4415
4416 /* Also set instance attributes from the slotstate dict (if any). */
4417 if (slotstate != NULL) {
4418 if (! PyDict_Check(slotstate)) {
4419 PyErr_SetString(UnpicklingError, "slot state is not "
4420 "a dictionary");
4421 goto finally;
4422 }
4423 i = 0;
4424 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4425 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4426 goto finally;
4427 }
4428 }
4429 res = 0;
4430
4431 finally:
4432 Py_DECREF(state);
4433 Py_XDECREF(slotstate);
4434 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004435}
4436
4437
4438static int
Tim Peterscba30e22003-02-01 06:24:36 +00004439load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440{
4441 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 /* Note that we split the (pickle.py) stack into two stacks, an
4444 object stack and a mark stack. Here we push a mark onto the
4445 mark stack.
4446 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004449 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 s=self->marks_size+20;
4451 if (s <= self->num_marks) s=self->num_marks + 1;
4452 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004453 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004454 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004455 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004457 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004458 PyErr_NoMemory();
4459 return -1;
4460 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004461 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 self->marks_size = s;
4463 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468}
4469
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470static int
Tim Peterscba30e22003-02-01 06:24:36 +00004471load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472{
4473 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 PDATA_POP(self->stack, arg_tup);
4476 if (! arg_tup) return -1;
4477 PDATA_POP(self->stack, callable);
4478 if (callable) {
4479 ob = Instance_New(callable, arg_tup);
4480 Py_DECREF(callable);
4481 }
4482 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 PDATA_PUSH(self->stack, ob, -1);
4487 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488}
Tim Peters84e87f32001-03-17 04:50:51 +00004489
Tim Peters4190fb82003-02-02 16:09:05 +00004490/* Just raises an error if we don't know the protocol specified. PROTO
4491 * is the first opcode for protocols >= 2.
4492 */
4493static int
4494load_proto(Unpicklerobject *self)
4495{
4496 int i;
4497 char *protobyte;
4498
4499 i = self->read_func(self, &protobyte, 1);
4500 if (i < 0)
4501 return -1;
4502
4503 i = calc_binint(protobyte, 1);
4504 /* No point checking for < 0, since calc_binint returns an unsigned
4505 * int when chewing on 1 byte.
4506 */
4507 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004508 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004509 return 0;
4510
4511 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4512 return -1;
4513}
4514
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004516load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517{
4518 PyObject *err = 0, *val = 0;
4519 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 self->num_marks = 0;
4522 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004525 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 switch (s[0]) {
4529 case NONE:
4530 if (load_none(self) < 0)
4531 break;
4532 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 case BININT:
4535 if (load_binint(self) < 0)
4536 break;
4537 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 case BININT1:
4540 if (load_binint1(self) < 0)
4541 break;
4542 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 case BININT2:
4545 if (load_binint2(self) < 0)
4546 break;
4547 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 case INT:
4550 if (load_int(self) < 0)
4551 break;
4552 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 case LONG:
4555 if (load_long(self) < 0)
4556 break;
4557 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Tim Petersee1a53c2003-02-02 02:57:53 +00004559 case LONG1:
4560 if (load_counted_long(self, 1) < 0)
4561 break;
4562 continue;
4563
4564 case LONG4:
4565 if (load_counted_long(self, 4) < 0)
4566 break;
4567 continue;
4568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 case FLOAT:
4570 if (load_float(self) < 0)
4571 break;
4572 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 case BINFLOAT:
4575 if (load_binfloat(self) < 0)
4576 break;
4577 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 case BINSTRING:
4580 if (load_binstring(self) < 0)
4581 break;
4582 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 case SHORT_BINSTRING:
4585 if (load_short_binstring(self) < 0)
4586 break;
4587 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 case STRING:
4590 if (load_string(self) < 0)
4591 break;
4592 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004593
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004594#ifdef Py_USING_UNICODE
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;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004604#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004607 if (load_counted_tuple(self, 0) < 0)
4608 break;
4609 continue;
4610
4611 case TUPLE1:
4612 if (load_counted_tuple(self, 1) < 0)
4613 break;
4614 continue;
4615
4616 case TUPLE2:
4617 if (load_counted_tuple(self, 2) < 0)
4618 break;
4619 continue;
4620
4621 case TUPLE3:
4622 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623 break;
4624 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 case TUPLE:
4627 if (load_tuple(self) < 0)
4628 break;
4629 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 case EMPTY_LIST:
4632 if (load_empty_list(self) < 0)
4633 break;
4634 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 case LIST:
4637 if (load_list(self) < 0)
4638 break;
4639 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 case EMPTY_DICT:
4642 if (load_empty_dict(self) < 0)
4643 break;
4644 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 case DICT:
4647 if (load_dict(self) < 0)
4648 break;
4649 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 case OBJ:
4652 if (load_obj(self) < 0)
4653 break;
4654 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656 case INST:
4657 if (load_inst(self) < 0)
4658 break;
4659 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004660
Tim Peterseab7db32003-02-13 18:24:14 +00004661 case NEWOBJ:
4662 if (load_newobj(self) < 0)
4663 break;
4664 continue;
4665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 case GLOBAL:
4667 if (load_global(self) < 0)
4668 break;
4669 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 case APPEND:
4672 if (load_append(self) < 0)
4673 break;
4674 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 case APPENDS:
4677 if (load_appends(self) < 0)
4678 break;
4679 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 case BUILD:
4682 if (load_build(self) < 0)
4683 break;
4684 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 case DUP:
4687 if (load_dup(self) < 0)
4688 break;
4689 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 case BINGET:
4692 if (load_binget(self) < 0)
4693 break;
4694 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 case LONG_BINGET:
4697 if (load_long_binget(self) < 0)
4698 break;
4699 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 case GET:
4702 if (load_get(self) < 0)
4703 break;
4704 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705
Tim Peters2d629652003-02-04 05:06:17 +00004706 case EXT1:
4707 if (load_extension(self, 1) < 0)
4708 break;
4709 continue;
4710
4711 case EXT2:
4712 if (load_extension(self, 2) < 0)
4713 break;
4714 continue;
4715
4716 case EXT4:
4717 if (load_extension(self, 4) < 0)
4718 break;
4719 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case MARK:
4721 if (load_mark(self) < 0)
4722 break;
4723 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 case STOP:
4761 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +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 Rossum60456fd1997-04-09 17:36:32 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 case REDUCE:
4774 if (load_reduce(self) < 0)
4775 break;
4776 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +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;
4792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 case '\0':
4794 /* end of file */
4795 PyErr_SetNone(PyExc_EOFError);
4796 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004799 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004800 "invalid load key, '%s'.",
4801 "c", s[0]);
4802 return NULL;
4803 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004805 break;
4806 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 if ((err = PyErr_Occurred())) {
4809 if (err == PyExc_EOFError) {
4810 PyErr_SetNone(PyExc_EOFError);
4811 }
4812 return NULL;
4813 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 PDATA_POP(self->stack, val);
4816 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004817}
Tim Peters84e87f32001-03-17 04:50:51 +00004818
Guido van Rossum60456fd1997-04-09 17:36:32 +00004819
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820/* No-load functions to support noload, which is used to
4821 find persistent references. */
4822
4823static int
Tim Peterscba30e22003-02-01 06:24:36 +00004824noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825{
4826 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 if ((i = marker(self)) < 0) return -1;
4829 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004830}
4831
4832
4833static int
Tim Peterscba30e22003-02-01 06:24:36 +00004834noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835{
4836 int i;
4837 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 if ((i = marker(self)) < 0) return -1;
4840 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004841 if (self->readline_func(self, &s) < 0) return -1;
4842 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004843 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004845}
4846
4847static int
Tim Peterseab7db32003-02-13 18:24:14 +00004848noload_newobj(Unpicklerobject *self)
4849{
4850 PyObject *obj;
4851
4852 PDATA_POP(self->stack, obj); /* pop argtuple */
4853 if (obj == NULL) return -1;
4854 Py_DECREF(obj);
4855
4856 PDATA_POP(self->stack, obj); /* pop cls */
4857 if (obj == NULL) return -1;
4858 Py_DECREF(obj);
4859
4860 PDATA_APPEND(self->stack, Py_None, -1);
4861 return 0;
4862}
4863
4864static int
Tim Peterscba30e22003-02-01 06:24:36 +00004865noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004866{
4867 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004868
Tim Peters0bc93f52003-02-02 18:29:33 +00004869 if (self->readline_func(self, &s) < 0) return -1;
4870 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004871 PDATA_APPEND(self->stack, Py_None,-1);
4872 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004873}
4874
4875static int
Tim Peterscba30e22003-02-01 06:24:36 +00004876noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004877{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 if (self->stack->length < 2) return stackUnderflow();
4880 Pdata_clear(self->stack, self->stack->length-2);
4881 PDATA_APPEND(self->stack, Py_None,-1);
4882 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883}
4884
4885static int
4886noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004887
Guido van Rossum053b8df1998-11-25 16:18:00 +00004888 if (self->stack->length < 1) return stackUnderflow();
4889 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004890 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891}
4892
Tim Peters2d629652003-02-04 05:06:17 +00004893static int
4894noload_extension(Unpicklerobject *self, int nbytes)
4895{
4896 char *codebytes;
4897
4898 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4899 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4900 PDATA_APPEND(self->stack, Py_None, -1);
4901 return 0;
4902}
4903
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004904
4905static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004906noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907{
4908 PyObject *err = 0, *val = 0;
4909 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 self->num_marks = 0;
4912 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004915 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 switch (s[0]) {
4919 case NONE:
4920 if (load_none(self) < 0)
4921 break;
4922 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004924 case BININT:
4925 if (load_binint(self) < 0)
4926 break;
4927 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004929 case BININT1:
4930 if (load_binint1(self) < 0)
4931 break;
4932 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 case BININT2:
4935 if (load_binint2(self) < 0)
4936 break;
4937 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939 case INT:
4940 if (load_int(self) < 0)
4941 break;
4942 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 case LONG:
4945 if (load_long(self) < 0)
4946 break;
4947 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004948
Tim Peters4190fb82003-02-02 16:09:05 +00004949 case LONG1:
4950 if (load_counted_long(self, 1) < 0)
4951 break;
4952 continue;
4953
4954 case LONG4:
4955 if (load_counted_long(self, 4) < 0)
4956 break;
4957 continue;
4958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 case FLOAT:
4960 if (load_float(self) < 0)
4961 break;
4962 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964 case BINFLOAT:
4965 if (load_binfloat(self) < 0)
4966 break;
4967 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 case BINSTRING:
4970 if (load_binstring(self) < 0)
4971 break;
4972 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004974 case SHORT_BINSTRING:
4975 if (load_short_binstring(self) < 0)
4976 break;
4977 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 case STRING:
4980 if (load_string(self) < 0)
4981 break;
4982 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004983
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004984#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 case UNICODE:
4986 if (load_unicode(self) < 0)
4987 break;
4988 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 case BINUNICODE:
4991 if (load_binunicode(self) < 0)
4992 break;
4993 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004994#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004997 if (load_counted_tuple(self, 0) < 0)
4998 break;
4999 continue;
5000
5001 case TUPLE1:
5002 if (load_counted_tuple(self, 1) < 0)
5003 break;
5004 continue;
5005
5006 case TUPLE2:
5007 if (load_counted_tuple(self, 2) < 0)
5008 break;
5009 continue;
5010
5011 case TUPLE3:
5012 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 break;
5014 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 case TUPLE:
5017 if (load_tuple(self) < 0)
5018 break;
5019 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 case EMPTY_LIST:
5022 if (load_empty_list(self) < 0)
5023 break;
5024 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 case LIST:
5027 if (load_list(self) < 0)
5028 break;
5029 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 case EMPTY_DICT:
5032 if (load_empty_dict(self) < 0)
5033 break;
5034 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 case DICT:
5037 if (load_dict(self) < 0)
5038 break;
5039 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 case OBJ:
5042 if (noload_obj(self) < 0)
5043 break;
5044 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005046 case INST:
5047 if (noload_inst(self) < 0)
5048 break;
5049 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005050
Tim Peterseab7db32003-02-13 18:24:14 +00005051 case NEWOBJ:
5052 if (noload_newobj(self) < 0)
5053 break;
5054 continue;
5055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 case GLOBAL:
5057 if (noload_global(self) < 0)
5058 break;
5059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 case APPEND:
5062 if (load_append(self) < 0)
5063 break;
5064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 case APPENDS:
5067 if (load_appends(self) < 0)
5068 break;
5069 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 case BUILD:
5072 if (noload_build(self) < 0)
5073 break;
5074 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 case DUP:
5077 if (load_dup(self) < 0)
5078 break;
5079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 case BINGET:
5082 if (load_binget(self) < 0)
5083 break;
5084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 case LONG_BINGET:
5087 if (load_long_binget(self) < 0)
5088 break;
5089 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005091 case GET:
5092 if (load_get(self) < 0)
5093 break;
5094 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005095
Tim Peters2d629652003-02-04 05:06:17 +00005096 case EXT1:
5097 if (noload_extension(self, 1) < 0)
5098 break;
5099 continue;
5100
5101 case EXT2:
5102 if (noload_extension(self, 2) < 0)
5103 break;
5104 continue;
5105
5106 case EXT4:
5107 if (noload_extension(self, 4) < 0)
5108 break;
5109 continue;
5110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 case MARK:
5112 if (load_mark(self) < 0)
5113 break;
5114 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 case BINPUT:
5117 if (load_binput(self) < 0)
5118 break;
5119 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121 case LONG_BINPUT:
5122 if (load_long_binput(self) < 0)
5123 break;
5124 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126 case PUT:
5127 if (load_put(self) < 0)
5128 break;
5129 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 case POP:
5132 if (load_pop(self) < 0)
5133 break;
5134 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005136 case POP_MARK:
5137 if (load_pop_mark(self) < 0)
5138 break;
5139 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005141 case SETITEM:
5142 if (load_setitem(self) < 0)
5143 break;
5144 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005146 case SETITEMS:
5147 if (load_setitems(self) < 0)
5148 break;
5149 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005151 case STOP:
5152 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154 case PERSID:
5155 if (load_persid(self) < 0)
5156 break;
5157 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 case BINPERSID:
5160 if (load_binpersid(self) < 0)
5161 break;
5162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 case REDUCE:
5165 if (noload_reduce(self) < 0)
5166 break;
5167 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005168
Tim Peters4190fb82003-02-02 16:09:05 +00005169 case PROTO:
5170 if (load_proto(self) < 0)
5171 break;
5172 continue;
5173
Tim Peters3c67d792003-02-02 17:59:11 +00005174 case NEWTRUE:
5175 if (load_bool(self, Py_True) < 0)
5176 break;
5177 continue;
5178
5179 case NEWFALSE:
5180 if (load_bool(self, Py_False) < 0)
5181 break;
5182 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005183 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005184 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 "invalid load key, '%s'.",
5186 "c", s[0]);
5187 return NULL;
5188 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005190 break;
5191 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 if ((err = PyErr_Occurred())) {
5194 if (err == PyExc_EOFError) {
5195 PyErr_SetNone(PyExc_EOFError);
5196 }
5197 return NULL;
5198 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 PDATA_POP(self->stack, val);
5201 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005202}
Tim Peters84e87f32001-03-17 04:50:51 +00005203
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005204
Guido van Rossum60456fd1997-04-09 17:36:32 +00005205static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005206Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005207{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005209}
5210
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005211static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005212Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005213{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005215}
5216
Guido van Rossum60456fd1997-04-09 17:36:32 +00005217
5218static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005219 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005220 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005221 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005222 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005223 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005224 "noload() -- not load a pickle, but go through most of the motions\n"
5225 "\n"
5226 "This function can be used to read past a pickle without instantiating\n"
5227 "any objects or importing any modules. It can also be used to find all\n"
5228 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005229 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005230 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231 {NULL, NULL} /* sentinel */
5232};
5233
5234
5235static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005236newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005237{
5238 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005239
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005240 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005241 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 self->file = NULL;
5244 self->arg = NULL;
5245 self->stack = (Pdata*)Pdata_New();
5246 self->pers_func = NULL;
5247 self->last_string = NULL;
5248 self->marks = NULL;
5249 self->num_marks = 0;
5250 self->marks_size = 0;
5251 self->buf_size = 0;
5252 self->read = NULL;
5253 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005255
Tim Peterscba30e22003-02-01 06:24:36 +00005256 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005257 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005258
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005259 if (!self->stack)
5260 goto err;
5261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005262 Py_INCREF(f);
5263 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 /* Set read, readline based on type of f */
5266 if (PyFile_Check(f)) {
5267 self->fp = PyFile_AsFile(f);
5268 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005269 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005270 "I/O operation on closed file");
5271 goto err;
5272 }
5273 self->read_func = read_file;
5274 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005275 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005276 else if (PycStringIO_InputCheck(f)) {
5277 self->fp = NULL;
5278 self->read_func = read_cStringIO;
5279 self->readline_func = readline_cStringIO;
5280 }
5281 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005283 self->fp = NULL;
5284 self->read_func = read_other;
5285 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5288 (self->read = PyObject_GetAttr(f, read_str)))) {
5289 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005290 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005291 "argument must have 'read' and "
5292 "'readline' attributes" );
5293 goto err;
5294 }
5295 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005296 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005300 err:
5301 Py_DECREF((PyObject *)self);
5302 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005303}
5304
5305
5306static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005307get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005309 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005310}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005311
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005312
Guido van Rossum60456fd1997-04-09 17:36:32 +00005313static void
Tim Peterscba30e22003-02-01 06:24:36 +00005314Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005316 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005317 Py_XDECREF(self->readline);
5318 Py_XDECREF(self->read);
5319 Py_XDECREF(self->file);
5320 Py_XDECREF(self->memo);
5321 Py_XDECREF(self->stack);
5322 Py_XDECREF(self->pers_func);
5323 Py_XDECREF(self->arg);
5324 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005325 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005327 if (self->marks) {
5328 free(self->marks);
5329 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 if (self->buf_size) {
5332 free(self->buf);
5333 }
Tim Peters84e87f32001-03-17 04:50:51 +00005334
Christian Heimese93237d2007-12-19 02:37:44 +00005335 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005336}
5337
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005338static int
5339Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5340{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005341 Py_VISIT(self->readline);
5342 Py_VISIT(self->read);
5343 Py_VISIT(self->file);
5344 Py_VISIT(self->memo);
5345 Py_VISIT(self->stack);
5346 Py_VISIT(self->pers_func);
5347 Py_VISIT(self->arg);
5348 Py_VISIT(self->last_string);
5349 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005350 return 0;
5351}
5352
5353static int
5354Unpickler_clear(Unpicklerobject *self)
5355{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005356 Py_CLEAR(self->readline);
5357 Py_CLEAR(self->read);
5358 Py_CLEAR(self->file);
5359 Py_CLEAR(self->memo);
5360 Py_CLEAR(self->stack);
5361 Py_CLEAR(self->pers_func);
5362 Py_CLEAR(self->arg);
5363 Py_CLEAR(self->last_string);
5364 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005365 return 0;
5366}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005367
5368static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005369Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005370{
5371 if (!strcmp(name, "persistent_load")) {
5372 if (!self->pers_func) {
5373 PyErr_SetString(PyExc_AttributeError, name);
5374 return NULL;
5375 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005377 Py_INCREF(self->pers_func);
5378 return self->pers_func;
5379 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005381 if (!strcmp(name, "find_global")) {
5382 if (!self->find_class) {
5383 PyErr_SetString(PyExc_AttributeError, name);
5384 return NULL;
5385 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005387 Py_INCREF(self->find_class);
5388 return self->find_class;
5389 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 if (!strcmp(name, "memo")) {
5392 if (!self->memo) {
5393 PyErr_SetString(PyExc_AttributeError, name);
5394 return NULL;
5395 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 Py_INCREF(self->memo);
5398 return self->memo;
5399 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005401 if (!strcmp(name, "UnpicklingError")) {
5402 Py_INCREF(UnpicklingError);
5403 return UnpicklingError;
5404 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005408
Guido van Rossum60456fd1997-04-09 17:36:32 +00005409
5410static int
Tim Peterscba30e22003-02-01 06:24:36 +00005411Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005412{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 if (!strcmp(name, "persistent_load")) {
5415 Py_XDECREF(self->pers_func);
5416 self->pers_func = value;
5417 Py_XINCREF(value);
5418 return 0;
5419 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005421 if (!strcmp(name, "find_global")) {
5422 Py_XDECREF(self->find_class);
5423 self->find_class = value;
5424 Py_XINCREF(value);
5425 return 0;
5426 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 if (! value) {
5429 PyErr_SetString(PyExc_TypeError,
5430 "attribute deletion is not supported");
5431 return -1;
5432 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005434 if (strcmp(name, "memo") == 0) {
5435 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005436 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005437 "memo must be a dictionary");
5438 return -1;
5439 }
5440 Py_XDECREF(self->memo);
5441 self->memo = value;
5442 Py_INCREF(value);
5443 return 0;
5444 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 PyErr_SetString(PyExc_AttributeError, name);
5447 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005448}
5449
Tim Peters5bd2a792003-02-01 16:45:06 +00005450/* ---------------------------------------------------------------------------
5451 * Module-level functions.
5452 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005453
Martin v. Löwis544f1192004-07-27 05:22:33 +00005454/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005455static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005456cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005457{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005458 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 PyObject *ob, *file, *res = NULL;
5460 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005461 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005462
Martin v. Löwis544f1192004-07-27 05:22:33 +00005463 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5464 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005466
Tim Peters5bd2a792003-02-01 16:45:06 +00005467 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 if (dump(pickler, ob) < 0)
5471 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 Py_INCREF(Py_None);
5474 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 finally:
5477 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005480}
5481
5482
Martin v. Löwis544f1192004-07-27 05:22:33 +00005483/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005484static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005485cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005486{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005487 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005488 PyObject *ob, *file = 0, *res = NULL;
5489 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005490 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005491
Martin v. Löwis544f1192004-07-27 05:22:33 +00005492 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5493 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005495
Tim Peterscba30e22003-02-01 06:24:36 +00005496 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005498
Tim Peters5bd2a792003-02-01 16:45:06 +00005499 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005500 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005502 if (dump(pickler, ob) < 0)
5503 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005505 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005507 finally:
5508 Py_XDECREF(pickler);
5509 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005511 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005512}
5513
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005514
Tim Peters5bd2a792003-02-01 16:45:06 +00005515/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005516static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005517cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005518{
5519 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005520 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005521
Tim Peterscba30e22003-02-01 06:24:36 +00005522 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005523 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005525 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005527 finally:
5528 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005530 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005531}
5532
5533
Tim Peters5bd2a792003-02-01 16:45:06 +00005534/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005535static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005536cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005537{
5538 PyObject *ob, *file = 0, *res = NULL;
5539 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005540
Tim Peterscba30e22003-02-01 06:24:36 +00005541 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005542 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005543
Tim Peterscba30e22003-02-01 06:24:36 +00005544 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005545 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005546
Tim Peterscba30e22003-02-01 06:24:36 +00005547 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005550 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005552 finally:
5553 Py_XDECREF(file);
5554 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005556 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005557}
5558
5559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005560PyDoc_STRVAR(Unpicklertype__doc__,
5561"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005562
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005563static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005564 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005565 "cPickle.Unpickler", /*tp_name*/
5566 sizeof(Unpicklerobject), /*tp_basicsize*/
5567 0,
5568 (destructor)Unpickler_dealloc, /* tp_dealloc */
5569 0, /* tp_print */
5570 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5571 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5572 0, /* tp_compare */
5573 0, /* tp_repr */
5574 0, /* tp_as_number */
5575 0, /* tp_as_sequence */
5576 0, /* tp_as_mapping */
5577 0, /* tp_hash */
5578 0, /* tp_call */
5579 0, /* tp_str */
5580 0, /* tp_getattro */
5581 0, /* tp_setattro */
5582 0, /* tp_as_buffer */
5583 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5584 Unpicklertype__doc__, /* tp_doc */
5585 (traverseproc)Unpickler_traverse, /* tp_traverse */
5586 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005587};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005588
Guido van Rossum60456fd1997-04-09 17:36:32 +00005589static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005590 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5591 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005592 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005593 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005594 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005595 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005596
Martin v. Löwis544f1192004-07-27 05:22:33 +00005597 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5598 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005599 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005600 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005601 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005602 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005603
Georg Brandl96a8c392006-05-29 21:04:52 +00005604 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005605 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005606
Neal Norwitzb0493252002-03-31 14:44:22 +00005607 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005608 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005609
Martin v. Löwis544f1192004-07-27 05:22:33 +00005610 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5611 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005612 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005613 "This takes a file-like object for writing a pickle data stream.\n"
5614 "The optional proto argument tells the pickler to use the given\n"
5615 "protocol; supported protocols are 0, 1, 2. The default\n"
5616 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5617 "only protocol that can be written to a file opened in text\n"
5618 "mode and read back successfully. When using a protocol higher\n"
5619 "than 0, make sure the file is opened in binary mode, both when\n"
5620 "pickling and unpickling.)\n"
5621 "\n"
5622 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5623 "more efficient than protocol 1.\n"
5624 "\n"
5625 "Specifying a negative protocol version selects the highest\n"
5626 "protocol version supported. The higher the protocol used, the\n"
5627 "more recent the version of Python needed to read the pickle\n"
5628 "produced.\n"
5629 "\n"
5630 "The file parameter must have a write() method that accepts a single\n"
5631 "string argument. It can thus be an open file object, a StringIO\n"
5632 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005633 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005634
Georg Brandl96a8c392006-05-29 21:04:52 +00005635 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005636 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5637
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005638 { NULL, NULL }
5639};
5640
Guido van Rossum60456fd1997-04-09 17:36:32 +00005641static int
Tim Peterscba30e22003-02-01 06:24:36 +00005642init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005643{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005644 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005645
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005646#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005647
Tim Peters3cfe7542003-05-21 21:29:48 +00005648 if (PyType_Ready(&Unpicklertype) < 0)
5649 return -1;
5650 if (PyType_Ready(&Picklertype) < 0)
5651 return -1;
5652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005653 INIT_STR(__class__);
5654 INIT_STR(__getinitargs__);
5655 INIT_STR(__dict__);
5656 INIT_STR(__getstate__);
5657 INIT_STR(__setstate__);
5658 INIT_STR(__name__);
5659 INIT_STR(__main__);
5660 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005661 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005662 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005663 INIT_STR(append);
5664 INIT_STR(read);
5665 INIT_STR(readline);
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005666 INIT_STR(copyreg);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005667 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005668
Georg Brandldffbf5f2008-05-20 07:49:57 +00005669 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005670 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005671
Tim Peters1f1b2d22003-02-01 02:16:37 +00005672 /* This is special because we want to use a different
5673 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005674 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005675 if (!dispatch_table) return -1;
5676
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005677 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005678 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005679 if (!extension_registry) return -1;
5680
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005681 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005682 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005683 if (!inverted_registry) return -1;
5684
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005685 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005686 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005687 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005688
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005689 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005690
Tim Peters731098b2003-02-04 20:56:09 +00005691 if (!(empty_tuple = PyTuple_New(0)))
5692 return -1;
5693
5694 two_tuple = PyTuple_New(2);
5695 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005696 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005697 /* We use this temp container with no regard to refcounts, or to
5698 * keeping containees alive. Exempt from GC, because we don't
5699 * want anything looking at two_tuple() by magic.
5700 */
5701 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005703 /* Ugh */
5704 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5705 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5706 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005708 if (!( t=PyDict_New())) return -1;
5709 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005710 "def __str__(self):\n"
5711 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5712 Py_file_input,
5713 module_dict, t) )) return -1;
5714 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005716 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005717 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005718 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005720 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005721
Tim Peterscba30e22003-02-01 06:24:36 +00005722 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005723 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005724 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005725 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 if (!( t=PyDict_New())) return -1;
5728 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005729 "def __str__(self):\n"
5730 " a=self.args\n"
5731 " a=a and type(a[0]) or '(what)'\n"
5732 " return 'Cannot pickle %s objects' % a\n"
5733 , Py_file_input,
5734 module_dict, t) )) return -1;
5735 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005737 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005738 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005739 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005741 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005743 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005744 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005745 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005746
Martin v. Löwis658009a2002-09-16 17:26:24 +00005747 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5748 UnpicklingError, NULL)))
5749 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005751 if (PyDict_SetItemString(module_dict, "PickleError",
5752 PickleError) < 0)
5753 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005755 if (PyDict_SetItemString(module_dict, "PicklingError",
5756 PicklingError) < 0)
5757 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005759 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5760 UnpicklingError) < 0)
5761 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005763 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5764 UnpickleableError) < 0)
5765 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005767 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5768 BadPickleGet) < 0)
5769 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005771 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005773 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005774}
5775
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005776#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5777#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005778#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005779PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005780initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005781{
5782 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005783 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005784 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005785 PyObject *format_version;
5786 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005787
Alexandre Vassalotti3c4971c2008-05-16 19:14:31 +00005788 /* XXX: Should mention that the pickle module will include the C
5789 XXX: optimized implementation automatically. */
5790 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5791 "Python 3.0", 2) < 0)
5792 return;
5793
Christian Heimese93237d2007-12-19 02:37:44 +00005794 Py_TYPE(&Picklertype) = &PyType_Type;
5795 Py_TYPE(&Unpicklertype) = &PyType_Type;
5796 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005798 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005799 * so we're forced to use a temporary dictionary. :(
5800 */
5801 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005802 if (!di) return;
5803 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005805 /* Create the module and add the functions */
5806 m = Py_InitModule4("cPickle", cPickle_methods,
5807 cPickle_module_documentation,
5808 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005809 if (m == NULL)
5810 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005812 /* Add some symbolic constants to the module */
5813 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005814 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005815 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005816 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005818 /* Copy data from di. Waaa. */
5819 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5820 if (PyObject_SetItem(d, k, v) < 0) {
5821 Py_DECREF(di);
5822 return;
5823 }
5824 }
5825 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005826
Tim Peters8587b3c2003-02-13 15:44:41 +00005827 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5828 if (i < 0)
5829 return;
5830
Tim Peters5b7da392003-02-04 00:21:07 +00005831 /* These are purely informational; no code uses them. */
5832 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005833 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00005834 /* Format versions we can read. */
5835 compatible_formats = Py_BuildValue("[sssss]",
5836 "1.0", /* Original protocol 0 */
5837 "1.1", /* Protocol 0 + INST */
5838 "1.2", /* Original protocol 1 */
5839 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005840 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005841 PyDict_SetItemString(d, "format_version", format_version);
5842 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5843 Py_XDECREF(format_version);
5844 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005845}