blob: 79eebcaa256909aab3adfff75e97ee5e1b6894cd [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/*
Martin v. Löwis9ac49272009-01-02 20:40:14 +000021 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
22 * all headers have already been included here, we can safely redefine it.
23 */
24#ifdef UNICODE
25# undef UNICODE
26#endif
27
28/*
Tim Peters797ec242003-02-01 06:22:36 +000029 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
30 * docs are in pickletools.py.
31 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000032#define MARK '('
33#define STOP '.'
34#define POP '0'
35#define POP_MARK '1'
36#define DUP '2'
37#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000038#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000039#define INT 'I'
40#define BININT 'J'
41#define BININT1 'K'
42#define LONG 'L'
43#define BININT2 'M'
44#define NONE 'N'
45#define PERSID 'P'
46#define BINPERSID 'Q'
47#define REDUCE 'R'
48#define STRING 'S'
49#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000050#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000051#define UNICODE 'V'
52#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000053#define APPEND 'a'
54#define BUILD 'b'
55#define GLOBAL 'c'
56#define DICT 'd'
57#define EMPTY_DICT '}'
58#define APPENDS 'e'
59#define GET 'g'
60#define BINGET 'h'
61#define INST 'i'
62#define LONG_BINGET 'j'
63#define LIST 'l'
64#define EMPTY_LIST ']'
65#define OBJ 'o'
66#define PUT 'p'
67#define BINPUT 'q'
68#define LONG_BINPUT 'r'
69#define SETITEM 's'
70#define TUPLE 't'
71#define EMPTY_TUPLE ')'
72#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000073
74/* Protocol 2. */
75#define PROTO '\x80' /* identify pickle protocol */
76#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
77#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
78#define EXT2 '\x83' /* ditto, but 2-byte index */
79#define EXT4 '\x84' /* ditto, but 4-byte index */
80#define TUPLE1 '\x85' /* build 1-tuple from stack top */
81#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
82#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
83#define NEWTRUE '\x88' /* push True */
84#define NEWFALSE '\x89' /* push False */
85#define LONG1 '\x8a' /* push long from < 256 bytes */
86#define LONG4 '\x8b' /* push really big long */
87
88/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
89 * so that unpicklers written before bools were introduced unpickle them
90 * as ints, but unpicklers after can recognize that bools were intended.
91 * Note that protocol 2 added direct ways to pickle bools.
92 */
Jack Jansen3a967022002-06-26 20:40:42 +000093#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000094#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000095#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000096#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000097
Tim Peters1092d642003-02-11 21:06:20 +000098/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000099 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
100 * break if this gets out of synch with pickle.py, but it's unclear that
101 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +0000102 */
103#define BATCHSIZE 1000
104
Guido van Rossum60456fd1997-04-09 17:36:32 +0000105static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000106
Guido van Rossumc03158b1999-06-09 15:23:31 +0000107static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000108static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000109static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000110static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111static PyObject *BadPickleGet;
112
Tim Peters5b7da392003-02-04 00:21:07 +0000113/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000114static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000115
Georg Brandldffbf5f2008-05-20 07:49:57 +0000116/* copy_reg.dispatch_table, {type_object: pickling_function} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *dispatch_table;
118
119/* For EXT[124] opcodes. */
Georg Brandldffbf5f2008-05-20 07:49:57 +0000120/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000121static PyObject *extension_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000122/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000123static PyObject *inverted_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000124/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000125static PyObject *extension_cache;
126
Georg Brandldffbf5f2008-05-20 07:49:57 +0000127/* For looking up name pairs in copy_reg._extension_registry. */
Tim Peters731098b2003-02-04 20:56:09 +0000128static PyObject *two_tuple;
129
Guido van Rossum60456fd1997-04-09 17:36:32 +0000130static PyObject *__class___str, *__getinitargs___str, *__dict___str,
131 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000132 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000133 *write_str, *append_str,
Neal Norwitzb183a252006-04-10 01:03:32 +0000134 *read_str, *readline_str, *__main___str,
Alexandre Vassalotti8b2d7132009-11-24 17:53:23 +0000135 *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000136
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137/*************************************************************************
138 Internal Data type for pickle data. */
139
140typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000142 int length; /* number of initial slots in data currently used */
143 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000144 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000145} Pdata;
146
Tim Peters84e87f32001-03-17 04:50:51 +0000147static void
Tim Peterscba30e22003-02-01 06:24:36 +0000148Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149{
150 int i;
151 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000152
Tim Peters1d63c9f2003-02-02 20:29:39 +0000153 for (i = self->length, p = self->data; --i >= 0; p++) {
154 Py_DECREF(*p);
155 }
156 if (self->data)
157 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000158 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000159}
160
161static PyTypeObject PdataType = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000162 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163 (destructor)Pdata_dealloc,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165};
166
Christian Heimese93237d2007-12-19 02:37:44 +0000167#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168
169static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000170Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171{
172 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173
Tim Peters1d63c9f2003-02-02 20:29:39 +0000174 if (!(self = PyObject_New(Pdata, &PdataType)))
175 return NULL;
176 self->size = 8;
177 self->length = 0;
178 self->data = malloc(self->size * sizeof(PyObject*));
179 if (self->data)
180 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000181 Py_DECREF(self);
182 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000183}
184
Tim Peters84e87f32001-03-17 04:50:51 +0000185static int
Tim Peterscba30e22003-02-01 06:24:36 +0000186stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000187{
188 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
189 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000190}
191
Tim Peters1d63c9f2003-02-02 20:29:39 +0000192/* Retain only the initial clearto items. If clearto >= the current
193 * number of items, this is a (non-erroneous) NOP.
194 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195static int
Tim Peterscba30e22003-02-01 06:24:36 +0000196Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000197{
198 int i;
199 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000201 if (clearto < 0) return stackUnderflow();
202 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000203
Tim Peters1d63c9f2003-02-02 20:29:39 +0000204 for (i = self->length, p = self->data + clearto;
205 --i >= clearto;
206 p++) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000207 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000208 }
209 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000211 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000212}
213
Tim Peters84e87f32001-03-17 04:50:51 +0000214static int
Tim Peterscba30e22003-02-01 06:24:36 +0000215Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000216{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000217 int bigger;
218 size_t nbytes;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000219 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000220
Tim Peters1d63c9f2003-02-02 20:29:39 +0000221 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000222 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
224 if ((int)(size_t)bigger != bigger)
225 goto nomemory;
226 nbytes = (size_t)bigger * sizeof(PyObject *);
227 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
228 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000229 tmp = realloc(self->data, nbytes);
230 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000231 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000232 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000233 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000234 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235
236 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000237 PyErr_NoMemory();
238 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000239}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000240
Tim Peterse0a39072003-02-03 15:45:56 +0000241/* D is a Pdata*. Pop the topmost element and store it into V, which
242 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000243 * is raised and V is set to NULL. D and V may be evaluated several times.
244 */
245#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000246 if ((D)->length) \
247 (V) = (D)->data[--((D)->length)]; \
248 else { \
249 PyErr_SetString(UnpicklingError, "bad pickle data"); \
250 (V) = NULL; \
251 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000252}
253
Tim Peterse0a39072003-02-03 15:45:56 +0000254/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
255 * D. If the Pdata stack can't be grown to hold the new value, both
256 * raise MemoryError and execute "return ER". The difference is in ownership
257 * of O after: _PUSH transfers ownership of O from the caller to the stack
258 * (no incref of O is done, and in case of error O is decrefed), while
259 * _APPEND pushes a new reference.
260 */
261
262/* Push O on stack D, giving ownership of O to the stack. */
263#define PDATA_PUSH(D, O, ER) { \
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
265 Pdata_grow((Pdata*)(D)) < 0) { \
266 Py_DECREF(O); \
267 return ER; \
268 } \
269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
270}
271
272/* Push O on stack D, pushing a new reference. */
273#define PDATA_APPEND(D, O, ER) { \
274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
275 Pdata_grow((Pdata*)(D)) < 0) \
276 return ER; \
277 Py_INCREF(O); \
278 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
279}
280
281
Guido van Rossum053b8df1998-11-25 16:18:00 +0000282static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000283Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284{
285 PyObject *r;
286 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000287
Tim Peters1d63c9f2003-02-02 20:29:39 +0000288 l = self->length-start;
289 r = PyTuple_New(l);
290 if (r == NULL)
291 return NULL;
292 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000294
Tim Peters1d63c9f2003-02-02 20:29:39 +0000295 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000296 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000297}
298
299static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000300Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301{
302 PyObject *r;
303 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000305 l=self->length-start;
306 if (!( r=PyList_New(l))) return NULL;
307 for (i=start, j=0 ; j < l; i++, j++)
308 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000310 self->length=start;
311 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000312}
313
Guido van Rossum053b8df1998-11-25 16:18:00 +0000314/*************************************************************************/
315
316#define ARG_TUP(self, o) { \
317 if (self->arg || (self->arg=PyTuple_New(1))) { \
318 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
319 PyTuple_SET_ITEM(self->arg,0,o); \
320 } \
321 else { \
322 Py_DECREF(o); \
323 } \
324}
325
326#define FREE_ARG_TUP(self) { \
Christian Heimese93237d2007-12-19 02:37:44 +0000327 if (Py_REFCNT(self->arg) > 1) { \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000328 Py_DECREF(self->arg); \
329 self->arg=NULL; \
330 } \
331 }
332
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000333typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000334 PyObject_HEAD
335 FILE *fp;
336 PyObject *write;
337 PyObject *file;
338 PyObject *memo;
339 PyObject *arg;
340 PyObject *pers_func;
341 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000342
343 /* pickle protocol number, >= 0 */
344 int proto;
345
346 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000347 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000349 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000350 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000351 char *write_buf;
352 int buf_size;
353 PyObject *dispatch_table;
354 int fast_container; /* count nested container dumps */
355 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356} Picklerobject;
357
Barry Warsaw52acb492001-12-21 20:04:22 +0000358#ifndef PY_CPICKLE_FAST_LIMIT
359#define PY_CPICKLE_FAST_LIMIT 50
360#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000361
Jeremy Hylton938ace62002-07-17 16:30:39 +0000362static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000363
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000364typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000365 PyObject_HEAD
366 FILE *fp;
367 PyObject *file;
368 PyObject *readline;
369 PyObject *read;
370 PyObject *memo;
371 PyObject *arg;
372 Pdata *stack;
373 PyObject *mark;
374 PyObject *pers_func;
375 PyObject *last_string;
376 int *marks;
377 int num_marks;
378 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000379 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
380 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000381 int buf_size;
382 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000384} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000385
Jeremy Hylton938ace62002-07-17 16:30:39 +0000386static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000387
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000388/* Forward decls that need the above structs */
389static int save(Picklerobject *, PyObject *, int);
390static int put2(Picklerobject *, PyObject *);
391
Guido van Rossumd385d591997-04-09 17:47:47 +0000392static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000394cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
395{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000396 va_list va;
397 PyObject *args=0, *retval=0;
398 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000400 if (format) args = Py_VaBuildValue(format, va);
401 va_end(va);
402 if (format && ! args) return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000406 if (retval) {
407 if (args) {
408 PyObject *v;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000409 v=PyString_Format(retval, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410 Py_DECREF(retval);
411 Py_DECREF(args);
412 if (! v) return NULL;
413 retval=v;
414 }
415 }
416 else
417 if (args) retval=args;
418 else {
419 PyErr_SetObject(ErrType,Py_None);
420 return NULL;
421 }
422 PyErr_SetObject(ErrType,retval);
423 Py_DECREF(retval);
424 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000425}
426
Tim Peters84e87f32001-03-17 04:50:51 +0000427static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000428write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429{
430 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000432 if (s == NULL) {
433 return 0;
434 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000435
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436 if (n > INT_MAX) {
437 /* String too large */
438 return -1;
439 }
440
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000441 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000442 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000443 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000445 PyFile_DecUseCount((PyFileObject *)self->file);
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000446 if (nbyteswritten != (size_t)n) {
447 PyErr_SetFromErrno(PyExc_IOError);
448 return -1;
449 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450
Martin v. Löwis18e16552006-02-15 17:27:45 +0000451 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000452}
453
Tim Peters84e87f32001-03-17 04:50:51 +0000454static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000455write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456{
457 if (s == NULL) {
458 return 0;
459 }
Tim Peterscba30e22003-02-01 06:24:36 +0000460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
462 return -1;
463 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464
Martin v. Löwis18e16552006-02-15 17:27:45 +0000465 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466}
467
Tim Peters84e87f32001-03-17 04:50:51 +0000468static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000469write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470{
471 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000472 if (n > INT_MAX) return -1;
473 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000474}
475
Tim Peters84e87f32001-03-17 04:50:51 +0000476static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000477write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000478{
479 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000480 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000481
Martin v. Löwis18e16552006-02-15 17:27:45 +0000482 if (_n > INT_MAX)
483 return -1;
484 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000485 if (s == NULL) {
486 if (!( self->buf_size )) return 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000487 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000488 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000489 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000490 return -1;
491 }
492 else {
493 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
494 if (write_other(self, NULL, 0) < 0)
495 return -1;
496 }
Tim Peterscba30e22003-02-01 06:24:36 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 if (n > WRITE_BUF_SIZE) {
499 if (!( py_str =
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000500 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 return -1;
502 }
503 else {
504 memcpy(self->write_buf + self->buf_size, s, n);
505 self->buf_size += n;
506 return n;
507 }
508 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 if (self->write) {
511 /* object with write method */
512 ARG_TUP(self, py_str);
513 if (self->arg) {
514 junk = PyObject_Call(self->write, self->arg, NULL);
515 FREE_ARG_TUP(self);
516 }
517 if (junk) Py_DECREF(junk);
518 else return -1;
519 }
520 else
521 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 self->buf_size = 0;
524 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000525}
526
527
Martin v. Löwis18e16552006-02-15 17:27:45 +0000528static Py_ssize_t
529read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530{
531 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 if (self->buf_size == 0) {
534 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000536 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000537 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = size;
543 }
544 else if (n > self->buf_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000545 char *newbuf = (char *)realloc(self->buf, n);
546 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 PyErr_NoMemory();
548 return -1;
549 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000550 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 self->buf_size = n;
552 }
Tim Peters84e87f32001-03-17 04:50:51 +0000553
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000554 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555 Py_BEGIN_ALLOW_THREADS
556 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
557 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000558 PyFile_DecUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 if (nbytesread != (size_t)n) {
560 if (feof(self->fp)) {
561 PyErr_SetNone(PyExc_EOFError);
562 return -1;
563 }
Tim Peterscba30e22003-02-01 06:24:36 +0000564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565 PyErr_SetFromErrno(PyExc_IOError);
566 return -1;
567 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000572}
573
574
Martin v. Löwis18e16552006-02-15 17:27:45 +0000575static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000576readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577{
578 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000581 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 PyErr_NoMemory();
583 return -1;
584 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 self->buf_size = 40;
586 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 i = 0;
589 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000590 int bigger;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000591 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000593 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 (self->buf[i] = getc(self->fp)) == '\n') {
595 self->buf[i + 1] = '\0';
596 *s = self->buf;
597 return i + 1;
598 }
599 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 bigger = self->buf_size << 1;
601 if (bigger <= 0) { /* overflow */
602 PyErr_NoMemory();
603 return -1;
604 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000605 newbuf = (char *)realloc(self->buf, bigger);
606 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 PyErr_NoMemory();
608 return -1;
609 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000610 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000611 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 }
Tim Peters84e87f32001-03-17 04:50:51 +0000613}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
615
Martin v. Löwis18e16552006-02-15 17:27:45 +0000616static Py_ssize_t
617read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618{
619 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
622 PyErr_SetNone(PyExc_EOFError);
623 return -1;
624 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629}
630
631
Martin v. Löwis18e16552006-02-15 17:27:45 +0000632static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000633readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000635 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000638 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
639 return -1;
640 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645}
646
647
Martin v. Löwis18e16552006-02-15 17:27:45 +0000648static Py_ssize_t
649read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650{
651 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652
Martin v. Löwis18e16552006-02-15 17:27:45 +0000653 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 ARG_TUP(self, bytes);
656 if (self->arg) {
657 str = PyObject_Call(self->read, self->arg, NULL);
658 FREE_ARG_TUP(self);
659 }
660 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 Py_XDECREF(self->last_string);
663 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000665 if (! (*s = PyString_AsString(str))) return -1;
Amaury Forgeot d'Arc74b30162009-07-23 19:26:02 +0000666
667 if (PyString_GET_SIZE(str) != n) {
668 PyErr_SetNone(PyExc_EOFError);
669 return -1;
670 }
671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673}
674
675
Martin v. Löwis18e16552006-02-15 17:27:45 +0000676static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000677readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678{
679 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000680 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000682 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
683 return -1;
684 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000686 if ((str_size = PyString_Size(str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 Py_XDECREF(self->last_string);
690 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000692 if (! (*s = PyString_AsString(str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000696}
697
Tim Petersee1a53c2003-02-02 02:57:53 +0000698/* Copy the first n bytes from s into newly malloc'ed memory, plus a
699 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
700 * The caller is responsible for free()'ing the return value.
701 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000702static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000703pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704{
Tim Petersee1a53c2003-02-02 02:57:53 +0000705 char *r = (char *)malloc(n+1);
706 if (r == NULL)
707 return (char*)PyErr_NoMemory();
708 memcpy(r, s, n);
709 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711}
712
713
714static int
Tim Peterscba30e22003-02-01 06:24:36 +0000715get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716{
717 PyObject *value, *mv;
718 long c_value;
719 char s[30];
720 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 if (!( mv = PyDict_GetItem(self->memo, id))) {
723 PyErr_SetObject(PyExc_KeyError, id);
724 return -1;
725 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Tim Peterscba30e22003-02-01 06:24:36 +0000727 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 if (!( PyInt_Check(value))) {
731 PyErr_SetString(PicklingError, "no int where int expected in memo");
732 return -1;
733 }
734 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 if (!self->bin) {
737 s[0] = GET;
738 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
739 len = strlen(s);
740 }
741 else if (Pdata_Check(self->file)) {
742 if (write_other(self, NULL, 0) < 0) return -1;
743 PDATA_APPEND(self->file, mv, -1);
744 return 0;
745 }
746 else {
747 if (c_value < 256) {
748 s[0] = BINGET;
749 s[1] = (int)(c_value & 0xff);
750 len = 2;
751 }
752 else {
753 s[0] = LONG_BINGET;
754 s[1] = (int)(c_value & 0xff);
755 s[2] = (int)((c_value >> 8) & 0xff);
756 s[3] = (int)((c_value >> 16) & 0xff);
757 s[4] = (int)((c_value >> 24) & 0xff);
758 len = 5;
759 }
760 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000761
Tim Peters0bc93f52003-02-02 18:29:33 +0000762 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000764
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000765 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000766}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000767
Guido van Rossum60456fd1997-04-09 17:36:32 +0000768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769static int
Tim Peterscba30e22003-02-01 06:24:36 +0000770put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771{
Christian Heimese93237d2007-12-19 02:37:44 +0000772 if (Py_REFCNT(ob) < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 return put2(self, ob);
776}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000777
Guido van Rossum053b8df1998-11-25 16:18:00 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779static int
Tim Peterscba30e22003-02-01 06:24:36 +0000780put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000781{
782 char c_str[30];
783 int p;
784 size_t len;
785 int res = -1;
786 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 if (self->fast)
789 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 if ((p = PyDict_Size(self->memo)) < 0)
792 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000795 /* XXX Why?
796 * XXX And does "positive" really mean non-negative?
797 * XXX pickle.py starts with PUT index 0, not 1. This makes for
798 * XXX gratuitous differences between the pickling modules.
799 */
Tim Peterscba30e22003-02-01 06:24:36 +0000800 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000801
Tim Peterscba30e22003-02-01 06:24:36 +0000802 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000804
Tim Peterscba30e22003-02-01 06:24:36 +0000805 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000806 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000807
Tim Peterscba30e22003-02-01 06:24:36 +0000808 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000809 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000811 PyTuple_SET_ITEM(t, 0, memo_len);
812 Py_INCREF(memo_len);
813 PyTuple_SET_ITEM(t, 1, ob);
814 Py_INCREF(ob);
815
816 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
817 goto finally;
818
819 if (!self->bin) {
820 c_str[0] = PUT;
821 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
822 len = strlen(c_str);
823 }
824 else if (Pdata_Check(self->file)) {
825 if (write_other(self, NULL, 0) < 0) return -1;
826 PDATA_APPEND(self->file, memo_len, -1);
827 res=0; /* Job well done ;) */
828 goto finally;
829 }
830 else {
831 if (p >= 256) {
832 c_str[0] = LONG_BINPUT;
833 c_str[1] = (int)(p & 0xff);
834 c_str[2] = (int)((p >> 8) & 0xff);
835 c_str[3] = (int)((p >> 16) & 0xff);
836 c_str[4] = (int)((p >> 24) & 0xff);
837 len = 5;
838 }
839 else {
840 c_str[0] = BINPUT;
841 c_str[1] = p;
842 len = 2;
843 }
844 }
845
Tim Peters0bc93f52003-02-02 18:29:33 +0000846 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 goto finally;
848
849 res = 0;
850
851 finally:
852 Py_XDECREF(py_ob_id);
853 Py_XDECREF(memo_len);
854 Py_XDECREF(t);
855
856 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000857}
858
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000859static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000860whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000862 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 PyObject *module = 0, *modules_dict = 0,
864 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 module = PyObject_GetAttrString(global, "__module__");
Brett Cannone894e932010-05-04 00:30:17 +0000867 if (module)
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000868 return module;
869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
870 PyErr_Clear();
871 else
872 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000873
Tim Peterscba30e22003-02-01 06:24:36 +0000874 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 i = 0;
878 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 global_name_attr = PyObject_GetAttr(module, global_name);
883 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000884 if (PyErr_ExceptionMatches(PyExc_AttributeError))
885 PyErr_Clear();
886 else
887 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 continue;
889 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 if (global_name_attr != global) {
892 Py_DECREF(global_name_attr);
893 continue;
894 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 break;
899 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 /* The following implements the rule in pickle.py added in 1.5
902 that used __main__ if no module is found. I don't actually
903 like this rule. jlf
904 */
905 if (!j) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000906 name=__main___str;
907 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000909 Py_INCREF(name);
910 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000911}
912
913
Guido van Rossum60456fd1997-04-09 17:36:32 +0000914static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000915fast_save_enter(Picklerobject *self, PyObject *obj)
916{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 /* if fast_container < 0, we're doing an error exit. */
918 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
919 PyObject *key = NULL;
920 if (self->fast_memo == NULL) {
921 self->fast_memo = PyDict_New();
922 if (self->fast_memo == NULL) {
923 self->fast_container = -1;
924 return 0;
925 }
926 }
927 key = PyLong_FromVoidPtr(obj);
928 if (key == NULL)
929 return 0;
930 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000931 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000933 "fast mode: can't pickle cyclic objects "
934 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000935 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 self->fast_container = -1;
937 return 0;
938 }
939 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000940 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 self->fast_container = -1;
942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
Tim Peterscba30e22003-02-01 06:24:36 +0000949int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000950fast_save_leave(Picklerobject *self, PyObject *obj)
951{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000952 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
953 PyObject *key = PyLong_FromVoidPtr(obj);
954 if (key == NULL)
955 return 0;
956 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000957 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 return 0;
959 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000960 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000961 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000963}
964
965static int
Tim Peterscba30e22003-02-01 06:24:36 +0000966save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967{
968 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000969 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000970 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000972 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000973}
974
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975static int
Tim Peterscba30e22003-02-01 06:24:36 +0000976save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000977{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000978 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000979 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000980 long l = PyInt_AS_LONG((PyIntObject *)args);
981
Tim Peters3c67d792003-02-02 17:59:11 +0000982 if (self->proto >= 2) {
983 char opcode = l ? NEWTRUE : NEWFALSE;
984 if (self->write_func(self, &opcode, 1) < 0)
985 return -1;
986 }
987 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000988 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000989 return 0;
990}
Tim Peters84e87f32001-03-17 04:50:51 +0000991
Guido van Rossum60456fd1997-04-09 17:36:32 +0000992static int
Tim Peterscba30e22003-02-01 06:24:36 +0000993save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000994{
995 char c_str[32];
996 long l = PyInt_AS_LONG((PyIntObject *)args);
997 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001000#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001 || l > 0x7fffffffL
1002 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001003#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 ) {
1005 /* Text-mode pickle, or long too big to fit in the 4-byte
1006 * signed BININT format: store as a string.
1007 */
1008 c_str[0] = INT;
1009 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001010 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001011 return -1;
1012 }
1013 else {
1014 /* Binary pickle and l fits in a signed 4-byte int. */
1015 c_str[1] = (int)( l & 0xff);
1016 c_str[2] = (int)((l >> 8) & 0xff);
1017 c_str[3] = (int)((l >> 16) & 0xff);
1018 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1021 if (c_str[2] == 0) {
1022 c_str[0] = BININT1;
1023 len = 2;
1024 }
1025 else {
1026 c_str[0] = BININT2;
1027 len = 3;
1028 }
1029 }
1030 else {
1031 c_str[0] = BININT;
1032 len = 5;
1033 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001034
Tim Peters0bc93f52003-02-02 18:29:33 +00001035 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001036 return -1;
1037 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001039 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001040}
1041
1042
1043static int
Tim Peterscba30e22003-02-01 06:24:36 +00001044save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001046 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001047 int res = -1;
1048 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001050 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001051
Tim Petersee1a53c2003-02-02 02:57:53 +00001052 if (self->proto >= 2) {
1053 /* Linear-time pickling. */
1054 size_t nbits;
1055 size_t nbytes;
1056 unsigned char *pdata;
1057 char c_str[5];
1058 int i;
1059 int sign = _PyLong_Sign(args);
1060
1061 if (sign == 0) {
1062 /* It's 0 -- an empty bytestring. */
1063 c_str[0] = LONG1;
1064 c_str[1] = 0;
1065 i = self->write_func(self, c_str, 2);
1066 if (i < 0) goto finally;
1067 res = 0;
1068 goto finally;
1069 }
1070 nbits = _PyLong_NumBits(args);
1071 if (nbits == (size_t)-1 && PyErr_Occurred())
1072 goto finally;
1073 /* How many bytes do we need? There are nbits >> 3 full
1074 * bytes of data, and nbits & 7 leftover bits. If there
1075 * are any leftover bits, then we clearly need another
1076 * byte. Wnat's not so obvious is that we *probably*
1077 * need another byte even if there aren't any leftovers:
1078 * the most-significant bit of the most-significant byte
1079 * acts like a sign bit, and it's usually got a sense
1080 * opposite of the one we need. The exception is longs
1081 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1082 * its own 256's-complement, so has the right sign bit
1083 * even without the extra byte. That's a pain to check
1084 * for in advance, though, so we always grab an extra
1085 * byte at the start, and cut it back later if possible.
1086 */
1087 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001088 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001089 PyErr_SetString(PyExc_OverflowError, "long too large "
1090 "to pickle");
1091 goto finally;
1092 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001093 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001094 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001095 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001096 i = _PyLong_AsByteArray((PyLongObject *)args,
1097 pdata, nbytes,
1098 1 /* little endian */, 1 /* signed */);
1099 if (i < 0) goto finally;
1100 /* If the long is negative, this may be a byte more than
1101 * needed. This is so iff the MSB is all redundant sign
1102 * bits.
1103 */
1104 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1105 (pdata[nbytes - 2] & 0x80) != 0)
1106 --nbytes;
1107
1108 if (nbytes < 256) {
1109 c_str[0] = LONG1;
1110 c_str[1] = (char)nbytes;
1111 size = 2;
1112 }
1113 else {
1114 c_str[0] = LONG4;
1115 size = (int)nbytes;
1116 for (i = 1; i < 5; i++) {
1117 c_str[i] = (char)(size & 0xff);
1118 size >>= 8;
1119 }
1120 size = 5;
1121 }
1122 i = self->write_func(self, c_str, size);
1123 if (i < 0) goto finally;
1124 i = self->write_func(self, (char *)pdata, (int)nbytes);
1125 if (i < 0) goto finally;
1126 res = 0;
1127 goto finally;
1128 }
1129
1130 /* proto < 2: write the repr and newline. This is quadratic-time
1131 * (in the number of digits), in both directions.
1132 */
Tim Peterscba30e22003-02-01 06:24:36 +00001133 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001136 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Tim Peters0bc93f52003-02-02 18:29:33 +00001142 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001143 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001144 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Tim Peters0bc93f52003-02-02 18:29:33 +00001147 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 finally:
1153 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001155}
1156
1157
1158static int
Tim Peterscba30e22003-02-01 06:24:36 +00001159save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160{
1161 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001165 str[0] = BINFLOAT;
1166 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001167 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001168 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169 return -1;
1170 }
1171 else {
Eric Smithb05d3be2009-10-26 15:06:39 +00001172 int result = -1;
1173 char *buf = NULL;
1174 char op = FLOAT;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Eric Smithb05d3be2009-10-26 15:06:39 +00001176 if (self->write_func(self, &op, 1) < 0)
1177 goto done;
1178
1179 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
1180 if (!buf) {
1181 PyErr_NoMemory();
1182 goto done;
1183 }
1184
1185 if (self->write_func(self, buf, strlen(buf)) < 0)
1186 goto done;
1187
1188 if (self->write_func(self, "\n", 1) < 0)
1189 goto done;
1190
1191 result = 0;
1192done:
1193 PyMem_Free(buf);
1194 return result;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198}
1199
1200
1201static int
Tim Peterscba30e22003-02-01 06:24:36 +00001202save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203{
1204 int size, len;
1205 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001207 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 if (!self->bin) {
1211 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Tim Peterscba30e22003-02-01 06:24:36 +00001215 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001218 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001220 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001221
Tim Peters0bc93f52003-02-02 18:29:33 +00001222 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001224
Tim Peters0bc93f52003-02-02 18:29:33 +00001225 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Tim Peters0bc93f52003-02-02 18:29:33 +00001228 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 Py_XDECREF(repr);
1232 }
1233 else {
1234 int i;
1235 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001237 if (size < 256) {
1238 c_str[0] = SHORT_BINSTRING;
1239 c_str[1] = size;
1240 len = 2;
1241 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001242 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 c_str[0] = BINSTRING;
1244 for (i = 1; i < 5; i++)
1245 c_str[i] = (int)(size >> ((i - 1) * 8));
1246 len = 5;
1247 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001248 else
1249 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Tim Peters0bc93f52003-02-02 18:29:33 +00001251 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001252 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 if (size > 128 && Pdata_Check(self->file)) {
1255 if (write_other(self, NULL, 0) < 0) return -1;
1256 PDATA_APPEND(self->file, args, -1);
1257 }
1258 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001259 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001260 PyString_AS_STRING(
1261 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001262 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 return -1;
1264 }
1265 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 if (doput)
1268 if (put(self, args) < 0)
1269 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001273 err:
1274 Py_XDECREF(repr);
1275 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001276}
1277
1278
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001279#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001280/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1281 backslash and newline characters to \uXXXX escapes. */
1282static PyObject *
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001283modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001284{
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001285 PyObject *repr;
1286 char *p;
1287 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001289 static const char *hexdigit = "0123456789abcdef";
1290#ifdef Py_UNICODE_WIDE
1291 const Py_ssize_t expandsize = 10;
1292#else
1293 const Py_ssize_t expandsize = 6;
1294#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001295
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001296 if (size > PY_SSIZE_T_MAX / expandsize)
1297 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001299 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1300 if (repr == NULL)
1301 return NULL;
1302 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001303 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001304
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001305 p = q = PyString_AS_STRING(repr);
1306 while (size-- > 0) {
1307 Py_UNICODE ch = *s++;
1308#ifdef Py_UNICODE_WIDE
1309 /* Map 32-bit characters to '\Uxxxxxxxx' */
1310 if (ch >= 0x10000) {
1311 *p++ = '\\';
1312 *p++ = 'U';
1313 *p++ = hexdigit[(ch >> 28) & 0xf];
1314 *p++ = hexdigit[(ch >> 24) & 0xf];
1315 *p++ = hexdigit[(ch >> 20) & 0xf];
1316 *p++ = hexdigit[(ch >> 16) & 0xf];
1317 *p++ = hexdigit[(ch >> 12) & 0xf];
1318 *p++ = hexdigit[(ch >> 8) & 0xf];
1319 *p++ = hexdigit[(ch >> 4) & 0xf];
1320 *p++ = hexdigit[ch & 15];
1321 }
1322 else
1323#else
1324 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1325 if (ch >= 0xD800 && ch < 0xDC00) {
1326 Py_UNICODE ch2;
1327 Py_UCS4 ucs;
1328
1329 ch2 = *s++;
1330 size--;
1331 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1332 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1333 *p++ = '\\';
1334 *p++ = 'U';
1335 *p++ = hexdigit[(ucs >> 28) & 0xf];
1336 *p++ = hexdigit[(ucs >> 24) & 0xf];
1337 *p++ = hexdigit[(ucs >> 20) & 0xf];
1338 *p++ = hexdigit[(ucs >> 16) & 0xf];
1339 *p++ = hexdigit[(ucs >> 12) & 0xf];
1340 *p++ = hexdigit[(ucs >> 8) & 0xf];
1341 *p++ = hexdigit[(ucs >> 4) & 0xf];
1342 *p++ = hexdigit[ucs & 0xf];
1343 continue;
1344 }
1345 /* Fall through: isolated surrogates are copied as-is */
1346 s--;
1347 size++;
1348 }
1349#endif
1350 /* Map 16-bit characters to '\uxxxx' */
1351 if (ch >= 256 || ch == '\\' || ch == '\n') {
1352 *p++ = '\\';
1353 *p++ = 'u';
1354 *p++ = hexdigit[(ch >> 12) & 0xf];
1355 *p++ = hexdigit[(ch >> 8) & 0xf];
1356 *p++ = hexdigit[(ch >> 4) & 0xf];
1357 *p++ = hexdigit[ch & 15];
1358 }
1359 /* Copy everything else as-is */
1360 else
1361 *p++ = (char) ch;
1362 }
1363 *p = '\0';
1364 _PyString_Resize(&repr, p - q);
1365 return repr;
1366}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001367
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368static int
Tim Peterscba30e22003-02-01 06:24:36 +00001369save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001371 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 if (!PyUnicode_Check(args))
1375 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 if (!self->bin) {
1378 char *repr_str;
1379 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 repr = modified_EncodeRawUnicodeEscape(
1382 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001383 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001385
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001386 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001387 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001388 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
Tim Peters0bc93f52003-02-02 18:29:33 +00001390 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001392
Tim Peters0bc93f52003-02-02 18:29:33 +00001393 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001394 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Tim Peters0bc93f52003-02-02 18:29:33 +00001396 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 Py_XDECREF(repr);
1400 }
1401 else {
1402 int i;
1403 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Tim Peterscba30e22003-02-01 06:24:36 +00001405 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001407
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001408 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001410 if (size > INT_MAX)
1411 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 c_str[0] = BINUNICODE;
1414 for (i = 1; i < 5; i++)
1415 c_str[i] = (int)(size >> ((i - 1) * 8));
1416 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001417
Tim Peters0bc93f52003-02-02 18:29:33 +00001418 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 if (size > 128 && Pdata_Check(self->file)) {
1422 if (write_other(self, NULL, 0) < 0)
1423 goto err;
1424 PDATA_APPEND(self->file, repr, -1);
1425 }
1426 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001427 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001428 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 goto err;
1430 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001432 Py_DECREF(repr);
1433 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 if (doput)
1436 if (put(self, args) < 0)
1437 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 err:
1442 Py_XDECREF(repr);
1443 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001445#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001446
Tim Peters1d63c9f2003-02-02 20:29:39 +00001447/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1448static int
Tim Peters67920142003-02-05 03:46:17 +00001449store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001450{
1451 int i;
1452 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001453
Tim Peters1d63c9f2003-02-02 20:29:39 +00001454 assert(PyTuple_Size(t) == len);
1455
1456 for (i = 0; i < len; i++) {
1457 PyObject *element = PyTuple_GET_ITEM(t, i);
1458
1459 if (element == NULL)
1460 goto finally;
1461 if (save(self, element, 0) < 0)
1462 goto finally;
1463 }
1464 res = 0;
1465
1466 finally:
1467 return res;
1468}
1469
1470/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1471 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001472 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001473 * (a tuple can be reached from itself), and that requires some subtle
1474 * magic so that it works in all cases. IOW, this is a long routine.
1475 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001476static int
Tim Peterscba30e22003-02-01 06:24:36 +00001477save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001479 PyObject *py_tuple_id = NULL;
1480 int len, i;
1481 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001483 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001484 static char pop = POP;
1485 static char pop_mark = POP_MARK;
1486 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 if ((len = PyTuple_Size(args)) < 0)
1489 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490
Tim Peters1d63c9f2003-02-02 20:29:39 +00001491 if (len == 0) {
1492 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001493
Tim Peters1d63c9f2003-02-02 20:29:39 +00001494 if (self->proto) {
1495 c_str[0] = EMPTY_TUPLE;
1496 len = 1;
1497 }
1498 else {
1499 c_str[0] = MARK;
1500 c_str[1] = TUPLE;
1501 len = 2;
1502 }
1503 if (self->write_func(self, c_str, len) >= 0)
1504 res = 0;
1505 /* Don't memoize an empty tuple. */
1506 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508
Tim Peters1d63c9f2003-02-02 20:29:39 +00001509 /* A non-empty tuple. */
1510
1511 /* id(tuple) isn't in the memo now. If it shows up there after
1512 * saving the tuple elements, the tuple must be recursive, in
1513 * which case we'll pop everything we put on the stack, and fetch
1514 * its value from the memo.
1515 */
1516 py_tuple_id = PyLong_FromVoidPtr(args);
1517 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001519
Tim Peters1d63c9f2003-02-02 20:29:39 +00001520 if (len <= 3 && self->proto >= 2) {
1521 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001522 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001523 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001524 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 /* pop the len elements */
1526 for (i = 0; i < len; ++i)
1527 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001529 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001530 if (get(self, py_tuple_id) < 0)
1531 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 res = 0;
1533 goto finally;
1534 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001535 /* Not recursive. */
1536 if (self->write_func(self, len2opcode + len, 1) < 0)
1537 goto finally;
1538 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001540
Tim Peters1d63c9f2003-02-02 20:29:39 +00001541 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1542 * Generate MARK elt1 elt2 ... TUPLE
1543 */
1544 if (self->write_func(self, &MARKv, 1) < 0)
1545 goto finally;
1546
Tim Peters67920142003-02-05 03:46:17 +00001547 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001548 goto finally;
1549
1550 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1551 /* pop the stack stuff we pushed */
1552 if (self->bin) {
1553 if (self->write_func(self, &pop_mark, 1) < 0)
1554 goto finally;
1555 }
1556 else {
1557 /* Note that we pop one more than len, to remove
1558 * the MARK too.
1559 */
1560 for (i = 0; i <= len; i++)
1561 if (self->write_func(self, &pop, 1) < 0)
1562 goto finally;
1563 }
1564 /* fetch from memo */
1565 if (get(self, py_tuple_id) >= 0)
1566 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001567 goto finally;
1568 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001569
Tim Peters1d63c9f2003-02-02 20:29:39 +00001570 /* Not recursive. */
1571 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001572 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001573
Tim Peters1d63c9f2003-02-02 20:29:39 +00001574 memoize:
1575 if (put(self, args) >= 0)
1576 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001578 finally:
1579 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001580 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581}
1582
Tim Peters1092d642003-02-11 21:06:20 +00001583/* iter is an iterator giving items, and we batch up chunks of
1584 * MARK item item ... item APPENDS
1585 * opcode sequences. Calling code should have arranged to first create an
1586 * empty list, or list-like object, for the APPENDS to operate on.
1587 * Returns 0 on success, <0 on error.
1588 */
1589static int
1590batch_list(Picklerobject *self, PyObject *iter)
1591{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001592 PyObject *obj = NULL;
1593 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001594 int i, n;
1595
1596 static char append = APPEND;
1597 static char appends = APPENDS;
1598
1599 assert(iter != NULL);
1600
1601 if (self->proto == 0) {
1602 /* APPENDS isn't available; do one at a time. */
1603 for (;;) {
1604 obj = PyIter_Next(iter);
1605 if (obj == NULL) {
1606 if (PyErr_Occurred())
1607 return -1;
1608 break;
1609 }
1610 i = save(self, obj, 0);
1611 Py_DECREF(obj);
1612 if (i < 0)
1613 return -1;
1614 if (self->write_func(self, &append, 1) < 0)
1615 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001616 }
1617 return 0;
1618 }
1619
1620 /* proto > 0: write in batches of BATCHSIZE. */
1621 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001622 /* Get first item */
1623 firstitem = PyIter_Next(iter);
1624 if (firstitem == NULL) {
1625 if (PyErr_Occurred())
1626 goto BatchFailed;
1627
1628 /* nothing more to add */
1629 break;
1630 }
1631
1632 /* Try to get a second item */
1633 obj = PyIter_Next(iter);
1634 if (obj == NULL) {
1635 if (PyErr_Occurred())
1636 goto BatchFailed;
1637
1638 /* Only one item to write */
1639 if (save(self, firstitem, 0) < 0)
1640 goto BatchFailed;
1641 if (self->write_func(self, &append, 1) < 0)
1642 goto BatchFailed;
1643 Py_CLEAR(firstitem);
1644 break;
1645 }
1646
1647 /* More than one item to write */
1648
1649 /* Pump out MARK, items, APPENDS. */
1650 if (self->write_func(self, &MARKv, 1) < 0)
1651 goto BatchFailed;
1652
1653 if (save(self, firstitem, 0) < 0)
1654 goto BatchFailed;
1655 Py_CLEAR(firstitem);
1656 n = 1;
1657
1658 /* Fetch and save up to BATCHSIZE items */
1659 while (obj) {
1660 if (save(self, obj, 0) < 0)
1661 goto BatchFailed;
1662 Py_CLEAR(obj);
1663 n += 1;
1664
1665 if (n == BATCHSIZE)
1666 break;
1667
Tim Peters1092d642003-02-11 21:06:20 +00001668 obj = PyIter_Next(iter);
1669 if (obj == NULL) {
1670 if (PyErr_Occurred())
1671 goto BatchFailed;
1672 break;
1673 }
Tim Peters1092d642003-02-11 21:06:20 +00001674 }
1675
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001676 if (self->write_func(self, &appends, 1) < 0)
1677 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001678
Tim Peters90975f12003-02-12 05:28:58 +00001679 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001680 return 0;
1681
1682BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001683 Py_XDECREF(firstitem);
1684 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001685 return -1;
1686}
1687
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688static int
Tim Peterscba30e22003-02-01 06:24:36 +00001689save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690{
Tim Peters1092d642003-02-11 21:06:20 +00001691 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001693 int len;
1694 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 if (self->fast && !fast_save_enter(self, args))
1697 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001698
Tim Peters1092d642003-02-11 21:06:20 +00001699 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 if (self->bin) {
1701 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001702 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 }
1704 else {
1705 s[0] = MARK;
1706 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001707 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001709
Tim Peters1092d642003-02-11 21:06:20 +00001710 if (self->write_func(self, s, len) < 0)
1711 goto finally;
1712
1713 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001714 if ((len = PyList_Size(args)) < 0)
1715 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001716
Tim Peters1092d642003-02-11 21:06:20 +00001717 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001719 if (put(self, args) >= 0)
1720 res = 0;
1721 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 }
Tim Peters90975f12003-02-12 05:28:58 +00001723 if (put2(self, args) < 0)
1724 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001725
Tim Peters1092d642003-02-11 21:06:20 +00001726 /* Materialize the list elements. */
1727 iter = PyObject_GetIter(args);
1728 if (iter == NULL)
1729 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001730
1731 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1732 {
1733 res = batch_list(self, iter);
1734 Py_LeaveRecursiveCall();
1735 }
Tim Peters1092d642003-02-11 21:06:20 +00001736 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001738 finally:
1739 if (self->fast && !fast_save_leave(self, args))
1740 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001743}
1744
1745
Tim Peters42f08ac2003-02-11 22:43:24 +00001746/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1747 * MARK key value ... key value SETITEMS
1748 * opcode sequences. Calling code should have arranged to first create an
1749 * empty dict, or dict-like object, for the SETITEMS to operate on.
1750 * Returns 0 on success, <0 on error.
1751 *
1752 * This is very much like batch_list(). The difference between saving
1753 * elements directly, and picking apart two-tuples, is so long-winded at
1754 * the C level, though, that attempts to combine these routines were too
1755 * ugly to bear.
1756 */
1757static int
1758batch_dict(Picklerobject *self, PyObject *iter)
1759{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001760 PyObject *p = NULL;
1761 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001762 int i, n;
1763
1764 static char setitem = SETITEM;
1765 static char setitems = SETITEMS;
1766
1767 assert(iter != NULL);
1768
1769 if (self->proto == 0) {
1770 /* SETITEMS isn't available; do one at a time. */
1771 for (;;) {
1772 p = PyIter_Next(iter);
1773 if (p == NULL) {
1774 if (PyErr_Occurred())
1775 return -1;
1776 break;
1777 }
1778 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1779 PyErr_SetString(PyExc_TypeError, "dict items "
1780 "iterator must return 2-tuples");
1781 return -1;
1782 }
1783 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1784 if (i >= 0)
1785 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1786 Py_DECREF(p);
1787 if (i < 0)
1788 return -1;
1789 if (self->write_func(self, &setitem, 1) < 0)
1790 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001791 }
1792 return 0;
1793 }
1794
1795 /* proto > 0: write in batches of BATCHSIZE. */
1796 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001797 /* Get first item */
1798 firstitem = PyIter_Next(iter);
1799 if (firstitem == NULL) {
1800 if (PyErr_Occurred())
1801 goto BatchFailed;
1802
1803 /* nothing more to add */
1804 break;
1805 }
1806 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1807 PyErr_SetString(PyExc_TypeError, "dict items "
1808 "iterator must return 2-tuples");
1809 goto BatchFailed;
1810 }
1811
1812 /* Try to get a second item */
1813 p = PyIter_Next(iter);
1814 if (p == NULL) {
1815 if (PyErr_Occurred())
1816 goto BatchFailed;
1817
1818 /* Only one item to write */
1819 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1820 goto BatchFailed;
1821 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1822 goto BatchFailed;
1823 if (self->write_func(self, &setitem, 1) < 0)
1824 goto BatchFailed;
1825 Py_CLEAR(firstitem);
1826 break;
1827 }
1828
1829 /* More than one item to write */
1830
1831 /* Pump out MARK, items, SETITEMS. */
1832 if (self->write_func(self, &MARKv, 1) < 0)
1833 goto BatchFailed;
1834
1835 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1836 goto BatchFailed;
1837 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1838 goto BatchFailed;
1839 Py_CLEAR(firstitem);
1840 n = 1;
1841
1842 /* Fetch and save up to BATCHSIZE items */
1843 while (p) {
1844 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1845 PyErr_SetString(PyExc_TypeError, "dict items "
1846 "iterator must return 2-tuples");
1847 goto BatchFailed;
1848 }
1849 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1850 goto BatchFailed;
1851 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1852 goto BatchFailed;
1853 Py_CLEAR(p);
1854 n += 1;
1855
1856 if (n == BATCHSIZE)
1857 break;
1858
Tim Peters42f08ac2003-02-11 22:43:24 +00001859 p = PyIter_Next(iter);
1860 if (p == NULL) {
1861 if (PyErr_Occurred())
1862 goto BatchFailed;
1863 break;
1864 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001865 }
1866
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001867 if (self->write_func(self, &setitems, 1) < 0)
1868 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001869
Tim Peters90975f12003-02-12 05:28:58 +00001870 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001871 return 0;
1872
1873BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001874 Py_XDECREF(firstitem);
1875 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001876 return -1;
1877}
1878
Collin Winter179bf212009-05-25 04:34:39 +00001879/* This is a variant of batch_dict() above that specializes for dicts, with no
1880 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1881 * MARK key value ... key value SETITEMS
1882 * opcode sequences. Calling code should have arranged to first create an
1883 * empty dict, or dict-like object, for the SETITEMS to operate on.
1884 * Returns 0 on success, -1 on error.
1885 *
1886 * Note that this currently doesn't work for protocol 0.
1887 */
1888static int
1889batch_dict_exact(Picklerobject *self, PyObject *obj)
1890{
1891 PyObject *key = NULL, *value = NULL;
1892 int i;
1893 Py_ssize_t dict_size, ppos = 0;
1894
1895 static char setitem = SETITEM;
1896 static char setitems = SETITEMS;
1897
1898 assert(obj != NULL);
1899 assert(self->proto > 0);
1900
1901 dict_size = PyDict_Size(obj);
1902
1903 /* Special-case len(d) == 1 to save space. */
1904 if (dict_size == 1) {
1905 PyDict_Next(obj, &ppos, &key, &value);
1906 if (save(self, key, 0) < 0)
1907 return -1;
1908 if (save(self, value, 0) < 0)
1909 return -1;
1910 if (self->write_func(self, &setitem, 1) < 0)
1911 return -1;
1912 return 0;
1913 }
1914
1915 /* Write in batches of BATCHSIZE. */
1916 do {
1917 i = 0;
1918 if (self->write_func(self, &MARKv, 1) < 0)
1919 return -1;
1920 while (PyDict_Next(obj, &ppos, &key, &value)) {
1921 if (save(self, key, 0) < 0)
1922 return -1;
1923 if (save(self, value, 0) < 0)
1924 return -1;
1925 if (++i == BATCHSIZE)
1926 break;
1927 }
1928 if (self->write_func(self, &setitems, 1) < 0)
1929 return -1;
1930 if (PyDict_Size(obj) != dict_size) {
1931 PyErr_Format(
1932 PyExc_RuntimeError,
1933 "dictionary changed size during iteration");
1934 return -1;
1935 }
1936
1937 } while (i == BATCHSIZE);
1938 return 0;
1939}
1940
Guido van Rossum60456fd1997-04-09 17:36:32 +00001941static int
Tim Peterscba30e22003-02-01 06:24:36 +00001942save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943{
Tim Peters42f08ac2003-02-11 22:43:24 +00001944 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001946 int len;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (self->fast && !fast_save_enter(self, args))
1949 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001950
Tim Peters42f08ac2003-02-11 22:43:24 +00001951 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 if (self->bin) {
1953 s[0] = EMPTY_DICT;
1954 len = 1;
1955 }
1956 else {
1957 s[0] = MARK;
1958 s[1] = DICT;
1959 len = 2;
1960 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Tim Peters0bc93f52003-02-02 18:29:33 +00001962 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Tim Peters42f08ac2003-02-11 22:43:24 +00001965 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 if ((len = PyDict_Size(args)) < 0)
1967 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001970 if (put(self, args) >= 0)
1971 res = 0;
1972 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 }
Tim Peters90975f12003-02-12 05:28:58 +00001974 if (put2(self, args) < 0)
1975 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001976
Tim Peters42f08ac2003-02-11 22:43:24 +00001977 /* Materialize the dict items. */
Collin Winter179bf212009-05-25 04:34:39 +00001978 if (PyDict_CheckExact(args) && self->proto > 0) {
1979 /* We can take certain shortcuts if we know this is a dict and
1980 not a dict subclass. */
1981 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1982 res = batch_dict_exact(self, args);
1983 Py_LeaveRecursiveCall();
1984 }
1985 } else {
1986 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
1987 if (iter == NULL)
1988 goto finally;
1989 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1990 res = batch_dict(self, iter);
1991 Py_LeaveRecursiveCall();
1992 }
1993 Py_DECREF(iter);
Facundo Batista763d3092008-06-30 01:10:55 +00001994 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 finally:
1997 if (self->fast && !fast_save_leave(self, args))
1998 res = -1;
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
Tim Peters84e87f32001-03-17 04:50:51 +00002004static int
Tim Peterscba30e22003-02-01 06:24:36 +00002005save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006{
2007 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
2008 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
2009 char *module_str, *name_str;
2010 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002014 if (self->fast && !fast_save_enter(self, args))
2015 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002016
Tim Peters0bc93f52003-02-02 18:29:33 +00002017 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002019
Tim Peterscba30e22003-02-01 06:24:36 +00002020 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002021 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 if (self->bin) {
2024 if (save(self, class, 0) < 0)
2025 goto finally;
2026 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002028 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2029 PyObject *element = 0;
2030 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00002033 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 if ((len = PyObject_Size(class_args)) < 0)
2037 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002039 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00002040 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002041 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002043 if (save(self, element, 0) < 0) {
2044 Py_DECREF(element);
2045 goto finally;
2046 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 Py_DECREF(element);
2049 }
2050 }
2051 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002052 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2053 PyErr_Clear();
2054 else
2055 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002058 if (!self->bin) {
2059 if (!( name = ((PyClassObject *)class)->cl_name )) {
2060 PyErr_SetString(PicklingError, "class has no name");
2061 goto finally;
2062 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002063
Tim Peterscba30e22003-02-01 06:24:36 +00002064 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002066
Tim Peters84e87f32001-03-17 04:50:51 +00002067
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002068 if ((module_size = PyString_Size(module)) < 0 ||
2069 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002070 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002071
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002072 module_str = PyString_AS_STRING((PyStringObject *)module);
2073 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002074
Tim Peters0bc93f52003-02-02 18:29:33 +00002075 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002077
Tim Peters0bc93f52003-02-02 18:29:33 +00002078 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002079 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002080
Tim Peters0bc93f52003-02-02 18:29:33 +00002081 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083
Tim Peters0bc93f52003-02-02 18:29:33 +00002084 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086
Tim Peters0bc93f52003-02-02 18:29:33 +00002087 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 goto finally;
2089 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002090 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 goto finally;
2092 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2095 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002096 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 goto finally;
2098 }
2099 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002100 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2101 PyErr_Clear();
2102 else
2103 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002106 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2107 PyErr_Clear();
2108 else
2109 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110 res = 0;
2111 goto finally;
2112 }
2113 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 if (!PyDict_Check(state)) {
2116 if (put2(self, args) < 0)
2117 goto finally;
2118 }
2119 else {
2120 if (put(self, args) < 0)
2121 goto finally;
2122 }
Tim Peters84e87f32001-03-17 04:50:51 +00002123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 if (save(self, state, 0) < 0)
2125 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Tim Peters0bc93f52003-02-02 18:29:33 +00002127 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002128 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 finally:
2133 if (self->fast && !fast_save_leave(self, args))
2134 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 Py_XDECREF(module);
2137 Py_XDECREF(class);
2138 Py_XDECREF(state);
2139 Py_XDECREF(getinitargs_func);
2140 Py_XDECREF(getstate_func);
2141 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002143 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002144}
2145
2146
Guido van Rossum60456fd1997-04-09 17:36:32 +00002147static int
Tim Peterscba30e22003-02-01 06:24:36 +00002148save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002150 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002151 char *name_str, *module_str;
2152 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002156 if (name) {
2157 global_name = name;
2158 Py_INCREF(global_name);
2159 }
2160 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002161 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 goto finally;
2163 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Tim Peterscba30e22003-02-01 06:24:36 +00002165 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002166 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002167
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002168 if ((module_size = PyString_Size(module)) < 0 ||
2169 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002171
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002172 module_str = PyString_AS_STRING((PyStringObject *)module);
2173 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002174
Guido van Rossum75bfd052002-12-24 18:10:07 +00002175 /* XXX This can be doing a relative import. Clearly it shouldn't,
2176 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002177 mod = PyImport_ImportModule(module_str);
2178 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002180 "Can't pickle %s: import of module %s "
2181 "failed",
2182 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002183 goto finally;
2184 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002185 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 if (klass == NULL) {
2187 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002188 "Can't pickle %s: attribute lookup %s.%s "
2189 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 "OSS", args, module, global_name);
2191 goto finally;
2192 }
2193 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002194 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002195 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002196 "Can't pickle %s: it's not the same object "
2197 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 "OSS", args, module, global_name);
2199 goto finally;
2200 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002201 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002202
Tim Peters731098b2003-02-04 20:56:09 +00002203 if (self->proto >= 2) {
2204 /* See whether this is in the extension registry, and if
2205 * so generate an EXT opcode.
2206 */
2207 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002208 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002209 char c_str[5];
2210 int n;
2211
2212 PyTuple_SET_ITEM(two_tuple, 0, module);
2213 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2214 py_code = PyDict_GetItem(extension_registry, two_tuple);
2215 if (py_code == NULL)
2216 goto gen_global; /* not registered */
2217
2218 /* Verify py_code has the right type and value. */
2219 if (!PyInt_Check(py_code)) {
2220 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002221 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002222 "OO", args, py_code);
2223 goto finally;
2224 }
2225 code = PyInt_AS_LONG(py_code);
2226 if (code <= 0 || code > 0x7fffffffL) {
2227 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2228 "extension code %ld is out of range",
2229 "Ol", args, code);
2230 goto finally;
2231 }
2232
2233 /* Generate an EXT opcode. */
2234 if (code <= 0xff) {
2235 c_str[0] = EXT1;
2236 c_str[1] = (char)code;
2237 n = 2;
2238 }
2239 else if (code <= 0xffff) {
2240 c_str[0] = EXT2;
2241 c_str[1] = (char)(code & 0xff);
2242 c_str[2] = (char)((code >> 8) & 0xff);
2243 n = 3;
2244 }
2245 else {
2246 c_str[0] = EXT4;
2247 c_str[1] = (char)(code & 0xff);
2248 c_str[2] = (char)((code >> 8) & 0xff);
2249 c_str[3] = (char)((code >> 16) & 0xff);
2250 c_str[4] = (char)((code >> 24) & 0xff);
2251 n = 5;
2252 }
2253
2254 if (self->write_func(self, c_str, n) >= 0)
2255 res = 0;
2256 goto finally; /* and don't memoize */
2257 }
2258
2259 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002260 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002261 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002262
Tim Peters0bc93f52003-02-02 18:29:33 +00002263 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002265
Tim Peters0bc93f52003-02-02 18:29:33 +00002266 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002268
Tim Peters0bc93f52003-02-02 18:29:33 +00002269 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002271
Tim Peters0bc93f52003-02-02 18:29:33 +00002272 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 if (put(self, args) < 0)
2276 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 finally:
2281 Py_XDECREF(module);
2282 Py_XDECREF(global_name);
2283 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002285 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002286}
2287
Guido van Rossum60456fd1997-04-09 17:36:32 +00002288static int
Tim Peterscba30e22003-02-01 06:24:36 +00002289save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290{
2291 PyObject *pid = 0;
2292 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 Py_INCREF(args);
2297 ARG_TUP(self, args);
2298 if (self->arg) {
2299 pid = PyObject_Call(f, self->arg, NULL);
2300 FREE_ARG_TUP(self);
2301 }
2302 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304 if (pid != Py_None) {
2305 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002306 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 PyErr_SetString(PicklingError,
2308 "persistent id must be string");
2309 goto finally;
2310 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002311
Tim Peters0bc93f52003-02-02 18:29:33 +00002312 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002314
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002315 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002316 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002317
Tim Peters0bc93f52003-02-02 18:29:33 +00002318 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002319 PyString_AS_STRING(
2320 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002321 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002323
Tim Peters0bc93f52003-02-02 18:29:33 +00002324 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 res = 1;
2328 goto finally;
2329 }
2330 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002331 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 res = -1;
2333 else
2334 res = 1;
2335 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337 goto finally;
2338 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 finally:
2343 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002345 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002346}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002347
Tim Peters71fcda52003-02-14 23:05:28 +00002348/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2349 * appropriate __reduce__ method for ob.
2350 */
Tim Peters84e87f32001-03-17 04:50:51 +00002351static int
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002352save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353{
Tim Peters71fcda52003-02-14 23:05:28 +00002354 PyObject *callable;
2355 PyObject *argtup;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002356 PyObject *state = NULL;
2357 PyObject *listitems = Py_None;
2358 PyObject *dictitems = Py_None;
2359 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002360
Tim Peters71fcda52003-02-14 23:05:28 +00002361 int use_newobj = self->proto >= 2;
2362
2363 static char reduce = REDUCE;
2364 static char build = BUILD;
2365 static char newobj = NEWOBJ;
2366
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002367 size = PyTuple_Size(args);
2368 if (size < 2 || size > 5) {
2369 cPickle_ErrFormat(PicklingError, "tuple returned by "
2370 "%s must contain 2 through 5 elements",
2371 "O", fn);
2372 return -1;
2373 }
2374
Tim Peters71fcda52003-02-14 23:05:28 +00002375 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2376 &callable,
2377 &argtup,
2378 &state,
2379 &listitems,
2380 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002382
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002383 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002384 cPickle_ErrFormat(PicklingError, "Second element of "
2385 "tuple returned by %s must be a tuple",
2386 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002387 return -1;
2388 }
2389
Tim Peters71fcda52003-02-14 23:05:28 +00002390 if (state == Py_None)
2391 state = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002392
Tim Peters71fcda52003-02-14 23:05:28 +00002393 if (listitems == Py_None)
2394 listitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002395 else if (!PyIter_Check(listitems)) {
2396 cPickle_ErrFormat(PicklingError, "Fourth element of "
2397 "tuple returned by %s must be an iterator, not %s",
2398 "Os", fn, Py_TYPE(listitems)->tp_name);
2399 return -1;
2400 }
2401
Tim Peters71fcda52003-02-14 23:05:28 +00002402 if (dictitems == Py_None)
2403 dictitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002404 else if (!PyIter_Check(dictitems)) {
2405 cPickle_ErrFormat(PicklingError, "Fifth element of "
2406 "tuple returned by %s must be an iterator, not %s",
2407 "Os", fn, Py_TYPE(dictitems)->tp_name);
2408 return -1;
2409 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002410
Tim Peters71fcda52003-02-14 23:05:28 +00002411 /* Protocol 2 special case: if callable's name is __newobj__, use
2412 * NEWOBJ. This consumes a lot of code.
2413 */
2414 if (use_newobj) {
2415 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002416
Tim Peters71fcda52003-02-14 23:05:28 +00002417 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002418 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2419 PyErr_Clear();
2420 else
2421 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002422 use_newobj = 0;
2423 }
2424 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002425 use_newobj = PyString_Check(temp) &&
2426 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002427 "__newobj__") == 0;
2428 Py_DECREF(temp);
2429 }
2430 }
2431 if (use_newobj) {
2432 PyObject *cls;
2433 PyObject *newargtup;
2434 int n, i;
2435
2436 /* Sanity checks. */
2437 n = PyTuple_Size(argtup);
2438 if (n < 1) {
2439 PyErr_SetString(PicklingError, "__newobj__ arglist "
2440 "is empty");
2441 return -1;
2442 }
2443
2444 cls = PyTuple_GET_ITEM(argtup, 0);
2445 if (! PyObject_HasAttrString(cls, "__new__")) {
2446 PyErr_SetString(PicklingError, "args[0] from "
2447 "__newobj__ args has no __new__");
2448 return -1;
2449 }
2450
2451 /* XXX How could ob be NULL? */
2452 if (ob != NULL) {
2453 PyObject *ob_dot_class;
2454
2455 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002456 if (ob_dot_class == NULL) {
2457 if (PyErr_ExceptionMatches(
2458 PyExc_AttributeError))
2459 PyErr_Clear();
2460 else
2461 return -1;
2462 }
Tim Peters71fcda52003-02-14 23:05:28 +00002463 i = ob_dot_class != cls; /* true iff a problem */
2464 Py_XDECREF(ob_dot_class);
2465 if (i) {
2466 PyErr_SetString(PicklingError, "args[0] from "
2467 "__newobj__ args has the wrong class");
2468 return -1;
2469 }
2470 }
2471
2472 /* Save the class and its __new__ arguments. */
2473 if (save(self, cls, 0) < 0)
2474 return -1;
2475
2476 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2477 if (newargtup == NULL)
2478 return -1;
2479 for (i = 1; i < n; ++i) {
2480 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2481 Py_INCREF(temp);
2482 PyTuple_SET_ITEM(newargtup, i-1, temp);
2483 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002484 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002485 Py_DECREF(newargtup);
2486 if (i < 0)
2487 return -1;
2488
2489 /* Add NEWOBJ opcode. */
2490 if (self->write_func(self, &newobj, 1) < 0)
2491 return -1;
2492 }
2493 else {
2494 /* Not using NEWOBJ. */
2495 if (save(self, callable, 0) < 0 ||
2496 save(self, argtup, 0) < 0 ||
2497 self->write_func(self, &reduce, 1) < 0)
2498 return -1;
2499 }
2500
2501 /* Memoize. */
2502 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 if (ob != NULL) {
2504 if (state && !PyDict_Check(state)) {
2505 if (put2(self, ob) < 0)
2506 return -1;
2507 }
Tim Peters71fcda52003-02-14 23:05:28 +00002508 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002510 }
Tim Peters84e87f32001-03-17 04:50:51 +00002511
Guido van Rossum60456fd1997-04-09 17:36:32 +00002512
Tim Peters71fcda52003-02-14 23:05:28 +00002513 if (listitems && batch_list(self, listitems) < 0)
2514 return -1;
2515
2516 if (dictitems && batch_dict(self, dictitems) < 0)
2517 return -1;
2518
2519 if (state) {
2520 if (save(self, state, 0) < 0 ||
2521 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 return -1;
2523 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002525 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002526}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002527
Guido van Rossum60456fd1997-04-09 17:36:32 +00002528static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002529save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530{
2531 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002532 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002533 int res = -1;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002534 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002535
Facundo Batista763d3092008-06-30 01:10:55 +00002536 if (Py_EnterRecursiveCall(" while pickling an object"))
2537 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 if (!pers_save && self->pers_func) {
2540 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2541 res = tmp;
2542 goto finally;
2543 }
2544 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546 if (args == Py_None) {
2547 res = save_none(self, args);
2548 goto finally;
2549 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550
Christian Heimese93237d2007-12-19 02:37:44 +00002551 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002554 case 'b':
2555 if (args == Py_False || args == Py_True) {
2556 res = save_bool(self, args);
2557 goto finally;
2558 }
2559 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002560 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 if (type == &PyInt_Type) {
2562 res = save_int(self, args);
2563 goto finally;
2564 }
2565 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566
Guido van Rossum60456fd1997-04-09 17:36:32 +00002567 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568 if (type == &PyLong_Type) {
2569 res = save_long(self, args);
2570 goto finally;
2571 }
2572 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002573
Guido van Rossum60456fd1997-04-09 17:36:32 +00002574 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 if (type == &PyFloat_Type) {
2576 res = save_float(self, args);
2577 goto finally;
2578 }
2579 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002580
Guido van Rossum60456fd1997-04-09 17:36:32 +00002581 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002582 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2583 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 goto finally;
2585 }
2586 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002587
Guido van Rossum60456fd1997-04-09 17:36:32 +00002588 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002589 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 res = save_string(self, args, 0);
2591 goto finally;
2592 }
Facundo Batista14618862008-06-22 15:27:10 +00002593 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002594
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002595#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002596 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002597 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 res = save_unicode(self, args, 0);
2599 goto finally;
2600 }
Facundo Batista14618862008-06-22 15:27:10 +00002601 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002602#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002604
Christian Heimese93237d2007-12-19 02:37:44 +00002605 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002606 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609 if (PyDict_GetItem(self->memo, py_ob_id)) {
2610 if (get(self, py_ob_id) < 0)
2611 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613 res = 0;
2614 goto finally;
2615 }
2616 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002618 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002620 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002621 res = save_string(self, args, 1);
2622 goto finally;
2623 }
2624 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002625
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002626#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002627 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002628 if (type == &PyUnicode_Type) {
2629 res = save_unicode(self, args, 1);
2630 goto finally;
2631 }
2632 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002633#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002634
Guido van Rossum60456fd1997-04-09 17:36:32 +00002635 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 if (type == &PyTuple_Type) {
2637 res = save_tuple(self, args);
2638 goto finally;
2639 }
2640 if (type == &PyType_Type) {
2641 res = save_global(self, args, NULL);
2642 goto finally;
2643 }
2644 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002645
Guido van Rossum60456fd1997-04-09 17:36:32 +00002646 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 if (type == &PyList_Type) {
2648 res = save_list(self, args);
2649 goto finally;
2650 }
2651 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652
2653 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 if (type == &PyDict_Type) {
2655 res = save_dict(self, args);
2656 goto finally;
2657 }
2658 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002659
2660 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002661 if (type == &PyInstance_Type) {
2662 res = save_inst(self, args);
2663 goto finally;
2664 }
2665 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002666
2667 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (type == &PyClass_Type) {
2669 res = save_global(self, args, NULL);
2670 goto finally;
2671 }
2672 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002673
2674 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675 if (type == &PyFunction_Type) {
2676 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002677 if (res && PyErr_ExceptionMatches(PickleError)) {
2678 /* fall back to reduce */
2679 PyErr_Clear();
2680 break;
2681 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002682 goto finally;
2683 }
2684 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002685
2686 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 if (type == &PyCFunction_Type) {
2688 res = save_global(self, args, NULL);
2689 goto finally;
2690 }
2691 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 if (!pers_save && self->inst_pers_func) {
2694 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2695 res = tmp;
2696 goto finally;
2697 }
2698 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002699
Jeremy Hylton39c61162002-07-16 19:47:43 +00002700 if (PyType_IsSubtype(type, &PyType_Type)) {
2701 res = save_global(self, args, NULL);
2702 goto finally;
2703 }
2704
Guido van Rossumb289b872003-02-19 01:45:13 +00002705 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002706 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002707 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002708 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002709 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2710 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002712 Py_INCREF(args);
2713 ARG_TUP(self, args);
2714 if (self->arg) {
2715 t = PyObject_Call(__reduce__, self->arg, NULL);
2716 FREE_ARG_TUP(self);
2717 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718 }
2719 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002720 /* Check for a __reduce_ex__ method. */
2721 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2722 if (__reduce__ != NULL) {
2723 t = PyInt_FromLong(self->proto);
2724 if (t != NULL) {
2725 ARG_TUP(self, t);
2726 t = NULL;
2727 if (self->arg) {
2728 t = PyObject_Call(__reduce__,
2729 self->arg, NULL);
2730 FREE_ARG_TUP(self);
2731 }
2732 }
2733 }
2734 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002735 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2736 PyErr_Clear();
2737 else
2738 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002739 /* Check for a __reduce__ method. */
2740 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2741 if (__reduce__ != NULL) {
2742 t = PyObject_Call(__reduce__,
2743 empty_tuple, NULL);
2744 }
2745 else {
2746 PyErr_SetObject(UnpickleableError, args);
2747 goto finally;
2748 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002751
Tim Peters71fcda52003-02-14 23:05:28 +00002752 if (t == NULL)
2753 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002754
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002755 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002756 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002757 goto finally;
2758 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002759
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002760 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002761 cPickle_ErrFormat(PicklingError, "Value returned by "
2762 "%s must be string or tuple",
2763 "O", __reduce__);
2764 goto finally;
2765 }
2766
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002767 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002770 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771 Py_XDECREF(py_ob_id);
2772 Py_XDECREF(__reduce__);
2773 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776}
2777
2778
2779static int
Tim Peterscba30e22003-02-01 06:24:36 +00002780dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781{
2782 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Tim Peters4190fb82003-02-02 16:09:05 +00002784 if (self->proto >= 2) {
2785 char bytes[2];
2786
2787 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002788 assert(self->proto >= 0 && self->proto < 256);
2789 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002790 if (self->write_func(self, bytes, 2) < 0)
2791 return -1;
2792 }
2793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 if (save(self, args, 0) < 0)
2795 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002796
Tim Peters4190fb82003-02-02 16:09:05 +00002797 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002799
Tim Peters4190fb82003-02-02 16:09:05 +00002800 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002804}
2805
2806static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002807Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808{
Tim Peterscba30e22003-02-01 06:24:36 +00002809 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 PyDict_Clear(self->memo);
2811 Py_INCREF(Py_None);
2812 return Py_None;
2813}
2814
2815static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002816Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817{
2818 int l, i, rsize, ssize, clear=1, lm;
2819 long ik;
2820 PyObject *k, *r;
2821 char *s, *p, *have_get;
2822 Pdata *data;
2823
2824 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002825 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 return NULL;
2827
2828 /* Check to make sure we are based on a list */
2829 if (! Pdata_Check(self->file)) {
2830 PyErr_SetString(PicklingError,
2831 "Attempt to getvalue() a non-list-based pickler");
2832 return NULL;
2833 }
2834
2835 /* flush write buffer */
2836 if (write_other(self, NULL, 0) < 0) return NULL;
2837
2838 data=(Pdata*)self->file;
2839 l=data->length;
2840
2841 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002842 lm = PyDict_Size(self->memo);
2843 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002845 have_get = malloc(lm);
2846 if (have_get == NULL) return PyErr_NoMemory();
2847 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848
2849 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002850 for (rsize = 0, i = l; --i >= 0; ) {
2851 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002853 if (PyString_Check(k))
2854 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855
2856 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002857 ik = PyInt_AS_LONG((PyIntObject*)k);
2858 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 PyErr_SetString(PicklingError,
2860 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002861 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 }
Tim Petersac5687a2003-02-02 18:08:34 +00002863 if (have_get[ik]) /* with matching get */
2864 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 }
2866
2867 else if (! (PyTuple_Check(k) &&
2868 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002869 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 ) {
2871 PyErr_SetString(PicklingError,
2872 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002873 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 }
2875
2876 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002877 ik = PyInt_AS_LONG((PyIntObject *)k);
2878 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 PyErr_SetString(PicklingError,
2880 "Invalid get data");
2881 return NULL;
2882 }
Tim Petersac5687a2003-02-02 18:08:34 +00002883 have_get[ik] = 1;
2884 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 }
2887
2888 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002889 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002890 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002891 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892
Tim Petersac5687a2003-02-02 18:08:34 +00002893 for (i = 0; i < l; i++) {
2894 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002895
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002896 if (PyString_Check(k)) {
2897 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002899 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002900 while (--ssize >= 0)
2901 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002902 }
2903 }
2904
2905 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002906 ik = PyInt_AS_LONG((PyIntObject *)
2907 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002908 if (ik < 256) {
2909 *s++ = BINGET;
2910 *s++ = (int)(ik & 0xff);
2911 }
2912 else {
2913 *s++ = LONG_BINGET;
2914 *s++ = (int)(ik & 0xff);
2915 *s++ = (int)((ik >> 8) & 0xff);
2916 *s++ = (int)((ik >> 16) & 0xff);
2917 *s++ = (int)((ik >> 24) & 0xff);
2918 }
2919 }
2920
2921 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002922 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002923
2924 if (have_get[ik]) { /* with matching get */
2925 if (ik < 256) {
2926 *s++ = BINPUT;
2927 *s++ = (int)(ik & 0xff);
2928 }
2929 else {
2930 *s++ = LONG_BINPUT;
2931 *s++ = (int)(ik & 0xff);
2932 *s++ = (int)((ik >> 8) & 0xff);
2933 *s++ = (int)((ik >> 16) & 0xff);
2934 *s++ = (int)((ik >> 24) & 0xff);
2935 }
2936 }
2937 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 }
2939
2940 if (clear) {
2941 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002942 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 }
2944
2945 free(have_get);
2946 return r;
2947 err:
2948 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002949 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002950}
2951
2952static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002953Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954{
2955 PyObject *ob;
2956 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002957
Tim Peterscba30e22003-02-01 06:24:36 +00002958 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 if (dump(self, ob) < 0)
2962 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 /* XXX Why does dump() return self? */
2967 Py_INCREF(self);
2968 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002969}
2970
2971
Tim Peterscba30e22003-02-01 06:24:36 +00002972static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973{
Neal Norwitzb0493252002-03-31 14:44:22 +00002974 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002975 PyDoc_STR("dump(object) -- "
2976 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002977 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002978 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002979 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002980 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002982};
2983
2984
2985static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002986newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987{
2988 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002989
Tim Peters5bd2a792003-02-01 16:45:06 +00002990 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002991 proto = HIGHEST_PROTOCOL;
2992 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002993 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2994 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002995 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002996 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002997 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002998
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002999 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00003000 if (self == NULL)
3001 return NULL;
3002 self->proto = proto;
3003 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 self->fp = NULL;
3005 self->write = NULL;
3006 self->memo = NULL;
3007 self->arg = NULL;
3008 self->pers_func = NULL;
3009 self->inst_pers_func = NULL;
3010 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 self->fast = 0;
3012 self->fast_container = 0;
3013 self->fast_memo = NULL;
3014 self->buf_size = 0;
3015 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003016
Tim Peters5bd2a792003-02-01 16:45:06 +00003017 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003018 if (file)
3019 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00003020 else {
3021 file = Pdata_New();
3022 if (file == NULL)
3023 goto err;
3024 }
3025 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003026
Tim Peterscba30e22003-02-01 06:24:36 +00003027 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030 if (PyFile_Check(file)) {
3031 self->fp = PyFile_AsFile(file);
3032 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00003033 PyErr_SetString(PyExc_ValueError,
3034 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003035 goto err;
3036 }
3037 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00003038 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 else if (PycStringIO_OutputCheck(file)) {
3040 self->write_func = write_cStringIO;
3041 }
3042 else if (file == Py_None) {
3043 self->write_func = write_none;
3044 }
3045 else {
3046 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 if (! Pdata_Check(file)) {
3049 self->write = PyObject_GetAttr(file, write_str);
3050 if (!self->write) {
3051 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003052 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053 "argument must have 'write' "
3054 "attribute");
3055 goto err;
3056 }
3057 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003058
Tim Peters5bd2a792003-02-01 16:45:06 +00003059 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3060 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 PyErr_NoMemory();
3062 goto err;
3063 }
3064 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 if (PyEval_GetRestricted()) {
3067 /* Restricted execution, get private tables */
Alexandre Vassalotti8b2d7132009-11-24 17:53:23 +00003068 PyObject *m = PyImport_ImportModule("copy_reg");
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003069
Tim Peters5b7da392003-02-04 00:21:07 +00003070 if (m == NULL)
3071 goto err;
3072 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00003074 if (self->dispatch_table == NULL)
3075 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 }
3077 else {
Tim Peters5b7da392003-02-04 00:21:07 +00003078 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 Py_INCREF(dispatch_table);
3080 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003081 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003086 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003088}
3089
3090
3091static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003092get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003094 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003096 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003097
Tim Peters92c8bb32003-02-13 23:00:26 +00003098 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003099 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003100 * accepts Pickler() and Pickler(integer) too. The meaning then
3101 * is clear as mud, undocumented, and not supported by pickle.py.
3102 * I'm told Zope uses this, but I haven't traced into this code
3103 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003104 */
3105 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003107 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003108 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3109 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 return NULL;
3111 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003112 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003113}
3114
3115
3116static void
Tim Peterscba30e22003-02-01 06:24:36 +00003117Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003119 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 Py_XDECREF(self->write);
3121 Py_XDECREF(self->memo);
3122 Py_XDECREF(self->fast_memo);
3123 Py_XDECREF(self->arg);
3124 Py_XDECREF(self->file);
3125 Py_XDECREF(self->pers_func);
3126 Py_XDECREF(self->inst_pers_func);
3127 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003128 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003129 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003130}
3131
3132static int
3133Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3134{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003135 Py_VISIT(self->write);
3136 Py_VISIT(self->memo);
3137 Py_VISIT(self->fast_memo);
3138 Py_VISIT(self->arg);
3139 Py_VISIT(self->file);
3140 Py_VISIT(self->pers_func);
3141 Py_VISIT(self->inst_pers_func);
3142 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003143 return 0;
3144}
3145
3146static int
3147Pickler_clear(Picklerobject *self)
3148{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003149 Py_CLEAR(self->write);
3150 Py_CLEAR(self->memo);
3151 Py_CLEAR(self->fast_memo);
3152 Py_CLEAR(self->arg);
3153 Py_CLEAR(self->file);
3154 Py_CLEAR(self->pers_func);
3155 Py_CLEAR(self->inst_pers_func);
3156 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003157 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003158}
3159
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003160static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003161Pickler_get_pers_func(Picklerobject *p)
3162{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 if (p->pers_func == NULL)
3164 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3165 else
3166 Py_INCREF(p->pers_func);
3167 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003168}
3169
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003170static int
3171Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3172{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 if (v == NULL) {
3174 PyErr_SetString(PyExc_TypeError,
3175 "attribute deletion is not supported");
3176 return -1;
3177 }
3178 Py_XDECREF(p->pers_func);
3179 Py_INCREF(v);
3180 p->pers_func = v;
3181 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003182}
3183
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003184static int
3185Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3186{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 if (v == NULL) {
3188 PyErr_SetString(PyExc_TypeError,
3189 "attribute deletion is not supported");
3190 return -1;
3191 }
3192 Py_XDECREF(p->inst_pers_func);
3193 Py_INCREF(v);
3194 p->inst_pers_func = v;
3195 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003196}
3197
3198static PyObject *
3199Pickler_get_memo(Picklerobject *p)
3200{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 if (p->memo == NULL)
3202 PyErr_SetString(PyExc_AttributeError, "memo");
3203 else
3204 Py_INCREF(p->memo);
3205 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003206}
3207
3208static int
3209Pickler_set_memo(Picklerobject *p, PyObject *v)
3210{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 if (v == NULL) {
3212 PyErr_SetString(PyExc_TypeError,
3213 "attribute deletion is not supported");
3214 return -1;
3215 }
3216 if (!PyDict_Check(v)) {
3217 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3218 return -1;
3219 }
3220 Py_XDECREF(p->memo);
3221 Py_INCREF(v);
3222 p->memo = v;
3223 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003224}
3225
3226static PyObject *
3227Pickler_get_error(Picklerobject *p)
3228{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003229 /* why is this an attribute on the Pickler? */
3230 Py_INCREF(PicklingError);
3231 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003232}
3233
3234static PyMemberDef Pickler_members[] = {
3235 {"binary", T_INT, offsetof(Picklerobject, bin)},
3236 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003237 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003238};
3239
3240static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003241 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003242 (setter)Pickler_set_pers_func},
3243 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3244 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003245 {"PicklingError", (getter)Pickler_get_error, NULL},
3246 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003247};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003249PyDoc_STRVAR(Picklertype__doc__,
3250"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003251
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003252static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003253 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003254 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003255 sizeof(Picklerobject), /*tp_basicsize*/
3256 0,
3257 (destructor)Pickler_dealloc, /* tp_dealloc */
3258 0, /* tp_print */
3259 0, /* tp_getattr */
3260 0, /* tp_setattr */
3261 0, /* tp_compare */
3262 0, /* tp_repr */
3263 0, /* tp_as_number */
3264 0, /* tp_as_sequence */
3265 0, /* tp_as_mapping */
3266 0, /* tp_hash */
3267 0, /* tp_call */
3268 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003269 PyObject_GenericGetAttr, /* tp_getattro */
3270 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003271 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003272 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003273 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003274 (traverseproc)Pickler_traverse, /* tp_traverse */
3275 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003276 0, /* tp_richcompare */
3277 0, /* tp_weaklistoffset */
3278 0, /* tp_iter */
3279 0, /* tp_iternext */
3280 Pickler_methods, /* tp_methods */
3281 Pickler_members, /* tp_members */
3282 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003283};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003284
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003285static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003286find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003287{
3288 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 if (fc) {
3291 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003292 PyErr_SetString(UnpicklingError, "Global and instance "
3293 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 return NULL;
3295 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003296 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3297 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 module = PySys_GetObject("modules");
3301 if (module == NULL)
3302 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304 module = PyDict_GetItem(module, py_module_name);
3305 if (module == NULL) {
3306 module = PyImport_Import(py_module_name);
3307 if (!module)
3308 return NULL;
3309 global = PyObject_GetAttr(module, py_global_name);
3310 Py_DECREF(module);
3311 }
3312 else
3313 global = PyObject_GetAttr(module, py_global_name);
3314 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003315}
3316
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003317static int
Tim Peterscba30e22003-02-01 06:24:36 +00003318marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319{
3320 if (self->num_marks < 1) {
3321 PyErr_SetString(UnpicklingError, "could not find MARK");
3322 return -1;
3323 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003325 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326}
3327
Tim Peters84e87f32001-03-17 04:50:51 +00003328
Guido van Rossum60456fd1997-04-09 17:36:32 +00003329static int
Tim Peterscba30e22003-02-01 06:24:36 +00003330load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003331{
3332 PDATA_APPEND(self->stack, Py_None, -1);
3333 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334}
3335
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003336static int
Tim Peterscba30e22003-02-01 06:24:36 +00003337bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338{
3339 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3340 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003341}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
3343static int
Tim Peterscba30e22003-02-01 06:24:36 +00003344load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345{
3346 PyObject *py_int = 0;
3347 char *endptr, *s;
3348 int len, res = -1;
3349 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350
Tim Peters0bc93f52003-02-02 18:29:33 +00003351 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 if (len < 2) return bad_readline();
3353 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 errno = 0;
3356 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3359 /* Hm, maybe we've got something long. Let's try reading
3360 it as a Python long object. */
3361 errno = 0;
3362 py_int = PyLong_FromString(s, NULL, 0);
3363 if (py_int == NULL) {
3364 PyErr_SetString(PyExc_ValueError,
3365 "could not convert string to int");
3366 goto finally;
3367 }
3368 }
3369 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003370 if (len == 3 && (l == 0 || l == 1)) {
3371 if (!( py_int = PyBool_FromLong(l))) goto finally;
3372 }
3373 else {
3374 if (!( py_int = PyInt_FromLong(l))) goto finally;
3375 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378 free(s);
3379 PDATA_PUSH(self->stack, py_int, -1);
3380 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 finally:
3383 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386}
3387
Tim Peters3c67d792003-02-02 17:59:11 +00003388static int
3389load_bool(Unpicklerobject *self, PyObject *boolean)
3390{
3391 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003392 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003393 return 0;
3394}
3395
Tim Petersee1a53c2003-02-02 02:57:53 +00003396/* s contains x bytes of a little-endian integer. Return its value as a
3397 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3398 * int, but when x is 4 it's a signed one. This is an historical source
3399 * of x-platform bugs.
3400 */
Tim Peters84e87f32001-03-17 04:50:51 +00003401static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003402calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403{
3404 unsigned char c;
3405 int i;
3406 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 for (i = 0, l = 0L; i < x; i++) {
3409 c = (unsigned char)s[i];
3410 l |= (long)c << (i * 8);
3411 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003412#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3414 * is signed, so on a box with longs bigger than 4 bytes we need
3415 * to extend a BININT's sign bit to the full width.
3416 */
3417 if (x == 4 && l & (1L << 31))
3418 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003419#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421}
3422
3423
3424static int
Tim Peterscba30e22003-02-01 06:24:36 +00003425load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426{
3427 PyObject *py_int = 0;
3428 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Tim Peterscba30e22003-02-01 06:24:36 +00003432 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435 PDATA_PUSH(self->stack, py_int, -1);
3436 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437}
3438
3439
3440static int
Tim Peterscba30e22003-02-01 06:24:36 +00003441load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442{
3443 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Tim Peters0bc93f52003-02-02 18:29:33 +00003445 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449}
3450
3451
3452static int
Tim Peterscba30e22003-02-01 06:24:36 +00003453load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454{
3455 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456
Tim Peters0bc93f52003-02-02 18:29:33 +00003457 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461}
3462
3463
3464static int
Tim Peterscba30e22003-02-01 06:24:36 +00003465load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003466{
3467 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468
Tim Peters0bc93f52003-02-02 18:29:33 +00003469 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003473}
Tim Peters84e87f32001-03-17 04:50:51 +00003474
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475static int
Tim Peterscba30e22003-02-01 06:24:36 +00003476load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477{
3478 PyObject *l = 0;
3479 char *end, *s;
3480 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481
Tim Peters0bc93f52003-02-02 18:29:33 +00003482 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483 if (len < 2) return bad_readline();
3484 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Tim Peterscba30e22003-02-01 06:24:36 +00003486 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489 free(s);
3490 PDATA_PUSH(self->stack, l, -1);
3491 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 finally:
3494 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497}
3498
Tim Petersee1a53c2003-02-02 02:57:53 +00003499/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3500 * data following.
3501 */
3502static int
3503load_counted_long(Unpicklerobject *self, int size)
3504{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003505 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003506 char *nbytes;
3507 unsigned char *pdata;
3508 PyObject *along;
3509
3510 assert(size == 1 || size == 4);
3511 i = self->read_func(self, &nbytes, size);
3512 if (i < 0) return -1;
3513
3514 size = calc_binint(nbytes, size);
3515 if (size < 0) {
3516 /* Corrupt or hostile pickle -- we never write one like
3517 * this.
3518 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003519 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003520 "byte count");
3521 return -1;
3522 }
3523
3524 if (size == 0)
3525 along = PyLong_FromLong(0L);
3526 else {
3527 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003528 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003529 if (i < 0) return -1;
3530 along = _PyLong_FromByteArray(pdata, (size_t)size,
3531 1 /* little endian */, 1 /* signed */);
3532 }
3533 if (along == NULL)
3534 return -1;
3535 PDATA_PUSH(self->stack, along, -1);
3536 return 0;
3537}
Tim Peters84e87f32001-03-17 04:50:51 +00003538
Guido van Rossum60456fd1997-04-09 17:36:32 +00003539static int
Tim Peterscba30e22003-02-01 06:24:36 +00003540load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541{
3542 PyObject *py_float = 0;
3543 char *endptr, *s;
3544 int len, res = -1;
3545 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003546
Tim Peters0bc93f52003-02-02 18:29:33 +00003547 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 if (len < 2) return bad_readline();
3549 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Eric Smith97be1ca2009-10-27 11:32:11 +00003551 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552
Eric Smith97be1ca2009-10-27 11:32:11 +00003553 if (d == -1.0 && PyErr_Occurred()) {
3554 goto finally;
3555 } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003556 PyErr_SetString(PyExc_ValueError,
3557 "could not convert string to float");
3558 goto finally;
3559 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003560
Tim Peterscba30e22003-02-01 06:24:36 +00003561 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003562 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 free(s);
3565 PDATA_PUSH(self->stack, py_float, -1);
3566 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 finally:
3569 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572}
3573
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574static int
Tim Peterscba30e22003-02-01 06:24:36 +00003575load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003576{
Tim Peters9905b942003-03-20 20:53:32 +00003577 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 double x;
3579 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003580
Tim Peters0bc93f52003-02-02 18:29:33 +00003581 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003583
Tim Peters9905b942003-03-20 20:53:32 +00003584 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3585 if (x == -1.0 && PyErr_Occurred())
3586 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Tim Peters9905b942003-03-20 20:53:32 +00003588 py_float = PyFloat_FromDouble(x);
3589 if (py_float == NULL)
3590 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592 PDATA_PUSH(self->stack, py_float, -1);
3593 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595
3596static int
Tim Peterscba30e22003-02-01 06:24:36 +00003597load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598{
3599 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003600 int len, res = -1;
3601 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003602
Tim Peters0bc93f52003-02-02 18:29:33 +00003603 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if (len < 2) return bad_readline();
3605 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003607
3608 /* Strip outermost quotes */
3609 while (s[len-1] <= ' ')
3610 len--;
3611 if(s[0]=='"' && s[len-1]=='"'){
3612 s[len-1] = '\0';
3613 p = s + 1 ;
3614 len -= 2;
3615 } else if(s[0]=='\'' && s[len-1]=='\''){
3616 s[len-1] = '\0';
3617 p = s + 1 ;
3618 len -= 2;
3619 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620 goto insecure;
3621 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003622
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003623 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003624 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003625 if (str) {
3626 PDATA_PUSH(self->stack, str, -1);
3627 res = 0;
3628 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 insecure:
3632 free(s);
3633 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3634 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003635}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003636
3637
3638static int
Tim Peterscba30e22003-02-01 06:24:36 +00003639load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003640{
3641 PyObject *py_string = 0;
3642 long l;
3643 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003644
Tim Peters0bc93f52003-02-02 18:29:33 +00003645 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003647 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003648 if (l < 0) {
3649 /* Corrupt or hostile pickle -- we never write one like
3650 * this.
3651 */
3652 PyErr_SetString(UnpicklingError,
3653 "BINSTRING pickle has negative byte count");
3654 return -1;
3655 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Tim Peters0bc93f52003-02-02 18:29:33 +00003657 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003659
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003660 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003663 PDATA_PUSH(self->stack, py_string, -1);
3664 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665}
3666
3667
3668static int
Tim Peterscba30e22003-02-01 06:24:36 +00003669load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670{
3671 PyObject *py_string = 0;
3672 unsigned char l;
3673 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003674
Tim Peters0bc93f52003-02-02 18:29:33 +00003675 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003679
Tim Peters0bc93f52003-02-02 18:29:33 +00003680 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003681
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003682 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 PDATA_PUSH(self->stack, py_string, -1);
3685 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003686}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
3688
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003689#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003690static int
Tim Peterscba30e22003-02-01 06:24:36 +00003691load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692{
3693 PyObject *str = 0;
3694 int len, res = -1;
3695 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003696
Tim Peters0bc93f52003-02-02 18:29:33 +00003697 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003699
Tim Peterscba30e22003-02-01 06:24:36 +00003700 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003701 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 PDATA_PUSH(self->stack, str, -1);
3704 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 finally:
3707 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003708}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003709#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003710
3711
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003712#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003713static int
Tim Peterscba30e22003-02-01 06:24:36 +00003714load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715{
3716 PyObject *unicode;
3717 long l;
3718 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003719
Tim Peters0bc93f52003-02-02 18:29:33 +00003720 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003723 if (l < 0) {
3724 /* Corrupt or hostile pickle -- we never write one like
3725 * this.
3726 */
3727 PyErr_SetString(UnpicklingError,
3728 "BINUNICODE pickle has negative byte count");
3729 return -1;
3730 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003731
Tim Peters0bc93f52003-02-02 18:29:33 +00003732 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003733 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003734
Tim Peterscba30e22003-02-01 06:24:36 +00003735 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738 PDATA_PUSH(self->stack, unicode, -1);
3739 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003740}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003741#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003742
3743
3744static int
Tim Peterscba30e22003-02-01 06:24:36 +00003745load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746{
3747 PyObject *tup;
3748 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750 if ((i = marker(self)) < 0) return -1;
3751 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3752 PDATA_PUSH(self->stack, tup, -1);
3753 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003754}
3755
3756static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003757load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003759 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003760
Tim Peters1d63c9f2003-02-02 20:29:39 +00003761 if (tup == NULL)
3762 return -1;
3763
3764 while (--len >= 0) {
3765 PyObject *element;
3766
3767 PDATA_POP(self->stack, element);
3768 if (element == NULL)
3769 return -1;
3770 PyTuple_SET_ITEM(tup, len, element);
3771 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 PDATA_PUSH(self->stack, tup, -1);
3773 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774}
3775
3776static int
Tim Peterscba30e22003-02-01 06:24:36 +00003777load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778{
3779 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 if (!( list=PyList_New(0))) return -1;
3782 PDATA_PUSH(self->stack, list, -1);
3783 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784}
3785
3786static int
Tim Peterscba30e22003-02-01 06:24:36 +00003787load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788{
3789 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791 if (!( dict=PyDict_New())) return -1;
3792 PDATA_PUSH(self->stack, dict, -1);
3793 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794}
3795
3796
3797static int
Tim Peterscba30e22003-02-01 06:24:36 +00003798load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799{
3800 PyObject *list = 0;
3801 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 if ((i = marker(self)) < 0) return -1;
3804 if (!( list=Pdata_popList(self->stack, i))) return -1;
3805 PDATA_PUSH(self->stack, list, -1);
3806 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807}
3808
3809static int
Tim Peterscba30e22003-02-01 06:24:36 +00003810load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811{
3812 PyObject *dict, *key, *value;
3813 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815 if ((i = marker(self)) < 0) return -1;
3816 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003820 for (k = i+1; k < j; k += 2) {
3821 key =self->stack->data[k-1];
3822 value=self->stack->data[k ];
3823 if (PyDict_SetItem(dict, key, value) < 0) {
3824 Py_DECREF(dict);
3825 return -1;
3826 }
3827 }
3828 Pdata_clear(self->stack, i);
3829 PDATA_PUSH(self->stack, dict, -1);
3830 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003831}
3832
3833static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003834Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003836 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 if (PyClass_Check(cls)) {
3839 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 if ((l=PyObject_Size(args)) < 0) goto err;
3842 if (!( l )) {
3843 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003844
Tim Peterscba30e22003-02-01 06:24:36 +00003845 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003846 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003847 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003848 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 so bypass usual construction */
3850 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003852 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003853 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 goto err;
3855 return inst;
3856 }
3857 Py_DECREF(__getinitargs__);
3858 }
Tim Peters84e87f32001-03-17 04:50:51 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 if ((r=PyInstance_New(cls, args, NULL))) return r;
3861 else goto err;
3862 }
Tim Peters84e87f32001-03-17 04:50:51 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 err:
3867 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003868 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003871 tmp_value = v;
3872 /* NULL occurs when there was a KeyboardInterrupt */
3873 if (tmp_value == NULL)
3874 tmp_value = Py_None;
3875 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 Py_XDECREF(v);
3877 v=r;
3878 }
3879 PyErr_Restore(tp,v,tb);
3880 }
3881 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003882}
Tim Peters84e87f32001-03-17 04:50:51 +00003883
Guido van Rossum60456fd1997-04-09 17:36:32 +00003884
3885static int
Tim Peterscba30e22003-02-01 06:24:36 +00003886load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003887{
3888 PyObject *class, *tup, *obj=0;
3889 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 if ((i = marker(self)) < 0) return -1;
3892 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3893 PDATA_POP(self->stack, class);
3894 if (class) {
3895 obj = Instance_New(class, tup);
3896 Py_DECREF(class);
3897 }
3898 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 if (! obj) return -1;
3901 PDATA_PUSH(self->stack, obj, -1);
3902 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903}
3904
3905
3906static int
Tim Peterscba30e22003-02-01 06:24:36 +00003907load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908{
3909 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3910 int i, len;
3911 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003913 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003914
Tim Peters0bc93f52003-02-02 18:29:33 +00003915 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003917 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003918 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003919
Tim Peters0bc93f52003-02-02 18:29:33 +00003920 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003922 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003923 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 self->find_class);
3925 Py_DECREF(class_name);
3926 }
3927 }
3928 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 if ((tup=Pdata_popTuple(self->stack, i))) {
3933 obj = Instance_New(class, tup);
3934 Py_DECREF(tup);
3935 }
3936 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003940 PDATA_PUSH(self->stack, obj, -1);
3941 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942}
3943
Tim Peterseab7db32003-02-13 18:24:14 +00003944static int
3945load_newobj(Unpicklerobject *self)
3946{
3947 PyObject *args = NULL;
3948 PyObject *clsraw = NULL;
3949 PyTypeObject *cls; /* clsraw cast to its true type */
3950 PyObject *obj;
3951
3952 /* Stack is ... cls argtuple, and we want to call
3953 * cls.__new__(cls, *argtuple).
3954 */
3955 PDATA_POP(self->stack, args);
3956 if (args == NULL) goto Fail;
3957 if (! PyTuple_Check(args)) {
3958 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3959 "tuple.");
3960 goto Fail;
3961 }
3962
3963 PDATA_POP(self->stack, clsraw);
3964 cls = (PyTypeObject *)clsraw;
3965 if (cls == NULL) goto Fail;
3966 if (! PyType_Check(cls)) {
3967 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3968 "isn't a type object");
3969 goto Fail;
3970 }
3971 if (cls->tp_new == NULL) {
3972 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3973 "has NULL tp_new");
3974 goto Fail;
3975 }
3976
3977 /* Call __new__. */
3978 obj = cls->tp_new(cls, args, NULL);
3979 if (obj == NULL) goto Fail;
3980
3981 Py_DECREF(args);
3982 Py_DECREF(clsraw);
3983 PDATA_PUSH(self->stack, obj, -1);
3984 return 0;
3985
3986 Fail:
3987 Py_XDECREF(args);
3988 Py_XDECREF(clsraw);
3989 return -1;
3990}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003991
3992static int
Tim Peterscba30e22003-02-01 06:24:36 +00003993load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994{
3995 PyObject *class = 0, *module_name = 0, *class_name = 0;
3996 int len;
3997 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003998
Tim Peters0bc93f52003-02-02 18:29:33 +00003999 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004001 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003
Tim Peters0bc93f52003-02-02 18:29:33 +00004004 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00004005 if (len < 2) {
4006 Py_DECREF(module_name);
4007 return bad_readline();
4008 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004009 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00004010 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011 self->find_class);
4012 Py_DECREF(class_name);
4013 }
4014 }
4015 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 if (! class) return -1;
4018 PDATA_PUSH(self->stack, class, -1);
4019 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004020}
4021
4022
4023static int
Tim Peterscba30e22003-02-01 06:24:36 +00004024load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004025{
4026 PyObject *pid = 0;
4027 int len;
4028 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004030 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004031 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004032 if (len < 2) return bad_readline();
4033
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004034 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035 if (!pid) return -1;
4036
4037 if (PyList_Check(self->pers_func)) {
4038 if (PyList_Append(self->pers_func, pid) < 0) {
4039 Py_DECREF(pid);
4040 return -1;
4041 }
4042 }
4043 else {
4044 ARG_TUP(self, pid);
4045 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004046 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004047 NULL);
4048 FREE_ARG_TUP(self);
4049 }
4050 }
4051
4052 if (! pid) return -1;
4053
4054 PDATA_PUSH(self->stack, pid, -1);
4055 return 0;
4056 }
4057 else {
4058 PyErr_SetString(UnpicklingError,
4059 "A load persistent id instruction was encountered,\n"
4060 "but no persistent_load function was specified.");
4061 return -1;
4062 }
4063}
4064
4065static int
Tim Peterscba30e22003-02-01 06:24:36 +00004066load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067{
4068 PyObject *pid = 0;
4069
4070 if (self->pers_func) {
4071 PDATA_POP(self->stack, pid);
4072 if (! pid) return -1;
4073
4074 if (PyList_Check(self->pers_func)) {
4075 if (PyList_Append(self->pers_func, pid) < 0) {
4076 Py_DECREF(pid);
4077 return -1;
4078 }
4079 }
4080 else {
4081 ARG_TUP(self, pid);
4082 if (self->arg) {
4083 pid = PyObject_Call(self->pers_func, self->arg,
4084 NULL);
4085 FREE_ARG_TUP(self);
4086 }
4087 if (! pid) return -1;
4088 }
4089
4090 PDATA_PUSH(self->stack, pid, -1);
4091 return 0;
4092 }
4093 else {
4094 PyErr_SetString(UnpicklingError,
4095 "A load persistent id instruction was encountered,\n"
4096 "but no persistent_load function was specified.");
4097 return -1;
4098 }
4099}
4100
4101
4102static int
Tim Peterscba30e22003-02-01 06:24:36 +00004103load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104{
Collin Winter57bef682009-05-26 04:12:39 +00004105 int len = self->stack->length;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106
4107 /* Note that we split the (pickle.py) stack into two stacks,
4108 an object stack and a mark stack. We have to be clever and
4109 pop the right one. We do this by looking at the top of the
Collin Winter57bef682009-05-26 04:12:39 +00004110 mark stack first, and only signalling a stack underflow if
4111 the object stack is empty and the mark stack doesn't match
4112 our expectations.
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 */
Collin Winter57bef682009-05-26 04:12:39 +00004114 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004115 self->num_marks--;
Antoine Pitrou0d423b82010-01-07 17:46:49 +00004116 } else if (len > 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 len--;
4118 Py_DECREF(self->stack->data[len]);
Collin Winter57bef682009-05-26 04:12:39 +00004119 self->stack->length = len;
4120 } else {
4121 return stackUnderflow();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004123 return 0;
4124}
4125
4126
4127static int
Tim Peterscba30e22003-02-01 06:24:36 +00004128load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129{
4130 int i;
4131
4132 if ((i = marker(self)) < 0)
4133 return -1;
4134
4135 Pdata_clear(self->stack, i);
4136
4137 return 0;
4138}
4139
4140
4141static int
Tim Peterscba30e22003-02-01 06:24:36 +00004142load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004143{
4144 PyObject *last;
4145 int len;
4146
4147 if ((len = self->stack->length) <= 0) return stackUnderflow();
4148 last=self->stack->data[len-1];
4149 Py_INCREF(last);
4150 PDATA_PUSH(self->stack, last, -1);
4151 return 0;
4152}
4153
4154
4155static int
Tim Peterscba30e22003-02-01 06:24:36 +00004156load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157{
4158 PyObject *py_str = 0, *value = 0;
4159 int len;
4160 char *s;
4161 int rc;
4162
Tim Peters0bc93f52003-02-02 18:29:33 +00004163 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004164 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004165
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004166 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 value = PyDict_GetItem(self->memo, py_str);
4169 if (! value) {
4170 PyErr_SetObject(BadPickleGet, py_str);
4171 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004172 }
4173 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 PDATA_APPEND(self->stack, value, -1);
4175 rc = 0;
4176 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 Py_DECREF(py_str);
4179 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180}
4181
4182
4183static int
Tim Peterscba30e22003-02-01 06:24:36 +00004184load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185{
4186 PyObject *py_key = 0, *value = 0;
4187 unsigned char key;
4188 char *s;
4189 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004190
Tim Peters0bc93f52003-02-02 18:29:33 +00004191 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 key = (unsigned char)s[0];
4194 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 value = PyDict_GetItem(self->memo, py_key);
4197 if (! value) {
4198 PyErr_SetObject(BadPickleGet, py_key);
4199 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004200 }
4201 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 PDATA_APPEND(self->stack, value, -1);
4203 rc = 0;
4204 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 Py_DECREF(py_key);
4207 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208}
4209
4210
4211static int
Tim Peterscba30e22003-02-01 06:24:36 +00004212load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213{
4214 PyObject *py_key = 0, *value = 0;
4215 unsigned char c;
4216 char *s;
4217 long key;
4218 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004219
Tim Peters0bc93f52003-02-02 18:29:33 +00004220 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 c = (unsigned char)s[0];
4223 key = (long)c;
4224 c = (unsigned char)s[1];
4225 key |= (long)c << 8;
4226 c = (unsigned char)s[2];
4227 key |= (long)c << 16;
4228 c = (unsigned char)s[3];
4229 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4232
4233 value = PyDict_GetItem(self->memo, py_key);
4234 if (! value) {
4235 PyErr_SetObject(BadPickleGet, py_key);
4236 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004237 }
4238 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 PDATA_APPEND(self->stack, value, -1);
4240 rc = 0;
4241 }
4242
4243 Py_DECREF(py_key);
4244 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245}
4246
Tim Peters2d629652003-02-04 05:06:17 +00004247/* Push an object from the extension registry (EXT[124]). nbytes is
4248 * the number of bytes following the opcode, holding the index (code) value.
4249 */
4250static int
4251load_extension(Unpicklerobject *self, int nbytes)
4252{
4253 char *codebytes; /* the nbytes bytes after the opcode */
4254 long code; /* calc_binint returns long */
4255 PyObject *py_code; /* code as a Python int */
4256 PyObject *obj; /* the object to push */
4257 PyObject *pair; /* (module_name, class_name) */
4258 PyObject *module_name, *class_name;
4259
4260 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4261 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4262 code = calc_binint(codebytes, nbytes);
4263 if (code <= 0) { /* note that 0 is forbidden */
4264 /* Corrupt or hostile pickle. */
4265 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4266 return -1;
4267 }
4268
4269 /* Look for the code in the cache. */
4270 py_code = PyInt_FromLong(code);
4271 if (py_code == NULL) return -1;
4272 obj = PyDict_GetItem(extension_cache, py_code);
4273 if (obj != NULL) {
4274 /* Bingo. */
4275 Py_DECREF(py_code);
4276 PDATA_APPEND(self->stack, obj, -1);
4277 return 0;
4278 }
4279
4280 /* Look up the (module_name, class_name) pair. */
4281 pair = PyDict_GetItem(inverted_registry, py_code);
4282 if (pair == NULL) {
4283 Py_DECREF(py_code);
4284 PyErr_Format(PyExc_ValueError, "unregistered extension "
4285 "code %ld", code);
4286 return -1;
4287 }
4288 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004289 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004290 */
4291 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004292 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4293 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004294 Py_DECREF(py_code);
4295 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4296 "isn't a 2-tuple of strings", code);
4297 return -1;
4298 }
4299 /* Load the object. */
4300 obj = find_class(module_name, class_name, self->find_class);
4301 if (obj == NULL) {
4302 Py_DECREF(py_code);
4303 return -1;
4304 }
4305 /* Cache code -> obj. */
4306 code = PyDict_SetItem(extension_cache, py_code, obj);
4307 Py_DECREF(py_code);
4308 if (code < 0) {
4309 Py_DECREF(obj);
4310 return -1;
4311 }
4312 PDATA_PUSH(self->stack, obj, -1);
4313 return 0;
4314}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
4316static int
Tim Peterscba30e22003-02-01 06:24:36 +00004317load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318{
4319 PyObject *py_str = 0, *value = 0;
4320 int len, l;
4321 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004322
Tim Peters0bc93f52003-02-02 18:29:33 +00004323 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004324 if (l < 2) return bad_readline();
4325 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004326 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 value=self->stack->data[len-1];
4328 l=PyDict_SetItem(self->memo, py_str, value);
4329 Py_DECREF(py_str);
4330 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004331}
4332
4333
4334static int
Tim Peterscba30e22003-02-01 06:24:36 +00004335load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336{
4337 PyObject *py_key = 0, *value = 0;
4338 unsigned char key;
4339 char *s;
4340 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004341
Tim Peters0bc93f52003-02-02 18:29:33 +00004342 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004343 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4348 value=self->stack->data[len-1];
4349 len=PyDict_SetItem(self->memo, py_key, value);
4350 Py_DECREF(py_key);
4351 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004352}
4353
4354
4355static int
Tim Peterscba30e22003-02-01 06:24:36 +00004356load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357{
4358 PyObject *py_key = 0, *value = 0;
4359 long key;
4360 unsigned char c;
4361 char *s;
4362 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004363
Tim Peters0bc93f52003-02-02 18:29:33 +00004364 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 c = (unsigned char)s[0];
4368 key = (long)c;
4369 c = (unsigned char)s[1];
4370 key |= (long)c << 8;
4371 c = (unsigned char)s[2];
4372 key |= (long)c << 16;
4373 c = (unsigned char)s[3];
4374 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 if (!( py_key = PyInt_FromLong(key))) return -1;
4377 value=self->stack->data[len-1];
4378 len=PyDict_SetItem(self->memo, py_key, value);
4379 Py_DECREF(py_key);
4380 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381}
4382
4383
4384static int
Tim Peterscba30e22003-02-01 06:24:36 +00004385do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386{
4387 PyObject *value = 0, *list = 0, *append_method = 0;
4388 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 len=self->stack->length;
4391 if (!( len >= x && x > 0 )) return stackUnderflow();
4392 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004393 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 if (PyList_Check(list)) {
4398 PyObject *slice;
4399 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004402 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 list_len = PyList_GET_SIZE(list);
4404 i=PyList_SetSlice(list, list_len, list_len, slice);
4405 Py_DECREF(slice);
4406 return i;
4407 }
4408 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004409
Tim Peterscba30e22003-02-01 06:24:36 +00004410 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 return -1;
4412
4413 for (i = x; i < len; i++) {
4414 PyObject *junk;
4415
4416 value=self->stack->data[i];
4417 junk=0;
4418 ARG_TUP(self, value);
4419 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004420 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 NULL);
4422 FREE_ARG_TUP(self);
4423 }
4424 if (! junk) {
4425 Pdata_clear(self->stack, i+1);
4426 self->stack->length=x;
4427 Py_DECREF(append_method);
4428 return -1;
4429 }
4430 Py_DECREF(junk);
4431 }
4432 self->stack->length=x;
4433 Py_DECREF(append_method);
4434 }
4435
4436 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437}
4438
4439
4440static int
Tim Peterscba30e22003-02-01 06:24:36 +00004441load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442{
4443 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444}
4445
4446
4447static int
Tim Peterscba30e22003-02-01 06:24:36 +00004448load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449{
4450 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004451}
4452
4453
4454static int
Tim Peterscba30e22003-02-01 06:24:36 +00004455do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456{
4457 PyObject *value = 0, *key = 0, *dict = 0;
4458 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 if (!( (len=self->stack->length) >= x
4461 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004463 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 for (i = x+1; i < len; i += 2) {
4466 key =self->stack->data[i-1];
4467 value=self->stack->data[i ];
4468 if (PyObject_SetItem(dict, key, value) < 0) {
4469 r=-1;
4470 break;
4471 }
4472 }
4473
4474 Pdata_clear(self->stack, x);
4475
4476 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004477}
4478
4479
Tim Peters84e87f32001-03-17 04:50:51 +00004480static int
Tim Peterscba30e22003-02-01 06:24:36 +00004481load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482{
4483 return do_setitems(self, self->stack->length - 2);
4484}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486static int
Tim Peterscba30e22003-02-01 06:24:36 +00004487load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488{
4489 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004490}
4491
Tim Peters84e87f32001-03-17 04:50:51 +00004492
Guido van Rossum60456fd1997-04-09 17:36:32 +00004493static int
Tim Peterscba30e22003-02-01 06:24:36 +00004494load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495{
Tim Peters080c88b2003-02-15 03:01:11 +00004496 PyObject *state, *inst, *slotstate;
4497 PyObject *__setstate__;
4498 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004499 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004500 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501
Tim Peters080c88b2003-02-15 03:01:11 +00004502 /* Stack is ... instance, state. We want to leave instance at
4503 * the stack top, possibly mutated via instance.__setstate__(state).
4504 */
4505 if (self->stack->length < 2)
4506 return stackUnderflow();
4507 PDATA_POP(self->stack, state);
4508 if (state == NULL)
4509 return -1;
4510 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511
Tim Peters080c88b2003-02-15 03:01:11 +00004512 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4513 if (__setstate__ != NULL) {
4514 PyObject *junk = NULL;
4515
4516 /* The explicit __setstate__ is responsible for everything. */
4517 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 if (self->arg) {
4519 junk = PyObject_Call(__setstate__, self->arg, NULL);
4520 FREE_ARG_TUP(self);
4521 }
4522 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004523 if (junk == NULL)
4524 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 Py_DECREF(junk);
4526 return 0;
4527 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004528 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4529 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004531
4532 /* A default __setstate__. First see whether state embeds a
4533 * slot state dict too (a proto 2 addition).
4534 */
4535 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4536 PyObject *temp = state;
4537 state = PyTuple_GET_ITEM(temp, 0);
4538 slotstate = PyTuple_GET_ITEM(temp, 1);
4539 Py_INCREF(state);
4540 Py_INCREF(slotstate);
4541 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 }
Tim Peters080c88b2003-02-15 03:01:11 +00004543 else
4544 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545
Tim Peters080c88b2003-02-15 03:01:11 +00004546 /* Set inst.__dict__ from the state dict (if any). */
4547 if (state != Py_None) {
4548 PyObject *dict;
4549 if (! PyDict_Check(state)) {
4550 PyErr_SetString(UnpicklingError, "state is not a "
4551 "dictionary");
4552 goto finally;
4553 }
4554 dict = PyObject_GetAttr(inst, __dict___str);
4555 if (dict == NULL)
4556 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557
Tim Peters080c88b2003-02-15 03:01:11 +00004558 i = 0;
4559 while (PyDict_Next(state, &i, &d_key, &d_value)) {
Antoine Pitrou74309892009-05-02 21:13:23 +00004560 /* normally the keys for instance attributes are
4561 interned. we should try to do that here. */
4562 Py_INCREF(d_key);
4563 if (PyString_CheckExact(d_key))
4564 PyString_InternInPlace(&d_key);
4565 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4566 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004567 goto finally;
Antoine Pitrou74309892009-05-02 21:13:23 +00004568 }
4569 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004570 }
4571 Py_DECREF(dict);
4572 }
4573
4574 /* Also set instance attributes from the slotstate dict (if any). */
4575 if (slotstate != NULL) {
4576 if (! PyDict_Check(slotstate)) {
4577 PyErr_SetString(UnpicklingError, "slot state is not "
4578 "a dictionary");
4579 goto finally;
4580 }
4581 i = 0;
4582 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4583 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4584 goto finally;
4585 }
4586 }
4587 res = 0;
4588
4589 finally:
4590 Py_DECREF(state);
4591 Py_XDECREF(slotstate);
4592 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004593}
4594
4595
4596static int
Tim Peterscba30e22003-02-01 06:24:36 +00004597load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598{
4599 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 /* Note that we split the (pickle.py) stack into two stacks, an
4602 object stack and a mark stack. Here we push a mark onto the
4603 mark stack.
4604 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004607 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 s=self->marks_size+20;
4609 if (s <= self->num_marks) s=self->num_marks + 1;
4610 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004611 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004613 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004615 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 PyErr_NoMemory();
4617 return -1;
4618 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004619 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004620 self->marks_size = s;
4621 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004625 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626}
4627
Guido van Rossum60456fd1997-04-09 17:36:32 +00004628static int
Tim Peterscba30e22003-02-01 06:24:36 +00004629load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630{
4631 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 PDATA_POP(self->stack, arg_tup);
4634 if (! arg_tup) return -1;
4635 PDATA_POP(self->stack, callable);
4636 if (callable) {
4637 ob = Instance_New(callable, arg_tup);
4638 Py_DECREF(callable);
4639 }
4640 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 PDATA_PUSH(self->stack, ob, -1);
4645 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004646}
Tim Peters84e87f32001-03-17 04:50:51 +00004647
Tim Peters4190fb82003-02-02 16:09:05 +00004648/* Just raises an error if we don't know the protocol specified. PROTO
4649 * is the first opcode for protocols >= 2.
4650 */
4651static int
4652load_proto(Unpicklerobject *self)
4653{
4654 int i;
4655 char *protobyte;
4656
4657 i = self->read_func(self, &protobyte, 1);
4658 if (i < 0)
4659 return -1;
4660
4661 i = calc_binint(protobyte, 1);
4662 /* No point checking for < 0, since calc_binint returns an unsigned
4663 * int when chewing on 1 byte.
4664 */
4665 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004666 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004667 return 0;
4668
4669 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4670 return -1;
4671}
4672
Guido van Rossum60456fd1997-04-09 17:36:32 +00004673static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004674load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675{
4676 PyObject *err = 0, *val = 0;
4677 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 self->num_marks = 0;
4680 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004682 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004683 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 switch (s[0]) {
4687 case NONE:
4688 if (load_none(self) < 0)
4689 break;
4690 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 case BININT:
4693 if (load_binint(self) < 0)
4694 break;
4695 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 case BININT1:
4698 if (load_binint1(self) < 0)
4699 break;
4700 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 case BININT2:
4703 if (load_binint2(self) < 0)
4704 break;
4705 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004707 case INT:
4708 if (load_int(self) < 0)
4709 break;
4710 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 case LONG:
4713 if (load_long(self) < 0)
4714 break;
4715 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004716
Tim Petersee1a53c2003-02-02 02:57:53 +00004717 case LONG1:
4718 if (load_counted_long(self, 1) < 0)
4719 break;
4720 continue;
4721
4722 case LONG4:
4723 if (load_counted_long(self, 4) < 0)
4724 break;
4725 continue;
4726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 case FLOAT:
4728 if (load_float(self) < 0)
4729 break;
4730 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 case BINFLOAT:
4733 if (load_binfloat(self) < 0)
4734 break;
4735 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case BINSTRING:
4738 if (load_binstring(self) < 0)
4739 break;
4740 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 case SHORT_BINSTRING:
4743 if (load_short_binstring(self) < 0)
4744 break;
4745 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 case STRING:
4748 if (load_string(self) < 0)
4749 break;
4750 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004751
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004752#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 case UNICODE:
4754 if (load_unicode(self) < 0)
4755 break;
4756 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 case BINUNICODE:
4759 if (load_binunicode(self) < 0)
4760 break;
4761 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004762#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004765 if (load_counted_tuple(self, 0) < 0)
4766 break;
4767 continue;
4768
4769 case TUPLE1:
4770 if (load_counted_tuple(self, 1) < 0)
4771 break;
4772 continue;
4773
4774 case TUPLE2:
4775 if (load_counted_tuple(self, 2) < 0)
4776 break;
4777 continue;
4778
4779 case TUPLE3:
4780 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 break;
4782 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case TUPLE:
4785 if (load_tuple(self) < 0)
4786 break;
4787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case EMPTY_LIST:
4790 if (load_empty_list(self) < 0)
4791 break;
4792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 case LIST:
4795 if (load_list(self) < 0)
4796 break;
4797 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 case EMPTY_DICT:
4800 if (load_empty_dict(self) < 0)
4801 break;
4802 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 case DICT:
4805 if (load_dict(self) < 0)
4806 break;
4807 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case OBJ:
4810 if (load_obj(self) < 0)
4811 break;
4812 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case INST:
4815 if (load_inst(self) < 0)
4816 break;
4817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818
Tim Peterseab7db32003-02-13 18:24:14 +00004819 case NEWOBJ:
4820 if (load_newobj(self) < 0)
4821 break;
4822 continue;
4823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case GLOBAL:
4825 if (load_global(self) < 0)
4826 break;
4827 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case APPEND:
4830 if (load_append(self) < 0)
4831 break;
4832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case APPENDS:
4835 if (load_appends(self) < 0)
4836 break;
4837 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 case BUILD:
4840 if (load_build(self) < 0)
4841 break;
4842 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 case DUP:
4845 if (load_dup(self) < 0)
4846 break;
4847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case BINGET:
4850 if (load_binget(self) < 0)
4851 break;
4852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 case LONG_BINGET:
4855 if (load_long_binget(self) < 0)
4856 break;
4857 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 case GET:
4860 if (load_get(self) < 0)
4861 break;
4862 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004863
Tim Peters2d629652003-02-04 05:06:17 +00004864 case EXT1:
4865 if (load_extension(self, 1) < 0)
4866 break;
4867 continue;
4868
4869 case EXT2:
4870 if (load_extension(self, 2) < 0)
4871 break;
4872 continue;
4873
4874 case EXT4:
4875 if (load_extension(self, 4) < 0)
4876 break;
4877 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 case MARK:
4879 if (load_mark(self) < 0)
4880 break;
4881 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 case BINPUT:
4884 if (load_binput(self) < 0)
4885 break;
4886 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 case LONG_BINPUT:
4889 if (load_long_binput(self) < 0)
4890 break;
4891 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893 case PUT:
4894 if (load_put(self) < 0)
4895 break;
4896 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 case POP:
4899 if (load_pop(self) < 0)
4900 break;
4901 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903 case POP_MARK:
4904 if (load_pop_mark(self) < 0)
4905 break;
4906 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 case SETITEM:
4909 if (load_setitem(self) < 0)
4910 break;
4911 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004913 case SETITEMS:
4914 if (load_setitems(self) < 0)
4915 break;
4916 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 case STOP:
4919 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 case PERSID:
4922 if (load_persid(self) < 0)
4923 break;
4924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 case BINPERSID:
4927 if (load_binpersid(self) < 0)
4928 break;
4929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 case REDUCE:
4932 if (load_reduce(self) < 0)
4933 break;
4934 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004935
Tim Peters4190fb82003-02-02 16:09:05 +00004936 case PROTO:
4937 if (load_proto(self) < 0)
4938 break;
4939 continue;
4940
Tim Peters3c67d792003-02-02 17:59:11 +00004941 case NEWTRUE:
4942 if (load_bool(self, Py_True) < 0)
4943 break;
4944 continue;
4945
4946 case NEWFALSE:
4947 if (load_bool(self, Py_False) < 0)
4948 break;
4949 continue;
4950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 case '\0':
4952 /* end of file */
4953 PyErr_SetNone(PyExc_EOFError);
4954 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004957 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 "invalid load key, '%s'.",
4959 "c", s[0]);
4960 return NULL;
4961 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 break;
4964 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 if ((err = PyErr_Occurred())) {
4967 if (err == PyExc_EOFError) {
4968 PyErr_SetNone(PyExc_EOFError);
4969 }
4970 return NULL;
4971 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 PDATA_POP(self->stack, val);
4974 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004975}
Tim Peters84e87f32001-03-17 04:50:51 +00004976
Guido van Rossum60456fd1997-04-09 17:36:32 +00004977
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004978/* No-load functions to support noload, which is used to
4979 find persistent references. */
4980
4981static int
Tim Peterscba30e22003-02-01 06:24:36 +00004982noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983{
4984 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 if ((i = marker(self)) < 0) return -1;
4987 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004988}
4989
4990
4991static int
Tim Peterscba30e22003-02-01 06:24:36 +00004992noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993{
4994 int i;
4995 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004997 if ((i = marker(self)) < 0) return -1;
4998 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004999 if (self->readline_func(self, &s) < 0) return -1;
5000 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00005001 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005002 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005003}
5004
5005static int
Tim Peterseab7db32003-02-13 18:24:14 +00005006noload_newobj(Unpicklerobject *self)
5007{
5008 PyObject *obj;
5009
5010 PDATA_POP(self->stack, obj); /* pop argtuple */
5011 if (obj == NULL) return -1;
5012 Py_DECREF(obj);
5013
5014 PDATA_POP(self->stack, obj); /* pop cls */
5015 if (obj == NULL) return -1;
5016 Py_DECREF(obj);
5017
5018 PDATA_APPEND(self->stack, Py_None, -1);
5019 return 0;
5020}
5021
5022static int
Tim Peterscba30e22003-02-01 06:24:36 +00005023noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005024{
5025 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005026
Tim Peters0bc93f52003-02-02 18:29:33 +00005027 if (self->readline_func(self, &s) < 0) return -1;
5028 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 PDATA_APPEND(self->stack, Py_None,-1);
5030 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005031}
5032
5033static int
Tim Peterscba30e22003-02-01 06:24:36 +00005034noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005035{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005037 if (self->stack->length < 2) return stackUnderflow();
5038 Pdata_clear(self->stack, self->stack->length-2);
5039 PDATA_APPEND(self->stack, Py_None,-1);
5040 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005041}
5042
5043static int
5044noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005045
Guido van Rossum053b8df1998-11-25 16:18:00 +00005046 if (self->stack->length < 1) return stackUnderflow();
5047 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00005048 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005049}
5050
Tim Peters2d629652003-02-04 05:06:17 +00005051static int
5052noload_extension(Unpicklerobject *self, int nbytes)
5053{
5054 char *codebytes;
5055
5056 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5057 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5058 PDATA_APPEND(self->stack, Py_None, -1);
5059 return 0;
5060}
5061
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005062static int
5063noload_append(Unpicklerobject *self)
5064{
5065 return Pdata_clear(self->stack, self->stack->length - 1);
5066}
5067
5068static int
5069noload_appends(Unpicklerobject *self)
5070{
5071 int i;
5072 if ((i = marker(self)) < 0) return -1;
5073 return Pdata_clear(self->stack, i);
5074}
5075
5076static int
5077noload_setitem(Unpicklerobject *self)
5078{
5079 return Pdata_clear(self->stack, self->stack->length - 2);
5080}
5081
5082static int
5083noload_setitems(Unpicklerobject *self)
5084{
5085 int i;
5086 if ((i = marker(self)) < 0) return -1;
5087 return Pdata_clear(self->stack, i);
5088}
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005089
5090static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005091noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005092{
5093 PyObject *err = 0, *val = 0;
5094 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005096 self->num_marks = 0;
5097 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005099 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00005100 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005101 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005103 switch (s[0]) {
5104 case NONE:
5105 if (load_none(self) < 0)
5106 break;
5107 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005109 case BININT:
5110 if (load_binint(self) < 0)
5111 break;
5112 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005114 case BININT1:
5115 if (load_binint1(self) < 0)
5116 break;
5117 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 case BININT2:
5120 if (load_binint2(self) < 0)
5121 break;
5122 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124 case INT:
5125 if (load_int(self) < 0)
5126 break;
5127 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 case LONG:
5130 if (load_long(self) < 0)
5131 break;
5132 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005133
Tim Peters4190fb82003-02-02 16:09:05 +00005134 case LONG1:
5135 if (load_counted_long(self, 1) < 0)
5136 break;
5137 continue;
5138
5139 case LONG4:
5140 if (load_counted_long(self, 4) < 0)
5141 break;
5142 continue;
5143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 case FLOAT:
5145 if (load_float(self) < 0)
5146 break;
5147 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005149 case BINFLOAT:
5150 if (load_binfloat(self) < 0)
5151 break;
5152 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154 case BINSTRING:
5155 if (load_binstring(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 SHORT_BINSTRING:
5160 if (load_short_binstring(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 STRING:
5165 if (load_string(self) < 0)
5166 break;
5167 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005168
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005169#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005170 case UNICODE:
5171 if (load_unicode(self) < 0)
5172 break;
5173 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 case BINUNICODE:
5176 if (load_binunicode(self) < 0)
5177 break;
5178 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005179#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005181 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005182 if (load_counted_tuple(self, 0) < 0)
5183 break;
5184 continue;
5185
5186 case TUPLE1:
5187 if (load_counted_tuple(self, 1) < 0)
5188 break;
5189 continue;
5190
5191 case TUPLE2:
5192 if (load_counted_tuple(self, 2) < 0)
5193 break;
5194 continue;
5195
5196 case TUPLE3:
5197 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005198 break;
5199 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005201 case TUPLE:
5202 if (load_tuple(self) < 0)
5203 break;
5204 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005206 case EMPTY_LIST:
5207 if (load_empty_list(self) < 0)
5208 break;
5209 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005211 case LIST:
5212 if (load_list(self) < 0)
5213 break;
5214 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005216 case EMPTY_DICT:
5217 if (load_empty_dict(self) < 0)
5218 break;
5219 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 case DICT:
5222 if (load_dict(self) < 0)
5223 break;
5224 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005226 case OBJ:
5227 if (noload_obj(self) < 0)
5228 break;
5229 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005231 case INST:
5232 if (noload_inst(self) < 0)
5233 break;
5234 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005235
Tim Peterseab7db32003-02-13 18:24:14 +00005236 case NEWOBJ:
5237 if (noload_newobj(self) < 0)
5238 break;
5239 continue;
5240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005241 case GLOBAL:
5242 if (noload_global(self) < 0)
5243 break;
5244 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005246 case APPEND:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005247 if (noload_append(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 break;
5249 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005251 case APPENDS:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005252 if (noload_appends(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 break;
5254 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256 case BUILD:
5257 if (noload_build(self) < 0)
5258 break;
5259 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005261 case DUP:
5262 if (load_dup(self) < 0)
5263 break;
5264 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005266 case BINGET:
5267 if (load_binget(self) < 0)
5268 break;
5269 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005271 case LONG_BINGET:
5272 if (load_long_binget(self) < 0)
5273 break;
5274 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005276 case GET:
5277 if (load_get(self) < 0)
5278 break;
5279 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005280
Tim Peters2d629652003-02-04 05:06:17 +00005281 case EXT1:
5282 if (noload_extension(self, 1) < 0)
5283 break;
5284 continue;
5285
5286 case EXT2:
5287 if (noload_extension(self, 2) < 0)
5288 break;
5289 continue;
5290
5291 case EXT4:
5292 if (noload_extension(self, 4) < 0)
5293 break;
5294 continue;
5295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005296 case MARK:
5297 if (load_mark(self) < 0)
5298 break;
5299 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301 case BINPUT:
5302 if (load_binput(self) < 0)
5303 break;
5304 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 case LONG_BINPUT:
5307 if (load_long_binput(self) < 0)
5308 break;
5309 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005311 case PUT:
5312 if (load_put(self) < 0)
5313 break;
5314 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005316 case POP:
5317 if (load_pop(self) < 0)
5318 break;
5319 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005321 case POP_MARK:
5322 if (load_pop_mark(self) < 0)
5323 break;
5324 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 case SETITEM:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005327 if (noload_setitem(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005328 break;
5329 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 case SETITEMS:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005332 if (noload_setitems(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 break;
5334 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005336 case STOP:
5337 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005339 case PERSID:
5340 if (load_persid(self) < 0)
5341 break;
5342 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005344 case BINPERSID:
5345 if (load_binpersid(self) < 0)
5346 break;
5347 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 case REDUCE:
5350 if (noload_reduce(self) < 0)
5351 break;
5352 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005353
Tim Peters4190fb82003-02-02 16:09:05 +00005354 case PROTO:
5355 if (load_proto(self) < 0)
5356 break;
5357 continue;
5358
Tim Peters3c67d792003-02-02 17:59:11 +00005359 case NEWTRUE:
5360 if (load_bool(self, Py_True) < 0)
5361 break;
5362 continue;
5363
5364 case NEWFALSE:
5365 if (load_bool(self, Py_False) < 0)
5366 break;
5367 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005368 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005369 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005370 "invalid load key, '%s'.",
5371 "c", s[0]);
5372 return NULL;
5373 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005375 break;
5376 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005378 if ((err = PyErr_Occurred())) {
5379 if (err == PyExc_EOFError) {
5380 PyErr_SetNone(PyExc_EOFError);
5381 }
5382 return NULL;
5383 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385 PDATA_POP(self->stack, val);
5386 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005387}
Tim Peters84e87f32001-03-17 04:50:51 +00005388
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005389
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005391Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005392{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005393 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005394}
5395
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005396static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005397Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005399 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005400}
5401
Guido van Rossum60456fd1997-04-09 17:36:32 +00005402
5403static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005404 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005405 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005406 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005407 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005408 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005409 "noload() -- not load a pickle, but go through most of the motions\n"
5410 "\n"
5411 "This function can be used to read past a pickle without instantiating\n"
5412 "any objects or importing any modules. It can also be used to find all\n"
5413 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005414 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005415 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005416 {NULL, NULL} /* sentinel */
5417};
5418
5419
5420static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005421newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422{
5423 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005424
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005425 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 self->file = NULL;
5429 self->arg = NULL;
5430 self->stack = (Pdata*)Pdata_New();
5431 self->pers_func = NULL;
5432 self->last_string = NULL;
5433 self->marks = NULL;
5434 self->num_marks = 0;
5435 self->marks_size = 0;
5436 self->buf_size = 0;
5437 self->read = NULL;
5438 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005440
Tim Peterscba30e22003-02-01 06:24:36 +00005441 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005442 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005443
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005444 if (!self->stack)
5445 goto err;
5446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005447 Py_INCREF(f);
5448 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 /* Set read, readline based on type of f */
5451 if (PyFile_Check(f)) {
5452 self->fp = PyFile_AsFile(f);
5453 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005454 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005455 "I/O operation on closed file");
5456 goto err;
5457 }
5458 self->read_func = read_file;
5459 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005460 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 else if (PycStringIO_InputCheck(f)) {
5462 self->fp = NULL;
5463 self->read_func = read_cStringIO;
5464 self->readline_func = readline_cStringIO;
5465 }
5466 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 self->fp = NULL;
5469 self->read_func = read_other;
5470 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5473 (self->read = PyObject_GetAttr(f, read_str)))) {
5474 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005475 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 "argument must have 'read' and "
5477 "'readline' attributes" );
5478 goto err;
5479 }
5480 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005481 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005483 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 err:
5486 Py_DECREF((PyObject *)self);
5487 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005488}
5489
5490
5491static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005492get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005493{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005495}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005496
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005497
Guido van Rossum60456fd1997-04-09 17:36:32 +00005498static void
Tim Peterscba30e22003-02-01 06:24:36 +00005499Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005500{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005501 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005502 Py_XDECREF(self->readline);
5503 Py_XDECREF(self->read);
5504 Py_XDECREF(self->file);
5505 Py_XDECREF(self->memo);
5506 Py_XDECREF(self->stack);
5507 Py_XDECREF(self->pers_func);
5508 Py_XDECREF(self->arg);
5509 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005510 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005512 if (self->marks) {
5513 free(self->marks);
5514 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005516 if (self->buf_size) {
5517 free(self->buf);
5518 }
Tim Peters84e87f32001-03-17 04:50:51 +00005519
Christian Heimese93237d2007-12-19 02:37:44 +00005520 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005521}
5522
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005523static int
5524Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5525{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005526 Py_VISIT(self->readline);
5527 Py_VISIT(self->read);
5528 Py_VISIT(self->file);
5529 Py_VISIT(self->memo);
5530 Py_VISIT(self->stack);
5531 Py_VISIT(self->pers_func);
5532 Py_VISIT(self->arg);
5533 Py_VISIT(self->last_string);
5534 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005535 return 0;
5536}
5537
5538static int
5539Unpickler_clear(Unpicklerobject *self)
5540{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005541 Py_CLEAR(self->readline);
5542 Py_CLEAR(self->read);
5543 Py_CLEAR(self->file);
5544 Py_CLEAR(self->memo);
5545 Py_CLEAR(self->stack);
5546 Py_CLEAR(self->pers_func);
5547 Py_CLEAR(self->arg);
5548 Py_CLEAR(self->last_string);
5549 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005550 return 0;
5551}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005552
5553static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005554Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005555{
5556 if (!strcmp(name, "persistent_load")) {
5557 if (!self->pers_func) {
5558 PyErr_SetString(PyExc_AttributeError, name);
5559 return NULL;
5560 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005562 Py_INCREF(self->pers_func);
5563 return self->pers_func;
5564 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005566 if (!strcmp(name, "find_global")) {
5567 if (!self->find_class) {
5568 PyErr_SetString(PyExc_AttributeError, name);
5569 return NULL;
5570 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005572 Py_INCREF(self->find_class);
5573 return self->find_class;
5574 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005576 if (!strcmp(name, "memo")) {
5577 if (!self->memo) {
5578 PyErr_SetString(PyExc_AttributeError, name);
5579 return NULL;
5580 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005582 Py_INCREF(self->memo);
5583 return self->memo;
5584 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005586 if (!strcmp(name, "UnpicklingError")) {
5587 Py_INCREF(UnpicklingError);
5588 return UnpicklingError;
5589 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005591 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005592}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005593
Guido van Rossum60456fd1997-04-09 17:36:32 +00005594
5595static int
Tim Peterscba30e22003-02-01 06:24:36 +00005596Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005597{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005599 if (!strcmp(name, "persistent_load")) {
5600 Py_XDECREF(self->pers_func);
5601 self->pers_func = value;
5602 Py_XINCREF(value);
5603 return 0;
5604 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005606 if (!strcmp(name, "find_global")) {
5607 Py_XDECREF(self->find_class);
5608 self->find_class = value;
5609 Py_XINCREF(value);
5610 return 0;
5611 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005613 if (! value) {
5614 PyErr_SetString(PyExc_TypeError,
5615 "attribute deletion is not supported");
5616 return -1;
5617 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005619 if (strcmp(name, "memo") == 0) {
5620 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005621 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005622 "memo must be a dictionary");
5623 return -1;
5624 }
5625 Py_XDECREF(self->memo);
5626 self->memo = value;
5627 Py_INCREF(value);
5628 return 0;
5629 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005631 PyErr_SetString(PyExc_AttributeError, name);
5632 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005633}
5634
Tim Peters5bd2a792003-02-01 16:45:06 +00005635/* ---------------------------------------------------------------------------
5636 * Module-level functions.
5637 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005638
Martin v. Löwis544f1192004-07-27 05:22:33 +00005639/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005640static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005641cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005642{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005643 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005644 PyObject *ob, *file, *res = NULL;
5645 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005646 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005647
Martin v. Löwis544f1192004-07-27 05:22:33 +00005648 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5649 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005650 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005651
Tim Peters5bd2a792003-02-01 16:45:06 +00005652 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005653 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005655 if (dump(pickler, ob) < 0)
5656 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005658 Py_INCREF(Py_None);
5659 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005661 finally:
5662 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005664 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005665}
5666
5667
Martin v. Löwis544f1192004-07-27 05:22:33 +00005668/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005669static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005670cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005671{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005672 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 PyObject *ob, *file = 0, *res = NULL;
5674 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005675 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005676
Martin v. Löwis544f1192004-07-27 05:22:33 +00005677 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5678 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005679 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005680
Tim Peterscba30e22003-02-01 06:24:36 +00005681 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005682 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005683
Tim Peters5bd2a792003-02-01 16:45:06 +00005684 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005687 if (dump(pickler, ob) < 0)
5688 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005690 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005692 finally:
5693 Py_XDECREF(pickler);
5694 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005696 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005697}
5698
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005699
Tim Peters5bd2a792003-02-01 16:45:06 +00005700/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005701static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005702cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005703{
5704 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005705 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005706
Tim Peterscba30e22003-02-01 06:24:36 +00005707 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005708 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005710 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005712 finally:
5713 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005715 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005716}
5717
5718
Tim Peters5bd2a792003-02-01 16:45:06 +00005719/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005720static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005721cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005722{
5723 PyObject *ob, *file = 0, *res = NULL;
5724 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005725
Tim Peterscba30e22003-02-01 06:24:36 +00005726 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005728
Tim Peterscba30e22003-02-01 06:24:36 +00005729 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005730 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005731
Tim Peterscba30e22003-02-01 06:24:36 +00005732 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005733 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005735 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005737 finally:
5738 Py_XDECREF(file);
5739 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005741 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005742}
5743
5744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005745PyDoc_STRVAR(Unpicklertype__doc__,
5746"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005747
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005748static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005749 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005750 "cPickle.Unpickler", /*tp_name*/
5751 sizeof(Unpicklerobject), /*tp_basicsize*/
5752 0,
5753 (destructor)Unpickler_dealloc, /* tp_dealloc */
5754 0, /* tp_print */
5755 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5756 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5757 0, /* tp_compare */
5758 0, /* tp_repr */
5759 0, /* tp_as_number */
5760 0, /* tp_as_sequence */
5761 0, /* tp_as_mapping */
5762 0, /* tp_hash */
5763 0, /* tp_call */
5764 0, /* tp_str */
5765 0, /* tp_getattro */
5766 0, /* tp_setattro */
5767 0, /* tp_as_buffer */
5768 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5769 Unpicklertype__doc__, /* tp_doc */
5770 (traverseproc)Unpickler_traverse, /* tp_traverse */
5771 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005772};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005773
Guido van Rossum60456fd1997-04-09 17:36:32 +00005774static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005775 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5776 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005777 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005778 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005779 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005780 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005781
Martin v. Löwis544f1192004-07-27 05:22:33 +00005782 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5783 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005784 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005785 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005786 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005787 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005788
Georg Brandl96a8c392006-05-29 21:04:52 +00005789 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005790 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005791
Neal Norwitzb0493252002-03-31 14:44:22 +00005792 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005793 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005794
Martin v. Löwis544f1192004-07-27 05:22:33 +00005795 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5796 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005797 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005798 "This takes a file-like object for writing a pickle data stream.\n"
5799 "The optional proto argument tells the pickler to use the given\n"
5800 "protocol; supported protocols are 0, 1, 2. The default\n"
5801 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5802 "only protocol that can be written to a file opened in text\n"
5803 "mode and read back successfully. When using a protocol higher\n"
5804 "than 0, make sure the file is opened in binary mode, both when\n"
5805 "pickling and unpickling.)\n"
5806 "\n"
5807 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5808 "more efficient than protocol 1.\n"
5809 "\n"
5810 "Specifying a negative protocol version selects the highest\n"
5811 "protocol version supported. The higher the protocol used, the\n"
5812 "more recent the version of Python needed to read the pickle\n"
5813 "produced.\n"
5814 "\n"
5815 "The file parameter must have a write() method that accepts a single\n"
5816 "string argument. It can thus be an open file object, a StringIO\n"
5817 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005818 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005819
Georg Brandl96a8c392006-05-29 21:04:52 +00005820 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005821 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5822
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005823 { NULL, NULL }
5824};
5825
Guido van Rossum60456fd1997-04-09 17:36:32 +00005826static int
Tim Peterscba30e22003-02-01 06:24:36 +00005827init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005828{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005829 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005830
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005831#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005832
Tim Peters3cfe7542003-05-21 21:29:48 +00005833 if (PyType_Ready(&Unpicklertype) < 0)
5834 return -1;
5835 if (PyType_Ready(&Picklertype) < 0)
5836 return -1;
5837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005838 INIT_STR(__class__);
5839 INIT_STR(__getinitargs__);
5840 INIT_STR(__dict__);
5841 INIT_STR(__getstate__);
5842 INIT_STR(__setstate__);
5843 INIT_STR(__name__);
5844 INIT_STR(__main__);
5845 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005846 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005847 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005848 INIT_STR(append);
5849 INIT_STR(read);
5850 INIT_STR(readline);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005851 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005852
Georg Brandldffbf5f2008-05-20 07:49:57 +00005853 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005854 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005855
Tim Peters1f1b2d22003-02-01 02:16:37 +00005856 /* This is special because we want to use a different
5857 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005858 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005859 if (!dispatch_table) return -1;
5860
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005861 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005862 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005863 if (!extension_registry) return -1;
5864
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005865 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005866 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005867 if (!inverted_registry) return -1;
5868
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005869 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005870 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005871 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005872
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005873 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005874
Tim Peters731098b2003-02-04 20:56:09 +00005875 if (!(empty_tuple = PyTuple_New(0)))
5876 return -1;
5877
5878 two_tuple = PyTuple_New(2);
5879 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005880 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005881 /* We use this temp container with no regard to refcounts, or to
5882 * keeping containees alive. Exempt from GC, because we don't
5883 * want anything looking at two_tuple() by magic.
5884 */
5885 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005887 /* Ugh */
5888 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5889 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5890 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005892 if (!( t=PyDict_New())) return -1;
5893 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005894 "def __str__(self):\n"
5895 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5896 Py_file_input,
5897 module_dict, t) )) return -1;
5898 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005900 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005901 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005902 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005904 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005905
Tim Peterscba30e22003-02-01 06:24:36 +00005906 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005907 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005908 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005909 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005911 if (!( t=PyDict_New())) return -1;
5912 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005913 "def __str__(self):\n"
5914 " a=self.args\n"
5915 " a=a and type(a[0]) or '(what)'\n"
5916 " return 'Cannot pickle %s objects' % a\n"
5917 , Py_file_input,
5918 module_dict, t) )) return -1;
5919 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005921 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005922 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005923 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005925 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005927 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005928 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005929 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005930
Martin v. Löwis658009a2002-09-16 17:26:24 +00005931 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5932 UnpicklingError, NULL)))
5933 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005935 if (PyDict_SetItemString(module_dict, "PickleError",
5936 PickleError) < 0)
5937 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005939 if (PyDict_SetItemString(module_dict, "PicklingError",
5940 PicklingError) < 0)
5941 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005943 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5944 UnpicklingError) < 0)
5945 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005947 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5948 UnpickleableError) < 0)
5949 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005951 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5952 BadPickleGet) < 0)
5953 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005955 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005957 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005958}
5959
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005960#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5961#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005962#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005963PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005964initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005965{
5966 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005967 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005968 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005969 PyObject *format_version;
5970 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005971
Christian Heimese93237d2007-12-19 02:37:44 +00005972 Py_TYPE(&Picklertype) = &PyType_Type;
5973 Py_TYPE(&Unpicklertype) = &PyType_Type;
5974 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005976 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005977 * so we're forced to use a temporary dictionary. :(
5978 */
5979 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005980 if (!di) return;
5981 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005983 /* Create the module and add the functions */
5984 m = Py_InitModule4("cPickle", cPickle_methods,
5985 cPickle_module_documentation,
5986 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005987 if (m == NULL)
5988 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005990 /* Add some symbolic constants to the module */
5991 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005992 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005993 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005994 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005996 /* Copy data from di. Waaa. */
5997 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5998 if (PyObject_SetItem(d, k, v) < 0) {
5999 Py_DECREF(di);
6000 return;
6001 }
6002 }
6003 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00006004
Tim Peters8587b3c2003-02-13 15:44:41 +00006005 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
6006 if (i < 0)
6007 return;
6008
Tim Peters5b7da392003-02-04 00:21:07 +00006009 /* These are purely informational; no code uses them. */
6010 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00006011 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00006012 /* Format versions we can read. */
6013 compatible_formats = Py_BuildValue("[sssss]",
6014 "1.0", /* Original protocol 0 */
6015 "1.1", /* Protocol 0 + INST */
6016 "1.2", /* Original protocol 1 */
6017 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00006018 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00006019 PyDict_SetItemString(d, "format_version", format_version);
6020 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
6021 Py_XDECREF(format_version);
6022 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00006023}