blob: d89e8109e87504ea1be4d70d904aac90fd37f978 [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__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000867 if (module)
868 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) {
906 j=1;
907 name=__main___str;
908 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 Py_INCREF(name);
911 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000912}
913
914
Guido van Rossum60456fd1997-04-09 17:36:32 +0000915static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000916fast_save_enter(Picklerobject *self, PyObject *obj)
917{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 /* if fast_container < 0, we're doing an error exit. */
919 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
920 PyObject *key = NULL;
921 if (self->fast_memo == NULL) {
922 self->fast_memo = PyDict_New();
923 if (self->fast_memo == NULL) {
924 self->fast_container = -1;
925 return 0;
926 }
927 }
928 key = PyLong_FromVoidPtr(obj);
929 if (key == NULL)
930 return 0;
931 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000932 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000934 "fast mode: can't pickle cyclic objects "
935 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000936 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937 self->fast_container = -1;
938 return 0;
939 }
940 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 self->fast_container = -1;
943 return 0;
944 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000945 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000946 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000947 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000948}
949
Tim Peterscba30e22003-02-01 06:24:36 +0000950int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000951fast_save_leave(Picklerobject *self, PyObject *obj)
952{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
954 PyObject *key = PyLong_FromVoidPtr(obj);
955 if (key == NULL)
956 return 0;
957 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000958 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 return 0;
960 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000961 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000962 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000964}
965
966static int
Tim Peterscba30e22003-02-01 06:24:36 +0000967save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000968{
969 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000970 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000974}
975
Guido van Rossum77f6a652002-04-03 22:41:51 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000978{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000979 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000980 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000981 long l = PyInt_AS_LONG((PyIntObject *)args);
982
Tim Peters3c67d792003-02-02 17:59:11 +0000983 if (self->proto >= 2) {
984 char opcode = l ? NEWTRUE : NEWFALSE;
985 if (self->write_func(self, &opcode, 1) < 0)
986 return -1;
987 }
988 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000989 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000990 return 0;
991}
Tim Peters84e87f32001-03-17 04:50:51 +0000992
Guido van Rossum60456fd1997-04-09 17:36:32 +0000993static int
Tim Peterscba30e22003-02-01 06:24:36 +0000994save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995{
996 char c_str[32];
997 long l = PyInt_AS_LONG((PyIntObject *)args);
998 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001000 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001001#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002 || l > 0x7fffffffL
1003 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001004#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 ) {
1006 /* Text-mode pickle, or long too big to fit in the 4-byte
1007 * signed BININT format: store as a string.
1008 */
1009 c_str[0] = INT;
1010 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001011 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012 return -1;
1013 }
1014 else {
1015 /* Binary pickle and l fits in a signed 4-byte int. */
1016 c_str[1] = (int)( l & 0xff);
1017 c_str[2] = (int)((l >> 8) & 0xff);
1018 c_str[3] = (int)((l >> 16) & 0xff);
1019 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1022 if (c_str[2] == 0) {
1023 c_str[0] = BININT1;
1024 len = 2;
1025 }
1026 else {
1027 c_str[0] = BININT2;
1028 len = 3;
1029 }
1030 }
1031 else {
1032 c_str[0] = BININT;
1033 len = 5;
1034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Peters0bc93f52003-02-02 18:29:33 +00001036 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037 return -1;
1038 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041}
1042
1043
1044static int
Tim Peterscba30e22003-02-01 06:24:36 +00001045save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001046{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001047 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001048 int res = -1;
1049 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001052
Tim Petersee1a53c2003-02-02 02:57:53 +00001053 if (self->proto >= 2) {
1054 /* Linear-time pickling. */
1055 size_t nbits;
1056 size_t nbytes;
1057 unsigned char *pdata;
1058 char c_str[5];
1059 int i;
1060 int sign = _PyLong_Sign(args);
1061
1062 if (sign == 0) {
1063 /* It's 0 -- an empty bytestring. */
1064 c_str[0] = LONG1;
1065 c_str[1] = 0;
1066 i = self->write_func(self, c_str, 2);
1067 if (i < 0) goto finally;
1068 res = 0;
1069 goto finally;
1070 }
1071 nbits = _PyLong_NumBits(args);
1072 if (nbits == (size_t)-1 && PyErr_Occurred())
1073 goto finally;
1074 /* How many bytes do we need? There are nbits >> 3 full
1075 * bytes of data, and nbits & 7 leftover bits. If there
1076 * are any leftover bits, then we clearly need another
1077 * byte. Wnat's not so obvious is that we *probably*
1078 * need another byte even if there aren't any leftovers:
1079 * the most-significant bit of the most-significant byte
1080 * acts like a sign bit, and it's usually got a sense
1081 * opposite of the one we need. The exception is longs
1082 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1083 * its own 256's-complement, so has the right sign bit
1084 * even without the extra byte. That's a pain to check
1085 * for in advance, though, so we always grab an extra
1086 * byte at the start, and cut it back later if possible.
1087 */
1088 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001089 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001090 PyErr_SetString(PyExc_OverflowError, "long too large "
1091 "to pickle");
1092 goto finally;
1093 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001094 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001095 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001096 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001097 i = _PyLong_AsByteArray((PyLongObject *)args,
1098 pdata, nbytes,
1099 1 /* little endian */, 1 /* signed */);
1100 if (i < 0) goto finally;
1101 /* If the long is negative, this may be a byte more than
1102 * needed. This is so iff the MSB is all redundant sign
1103 * bits.
1104 */
1105 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1106 (pdata[nbytes - 2] & 0x80) != 0)
1107 --nbytes;
1108
1109 if (nbytes < 256) {
1110 c_str[0] = LONG1;
1111 c_str[1] = (char)nbytes;
1112 size = 2;
1113 }
1114 else {
1115 c_str[0] = LONG4;
1116 size = (int)nbytes;
1117 for (i = 1; i < 5; i++) {
1118 c_str[i] = (char)(size & 0xff);
1119 size >>= 8;
1120 }
1121 size = 5;
1122 }
1123 i = self->write_func(self, c_str, size);
1124 if (i < 0) goto finally;
1125 i = self->write_func(self, (char *)pdata, (int)nbytes);
1126 if (i < 0) goto finally;
1127 res = 0;
1128 goto finally;
1129 }
1130
1131 /* proto < 2: write the repr and newline. This is quadratic-time
1132 * (in the number of digits), in both directions.
1133 */
Tim Peterscba30e22003-02-01 06:24:36 +00001134 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001137 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Tim Peters0bc93f52003-02-02 18:29:33 +00001140 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142
Tim Peters0bc93f52003-02-02 18:29:33 +00001143 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001144 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001145 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Tim Peters0bc93f52003-02-02 18:29:33 +00001148 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 finally:
1154 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156}
1157
1158
1159static int
Tim Peterscba30e22003-02-01 06:24:36 +00001160save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161{
1162 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001166 str[0] = BINFLOAT;
1167 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001169 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 return -1;
1171 }
1172 else {
Eric Smithb05d3be2009-10-26 15:06:39 +00001173 int result = -1;
1174 char *buf = NULL;
1175 char op = FLOAT;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001176
Eric Smithb05d3be2009-10-26 15:06:39 +00001177 if (self->write_func(self, &op, 1) < 0)
1178 goto done;
1179
1180 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);
1181 if (!buf) {
1182 PyErr_NoMemory();
1183 goto done;
1184 }
1185
1186 if (self->write_func(self, buf, strlen(buf)) < 0)
1187 goto done;
1188
1189 if (self->write_func(self, "\n", 1) < 0)
1190 goto done;
1191
1192 result = 0;
1193done:
1194 PyMem_Free(buf);
1195 return result;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199}
1200
1201
1202static int
Tim Peterscba30e22003-02-01 06:24:36 +00001203save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204{
1205 int size, len;
1206 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001208 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if (!self->bin) {
1212 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001215
Tim Peterscba30e22003-02-01 06:24:36 +00001216 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001218
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001219 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001221 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Tim Peters0bc93f52003-02-02 18:29:33 +00001223 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Tim Peters0bc93f52003-02-02 18:29:33 +00001226 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001228
Tim Peters0bc93f52003-02-02 18:29:33 +00001229 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001230 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 Py_XDECREF(repr);
1233 }
1234 else {
1235 int i;
1236 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001238 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 if (size < 256) {
1242 c_str[0] = SHORT_BINSTRING;
1243 c_str[1] = size;
1244 len = 2;
1245 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001246 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 c_str[0] = BINSTRING;
1248 for (i = 1; i < 5; i++)
1249 c_str[i] = (int)(size >> ((i - 1) * 8));
1250 len = 5;
1251 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001252 else
1253 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Tim Peters0bc93f52003-02-02 18:29:33 +00001255 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001256 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 if (size > 128 && Pdata_Check(self->file)) {
1259 if (write_other(self, NULL, 0) < 0) return -1;
1260 PDATA_APPEND(self->file, args, -1);
1261 }
1262 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001263 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001264 PyString_AS_STRING(
1265 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001266 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001267 return -1;
1268 }
1269 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 if (doput)
1272 if (put(self, args) < 0)
1273 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277 err:
1278 Py_XDECREF(repr);
1279 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280}
1281
1282
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001283#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001284/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1285 backslash and newline characters to \uXXXX escapes. */
1286static PyObject *
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001287modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288{
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001289 PyObject *repr;
1290 char *p;
1291 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001292
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001293 static const char *hexdigit = "0123456789abcdef";
1294#ifdef Py_UNICODE_WIDE
1295 const Py_ssize_t expandsize = 10;
1296#else
1297 const Py_ssize_t expandsize = 6;
1298#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001299
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001300 if (size > PY_SSIZE_T_MAX / expandsize)
1301 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001303 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1304 if (repr == NULL)
1305 return NULL;
1306 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001307 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001308
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001309 p = q = PyString_AS_STRING(repr);
1310 while (size-- > 0) {
1311 Py_UNICODE ch = *s++;
1312#ifdef Py_UNICODE_WIDE
1313 /* Map 32-bit characters to '\Uxxxxxxxx' */
1314 if (ch >= 0x10000) {
1315 *p++ = '\\';
1316 *p++ = 'U';
1317 *p++ = hexdigit[(ch >> 28) & 0xf];
1318 *p++ = hexdigit[(ch >> 24) & 0xf];
1319 *p++ = hexdigit[(ch >> 20) & 0xf];
1320 *p++ = hexdigit[(ch >> 16) & 0xf];
1321 *p++ = hexdigit[(ch >> 12) & 0xf];
1322 *p++ = hexdigit[(ch >> 8) & 0xf];
1323 *p++ = hexdigit[(ch >> 4) & 0xf];
1324 *p++ = hexdigit[ch & 15];
1325 }
1326 else
1327#else
1328 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1329 if (ch >= 0xD800 && ch < 0xDC00) {
1330 Py_UNICODE ch2;
1331 Py_UCS4 ucs;
1332
1333 ch2 = *s++;
1334 size--;
1335 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1336 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1337 *p++ = '\\';
1338 *p++ = 'U';
1339 *p++ = hexdigit[(ucs >> 28) & 0xf];
1340 *p++ = hexdigit[(ucs >> 24) & 0xf];
1341 *p++ = hexdigit[(ucs >> 20) & 0xf];
1342 *p++ = hexdigit[(ucs >> 16) & 0xf];
1343 *p++ = hexdigit[(ucs >> 12) & 0xf];
1344 *p++ = hexdigit[(ucs >> 8) & 0xf];
1345 *p++ = hexdigit[(ucs >> 4) & 0xf];
1346 *p++ = hexdigit[ucs & 0xf];
1347 continue;
1348 }
1349 /* Fall through: isolated surrogates are copied as-is */
1350 s--;
1351 size++;
1352 }
1353#endif
1354 /* Map 16-bit characters to '\uxxxx' */
1355 if (ch >= 256 || ch == '\\' || ch == '\n') {
1356 *p++ = '\\';
1357 *p++ = 'u';
1358 *p++ = hexdigit[(ch >> 12) & 0xf];
1359 *p++ = hexdigit[(ch >> 8) & 0xf];
1360 *p++ = hexdigit[(ch >> 4) & 0xf];
1361 *p++ = hexdigit[ch & 15];
1362 }
1363 /* Copy everything else as-is */
1364 else
1365 *p++ = (char) ch;
1366 }
1367 *p = '\0';
1368 _PyString_Resize(&repr, p - q);
1369 return repr;
1370}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001371
Guido van Rossum60456fd1997-04-09 17:36:32 +00001372static int
Tim Peterscba30e22003-02-01 06:24:36 +00001373save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001375 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001376 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378 if (!PyUnicode_Check(args))
1379 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 if (!self->bin) {
1382 char *repr_str;
1383 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001385 repr = modified_EncodeRawUnicodeEscape(
1386 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001387 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001388 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001390 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001392 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001393
Tim Peters0bc93f52003-02-02 18:29:33 +00001394 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001396
Tim Peters0bc93f52003-02-02 18:29:33 +00001397 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001399
Tim Peters0bc93f52003-02-02 18:29:33 +00001400 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 Py_XDECREF(repr);
1404 }
1405 else {
1406 int i;
1407 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001408
Tim Peterscba30e22003-02-01 06:24:36 +00001409 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001411
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001412 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001414 if (size > INT_MAX)
1415 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 c_str[0] = BINUNICODE;
1418 for (i = 1; i < 5; i++)
1419 c_str[i] = (int)(size >> ((i - 1) * 8));
1420 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001421
Tim Peters0bc93f52003-02-02 18:29:33 +00001422 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 if (size > 128 && Pdata_Check(self->file)) {
1426 if (write_other(self, NULL, 0) < 0)
1427 goto err;
1428 PDATA_APPEND(self->file, repr, -1);
1429 }
1430 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001431 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001432 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 goto err;
1434 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 Py_DECREF(repr);
1437 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 if (doput)
1440 if (put(self, args) < 0)
1441 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001445 err:
1446 Py_XDECREF(repr);
1447 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001448}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001449#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001450
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1452static int
Tim Peters67920142003-02-05 03:46:17 +00001453store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001454{
1455 int i;
1456 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001457
Tim Peters1d63c9f2003-02-02 20:29:39 +00001458 assert(PyTuple_Size(t) == len);
1459
1460 for (i = 0; i < len; i++) {
1461 PyObject *element = PyTuple_GET_ITEM(t, i);
1462
1463 if (element == NULL)
1464 goto finally;
1465 if (save(self, element, 0) < 0)
1466 goto finally;
1467 }
1468 res = 0;
1469
1470 finally:
1471 return res;
1472}
1473
1474/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1475 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001476 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001477 * (a tuple can be reached from itself), and that requires some subtle
1478 * magic so that it works in all cases. IOW, this is a long routine.
1479 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001480static int
Tim Peterscba30e22003-02-01 06:24:36 +00001481save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001483 PyObject *py_tuple_id = NULL;
1484 int len, i;
1485 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001488 static char pop = POP;
1489 static char pop_mark = POP_MARK;
1490 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 if ((len = PyTuple_Size(args)) < 0)
1493 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001494
Tim Peters1d63c9f2003-02-02 20:29:39 +00001495 if (len == 0) {
1496 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001497
Tim Peters1d63c9f2003-02-02 20:29:39 +00001498 if (self->proto) {
1499 c_str[0] = EMPTY_TUPLE;
1500 len = 1;
1501 }
1502 else {
1503 c_str[0] = MARK;
1504 c_str[1] = TUPLE;
1505 len = 2;
1506 }
1507 if (self->write_func(self, c_str, len) >= 0)
1508 res = 0;
1509 /* Don't memoize an empty tuple. */
1510 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001511 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001512
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 /* A non-empty tuple. */
1514
1515 /* id(tuple) isn't in the memo now. If it shows up there after
1516 * saving the tuple elements, the tuple must be recursive, in
1517 * which case we'll pop everything we put on the stack, and fetch
1518 * its value from the memo.
1519 */
1520 py_tuple_id = PyLong_FromVoidPtr(args);
1521 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523
Tim Peters1d63c9f2003-02-02 20:29:39 +00001524 if (len <= 3 && self->proto >= 2) {
1525 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001526 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001527 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001529 /* pop the len elements */
1530 for (i = 0; i < len; ++i)
1531 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001533 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001534 if (get(self, py_tuple_id) < 0)
1535 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 res = 0;
1537 goto finally;
1538 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001539 /* Not recursive. */
1540 if (self->write_func(self, len2opcode + len, 1) < 0)
1541 goto finally;
1542 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Tim Peters1d63c9f2003-02-02 20:29:39 +00001545 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1546 * Generate MARK elt1 elt2 ... TUPLE
1547 */
1548 if (self->write_func(self, &MARKv, 1) < 0)
1549 goto finally;
1550
Tim Peters67920142003-02-05 03:46:17 +00001551 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001552 goto finally;
1553
1554 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1555 /* pop the stack stuff we pushed */
1556 if (self->bin) {
1557 if (self->write_func(self, &pop_mark, 1) < 0)
1558 goto finally;
1559 }
1560 else {
1561 /* Note that we pop one more than len, to remove
1562 * the MARK too.
1563 */
1564 for (i = 0; i <= len; i++)
1565 if (self->write_func(self, &pop, 1) < 0)
1566 goto finally;
1567 }
1568 /* fetch from memo */
1569 if (get(self, py_tuple_id) >= 0)
1570 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001571 goto finally;
1572 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001573
Tim Peters1d63c9f2003-02-02 20:29:39 +00001574 /* Not recursive. */
1575 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001577
Tim Peters1d63c9f2003-02-02 20:29:39 +00001578 memoize:
1579 if (put(self, args) >= 0)
1580 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582 finally:
1583 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001584 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585}
1586
Tim Peters1092d642003-02-11 21:06:20 +00001587/* iter is an iterator giving items, and we batch up chunks of
1588 * MARK item item ... item APPENDS
1589 * opcode sequences. Calling code should have arranged to first create an
1590 * empty list, or list-like object, for the APPENDS to operate on.
1591 * Returns 0 on success, <0 on error.
1592 */
1593static int
1594batch_list(Picklerobject *self, PyObject *iter)
1595{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001596 PyObject *obj = NULL;
1597 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001598 int i, n;
1599
1600 static char append = APPEND;
1601 static char appends = APPENDS;
1602
1603 assert(iter != NULL);
1604
1605 if (self->proto == 0) {
1606 /* APPENDS isn't available; do one at a time. */
1607 for (;;) {
1608 obj = PyIter_Next(iter);
1609 if (obj == NULL) {
1610 if (PyErr_Occurred())
1611 return -1;
1612 break;
1613 }
1614 i = save(self, obj, 0);
1615 Py_DECREF(obj);
1616 if (i < 0)
1617 return -1;
1618 if (self->write_func(self, &append, 1) < 0)
1619 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001620 }
1621 return 0;
1622 }
1623
1624 /* proto > 0: write in batches of BATCHSIZE. */
1625 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001626 /* Get first item */
1627 firstitem = PyIter_Next(iter);
1628 if (firstitem == NULL) {
1629 if (PyErr_Occurred())
1630 goto BatchFailed;
1631
1632 /* nothing more to add */
1633 break;
1634 }
1635
1636 /* Try to get a second item */
1637 obj = PyIter_Next(iter);
1638 if (obj == NULL) {
1639 if (PyErr_Occurred())
1640 goto BatchFailed;
1641
1642 /* Only one item to write */
1643 if (save(self, firstitem, 0) < 0)
1644 goto BatchFailed;
1645 if (self->write_func(self, &append, 1) < 0)
1646 goto BatchFailed;
1647 Py_CLEAR(firstitem);
1648 break;
1649 }
1650
1651 /* More than one item to write */
1652
1653 /* Pump out MARK, items, APPENDS. */
1654 if (self->write_func(self, &MARKv, 1) < 0)
1655 goto BatchFailed;
1656
1657 if (save(self, firstitem, 0) < 0)
1658 goto BatchFailed;
1659 Py_CLEAR(firstitem);
1660 n = 1;
1661
1662 /* Fetch and save up to BATCHSIZE items */
1663 while (obj) {
1664 if (save(self, obj, 0) < 0)
1665 goto BatchFailed;
1666 Py_CLEAR(obj);
1667 n += 1;
1668
1669 if (n == BATCHSIZE)
1670 break;
1671
Tim Peters1092d642003-02-11 21:06:20 +00001672 obj = PyIter_Next(iter);
1673 if (obj == NULL) {
1674 if (PyErr_Occurred())
1675 goto BatchFailed;
1676 break;
1677 }
Tim Peters1092d642003-02-11 21:06:20 +00001678 }
1679
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001680 if (self->write_func(self, &appends, 1) < 0)
1681 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001682
Tim Peters90975f12003-02-12 05:28:58 +00001683 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001684 return 0;
1685
1686BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001687 Py_XDECREF(firstitem);
1688 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001689 return -1;
1690}
1691
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692static int
Tim Peterscba30e22003-02-01 06:24:36 +00001693save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694{
Tim Peters1092d642003-02-11 21:06:20 +00001695 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001697 int len;
1698 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001700 if (self->fast && !fast_save_enter(self, args))
1701 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001702
Tim Peters1092d642003-02-11 21:06:20 +00001703 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if (self->bin) {
1705 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001706 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001707 }
1708 else {
1709 s[0] = MARK;
1710 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001711 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001713
Tim Peters1092d642003-02-11 21:06:20 +00001714 if (self->write_func(self, s, len) < 0)
1715 goto finally;
1716
1717 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 if ((len = PyList_Size(args)) < 0)
1719 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001720
Tim Peters1092d642003-02-11 21:06:20 +00001721 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001723 if (put(self, args) >= 0)
1724 res = 0;
1725 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 }
Tim Peters90975f12003-02-12 05:28:58 +00001727 if (put2(self, args) < 0)
1728 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Tim Peters1092d642003-02-11 21:06:20 +00001730 /* Materialize the list elements. */
1731 iter = PyObject_GetIter(args);
1732 if (iter == NULL)
1733 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001734
1735 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1736 {
1737 res = batch_list(self, iter);
1738 Py_LeaveRecursiveCall();
1739 }
Tim Peters1092d642003-02-11 21:06:20 +00001740 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 finally:
1743 if (self->fast && !fast_save_leave(self, args))
1744 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001747}
1748
1749
Tim Peters42f08ac2003-02-11 22:43:24 +00001750/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1751 * MARK key value ... key value SETITEMS
1752 * opcode sequences. Calling code should have arranged to first create an
1753 * empty dict, or dict-like object, for the SETITEMS to operate on.
1754 * Returns 0 on success, <0 on error.
1755 *
1756 * This is very much like batch_list(). The difference between saving
1757 * elements directly, and picking apart two-tuples, is so long-winded at
1758 * the C level, though, that attempts to combine these routines were too
1759 * ugly to bear.
1760 */
1761static int
1762batch_dict(Picklerobject *self, PyObject *iter)
1763{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001764 PyObject *p = NULL;
1765 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001766 int i, n;
1767
1768 static char setitem = SETITEM;
1769 static char setitems = SETITEMS;
1770
1771 assert(iter != NULL);
1772
1773 if (self->proto == 0) {
1774 /* SETITEMS isn't available; do one at a time. */
1775 for (;;) {
1776 p = PyIter_Next(iter);
1777 if (p == NULL) {
1778 if (PyErr_Occurred())
1779 return -1;
1780 break;
1781 }
1782 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1783 PyErr_SetString(PyExc_TypeError, "dict items "
1784 "iterator must return 2-tuples");
1785 return -1;
1786 }
1787 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1788 if (i >= 0)
1789 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1790 Py_DECREF(p);
1791 if (i < 0)
1792 return -1;
1793 if (self->write_func(self, &setitem, 1) < 0)
1794 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001795 }
1796 return 0;
1797 }
1798
1799 /* proto > 0: write in batches of BATCHSIZE. */
1800 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001801 /* Get first item */
1802 firstitem = PyIter_Next(iter);
1803 if (firstitem == NULL) {
1804 if (PyErr_Occurred())
1805 goto BatchFailed;
1806
1807 /* nothing more to add */
1808 break;
1809 }
1810 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1811 PyErr_SetString(PyExc_TypeError, "dict items "
1812 "iterator must return 2-tuples");
1813 goto BatchFailed;
1814 }
1815
1816 /* Try to get a second item */
1817 p = PyIter_Next(iter);
1818 if (p == NULL) {
1819 if (PyErr_Occurred())
1820 goto BatchFailed;
1821
1822 /* Only one item to write */
1823 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1824 goto BatchFailed;
1825 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1826 goto BatchFailed;
1827 if (self->write_func(self, &setitem, 1) < 0)
1828 goto BatchFailed;
1829 Py_CLEAR(firstitem);
1830 break;
1831 }
1832
1833 /* More than one item to write */
1834
1835 /* Pump out MARK, items, SETITEMS. */
1836 if (self->write_func(self, &MARKv, 1) < 0)
1837 goto BatchFailed;
1838
1839 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1840 goto BatchFailed;
1841 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1842 goto BatchFailed;
1843 Py_CLEAR(firstitem);
1844 n = 1;
1845
1846 /* Fetch and save up to BATCHSIZE items */
1847 while (p) {
1848 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1849 PyErr_SetString(PyExc_TypeError, "dict items "
1850 "iterator must return 2-tuples");
1851 goto BatchFailed;
1852 }
1853 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1854 goto BatchFailed;
1855 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1856 goto BatchFailed;
1857 Py_CLEAR(p);
1858 n += 1;
1859
1860 if (n == BATCHSIZE)
1861 break;
1862
Tim Peters42f08ac2003-02-11 22:43:24 +00001863 p = PyIter_Next(iter);
1864 if (p == NULL) {
1865 if (PyErr_Occurred())
1866 goto BatchFailed;
1867 break;
1868 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001869 }
1870
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001871 if (self->write_func(self, &setitems, 1) < 0)
1872 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001873
Tim Peters90975f12003-02-12 05:28:58 +00001874 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001875 return 0;
1876
1877BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001878 Py_XDECREF(firstitem);
1879 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001880 return -1;
1881}
1882
Collin Winter179bf212009-05-25 04:34:39 +00001883/* This is a variant of batch_dict() above that specializes for dicts, with no
1884 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1885 * MARK key value ... key value SETITEMS
1886 * opcode sequences. Calling code should have arranged to first create an
1887 * empty dict, or dict-like object, for the SETITEMS to operate on.
1888 * Returns 0 on success, -1 on error.
1889 *
1890 * Note that this currently doesn't work for protocol 0.
1891 */
1892static int
1893batch_dict_exact(Picklerobject *self, PyObject *obj)
1894{
1895 PyObject *key = NULL, *value = NULL;
1896 int i;
1897 Py_ssize_t dict_size, ppos = 0;
1898
1899 static char setitem = SETITEM;
1900 static char setitems = SETITEMS;
1901
1902 assert(obj != NULL);
1903 assert(self->proto > 0);
1904
1905 dict_size = PyDict_Size(obj);
1906
1907 /* Special-case len(d) == 1 to save space. */
1908 if (dict_size == 1) {
1909 PyDict_Next(obj, &ppos, &key, &value);
1910 if (save(self, key, 0) < 0)
1911 return -1;
1912 if (save(self, value, 0) < 0)
1913 return -1;
1914 if (self->write_func(self, &setitem, 1) < 0)
1915 return -1;
1916 return 0;
1917 }
1918
1919 /* Write in batches of BATCHSIZE. */
1920 do {
1921 i = 0;
1922 if (self->write_func(self, &MARKv, 1) < 0)
1923 return -1;
1924 while (PyDict_Next(obj, &ppos, &key, &value)) {
1925 if (save(self, key, 0) < 0)
1926 return -1;
1927 if (save(self, value, 0) < 0)
1928 return -1;
1929 if (++i == BATCHSIZE)
1930 break;
1931 }
1932 if (self->write_func(self, &setitems, 1) < 0)
1933 return -1;
1934 if (PyDict_Size(obj) != dict_size) {
1935 PyErr_Format(
1936 PyExc_RuntimeError,
1937 "dictionary changed size during iteration");
1938 return -1;
1939 }
1940
1941 } while (i == BATCHSIZE);
1942 return 0;
1943}
1944
Guido van Rossum60456fd1997-04-09 17:36:32 +00001945static int
Tim Peterscba30e22003-02-01 06:24:36 +00001946save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947{
Tim Peters42f08ac2003-02-11 22:43:24 +00001948 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001950 int len;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 if (self->fast && !fast_save_enter(self, args))
1953 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001954
Tim Peters42f08ac2003-02-11 22:43:24 +00001955 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if (self->bin) {
1957 s[0] = EMPTY_DICT;
1958 len = 1;
1959 }
1960 else {
1961 s[0] = MARK;
1962 s[1] = DICT;
1963 len = 2;
1964 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001965
Tim Peters0bc93f52003-02-02 18:29:33 +00001966 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Tim Peters42f08ac2003-02-11 22:43:24 +00001969 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970 if ((len = PyDict_Size(args)) < 0)
1971 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001974 if (put(self, args) >= 0)
1975 res = 0;
1976 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001977 }
Tim Peters90975f12003-02-12 05:28:58 +00001978 if (put2(self, args) < 0)
1979 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001980
Tim Peters42f08ac2003-02-11 22:43:24 +00001981 /* Materialize the dict items. */
Collin Winter179bf212009-05-25 04:34:39 +00001982 if (PyDict_CheckExact(args) && self->proto > 0) {
1983 /* We can take certain shortcuts if we know this is a dict and
1984 not a dict subclass. */
1985 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1986 res = batch_dict_exact(self, args);
1987 Py_LeaveRecursiveCall();
1988 }
1989 } else {
1990 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
1991 if (iter == NULL)
1992 goto finally;
1993 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1994 res = batch_dict(self, iter);
1995 Py_LeaveRecursiveCall();
1996 }
1997 Py_DECREF(iter);
Facundo Batista763d3092008-06-30 01:10:55 +00001998 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 finally:
2001 if (self->fast && !fast_save_leave(self, args))
2002 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002005}
2006
2007
Tim Peters84e87f32001-03-17 04:50:51 +00002008static int
Tim Peterscba30e22003-02-01 06:24:36 +00002009save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010{
2011 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
2012 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
2013 char *module_str, *name_str;
2014 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (self->fast && !fast_save_enter(self, args))
2019 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002020
Tim Peters0bc93f52003-02-02 18:29:33 +00002021 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002022 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002023
Tim Peterscba30e22003-02-01 06:24:36 +00002024 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (self->bin) {
2028 if (save(self, class, 0) < 0)
2029 goto finally;
2030 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2033 PyObject *element = 0;
2034 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002036 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00002037 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 if ((len = PyObject_Size(class_args)) < 0)
2041 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002043 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00002044 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 if (save(self, element, 0) < 0) {
2048 Py_DECREF(element);
2049 goto finally;
2050 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002052 Py_DECREF(element);
2053 }
2054 }
2055 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002056 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2057 PyErr_Clear();
2058 else
2059 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 if (!self->bin) {
2063 if (!( name = ((PyClassObject *)class)->cl_name )) {
2064 PyErr_SetString(PicklingError, "class has no name");
2065 goto finally;
2066 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Tim Peterscba30e22003-02-01 06:24:36 +00002068 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002070
Tim Peters84e87f32001-03-17 04:50:51 +00002071
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002072 if ((module_size = PyString_Size(module)) < 0 ||
2073 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002075
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002076 module_str = PyString_AS_STRING((PyStringObject *)module);
2077 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002078
Tim Peters0bc93f52003-02-02 18:29:33 +00002079 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002081
Tim Peters0bc93f52003-02-02 18:29:33 +00002082 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002084
Tim Peters0bc93f52003-02-02 18:29:33 +00002085 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
Tim Peters0bc93f52003-02-02 18:29:33 +00002088 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090
Tim Peters0bc93f52003-02-02 18:29:33 +00002091 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002092 goto finally;
2093 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002094 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 goto finally;
2096 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2099 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002100 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 goto finally;
2102 }
2103 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002104 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2105 PyErr_Clear();
2106 else
2107 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002110 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2111 PyErr_Clear();
2112 else
2113 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 res = 0;
2115 goto finally;
2116 }
2117 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 if (!PyDict_Check(state)) {
2120 if (put2(self, args) < 0)
2121 goto finally;
2122 }
2123 else {
2124 if (put(self, args) < 0)
2125 goto finally;
2126 }
Tim Peters84e87f32001-03-17 04:50:51 +00002127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002128 if (save(self, state, 0) < 0)
2129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002130
Tim Peters0bc93f52003-02-02 18:29:33 +00002131 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002136 finally:
2137 if (self->fast && !fast_save_leave(self, args))
2138 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 Py_XDECREF(module);
2141 Py_XDECREF(class);
2142 Py_XDECREF(state);
2143 Py_XDECREF(getinitargs_func);
2144 Py_XDECREF(getstate_func);
2145 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002148}
2149
2150
Guido van Rossum60456fd1997-04-09 17:36:32 +00002151static int
Tim Peterscba30e22003-02-01 06:24:36 +00002152save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002153{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002154 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002155 char *name_str, *module_str;
2156 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160 if (name) {
2161 global_name = name;
2162 Py_INCREF(global_name);
2163 }
2164 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002165 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002166 goto finally;
2167 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002168
Tim Peterscba30e22003-02-01 06:24:36 +00002169 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002171
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002172 if ((module_size = PyString_Size(module)) < 0 ||
2173 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002175
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002176 module_str = PyString_AS_STRING((PyStringObject *)module);
2177 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002178
Guido van Rossum75bfd052002-12-24 18:10:07 +00002179 /* XXX This can be doing a relative import. Clearly it shouldn't,
2180 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002181 mod = PyImport_ImportModule(module_str);
2182 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002183 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002184 "Can't pickle %s: import of module %s "
2185 "failed",
2186 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002187 goto finally;
2188 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002189 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 if (klass == NULL) {
2191 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002192 "Can't pickle %s: attribute lookup %s.%s "
2193 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 "OSS", args, module, global_name);
2195 goto finally;
2196 }
2197 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002198 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002199 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002200 "Can't pickle %s: it's not the same object "
2201 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 "OSS", args, module, global_name);
2203 goto finally;
2204 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002205 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002206
Tim Peters731098b2003-02-04 20:56:09 +00002207 if (self->proto >= 2) {
2208 /* See whether this is in the extension registry, and if
2209 * so generate an EXT opcode.
2210 */
2211 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002212 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002213 char c_str[5];
2214 int n;
2215
2216 PyTuple_SET_ITEM(two_tuple, 0, module);
2217 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2218 py_code = PyDict_GetItem(extension_registry, two_tuple);
2219 if (py_code == NULL)
2220 goto gen_global; /* not registered */
2221
2222 /* Verify py_code has the right type and value. */
2223 if (!PyInt_Check(py_code)) {
2224 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002225 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002226 "OO", args, py_code);
2227 goto finally;
2228 }
2229 code = PyInt_AS_LONG(py_code);
2230 if (code <= 0 || code > 0x7fffffffL) {
2231 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2232 "extension code %ld is out of range",
2233 "Ol", args, code);
2234 goto finally;
2235 }
2236
2237 /* Generate an EXT opcode. */
2238 if (code <= 0xff) {
2239 c_str[0] = EXT1;
2240 c_str[1] = (char)code;
2241 n = 2;
2242 }
2243 else if (code <= 0xffff) {
2244 c_str[0] = EXT2;
2245 c_str[1] = (char)(code & 0xff);
2246 c_str[2] = (char)((code >> 8) & 0xff);
2247 n = 3;
2248 }
2249 else {
2250 c_str[0] = EXT4;
2251 c_str[1] = (char)(code & 0xff);
2252 c_str[2] = (char)((code >> 8) & 0xff);
2253 c_str[3] = (char)((code >> 16) & 0xff);
2254 c_str[4] = (char)((code >> 24) & 0xff);
2255 n = 5;
2256 }
2257
2258 if (self->write_func(self, c_str, n) >= 0)
2259 res = 0;
2260 goto finally; /* and don't memoize */
2261 }
2262
2263 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002264 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002265 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002266
Tim Peters0bc93f52003-02-02 18:29:33 +00002267 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002269
Tim Peters0bc93f52003-02-02 18:29:33 +00002270 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002271 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002272
Tim Peters0bc93f52003-02-02 18:29:33 +00002273 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002275
Tim Peters0bc93f52003-02-02 18:29:33 +00002276 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 if (put(self, args) < 0)
2280 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002282 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002284 finally:
2285 Py_XDECREF(module);
2286 Py_XDECREF(global_name);
2287 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002290}
2291
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292static int
Tim Peterscba30e22003-02-01 06:24:36 +00002293save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294{
2295 PyObject *pid = 0;
2296 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 Py_INCREF(args);
2301 ARG_TUP(self, args);
2302 if (self->arg) {
2303 pid = PyObject_Call(f, self->arg, NULL);
2304 FREE_ARG_TUP(self);
2305 }
2306 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 if (pid != Py_None) {
2309 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002310 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 PyErr_SetString(PicklingError,
2312 "persistent id must be string");
2313 goto finally;
2314 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002315
Tim Peters0bc93f52003-02-02 18:29:33 +00002316 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002318
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002319 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002321
Tim Peters0bc93f52003-02-02 18:29:33 +00002322 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002323 PyString_AS_STRING(
2324 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002325 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002327
Tim Peters0bc93f52003-02-02 18:29:33 +00002328 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 res = 1;
2332 goto finally;
2333 }
2334 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002335 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 res = -1;
2337 else
2338 res = 1;
2339 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 goto finally;
2342 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002346 finally:
2347 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002350}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002351
Tim Peters71fcda52003-02-14 23:05:28 +00002352/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2353 * appropriate __reduce__ method for ob.
2354 */
Tim Peters84e87f32001-03-17 04:50:51 +00002355static int
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002356save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002357{
Tim Peters71fcda52003-02-14 23:05:28 +00002358 PyObject *callable;
2359 PyObject *argtup;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002360 PyObject *state = NULL;
2361 PyObject *listitems = Py_None;
2362 PyObject *dictitems = Py_None;
2363 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002364
Tim Peters71fcda52003-02-14 23:05:28 +00002365 int use_newobj = self->proto >= 2;
2366
2367 static char reduce = REDUCE;
2368 static char build = BUILD;
2369 static char newobj = NEWOBJ;
2370
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002371 size = PyTuple_Size(args);
2372 if (size < 2 || size > 5) {
2373 cPickle_ErrFormat(PicklingError, "tuple returned by "
2374 "%s must contain 2 through 5 elements",
2375 "O", fn);
2376 return -1;
2377 }
2378
Tim Peters71fcda52003-02-14 23:05:28 +00002379 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2380 &callable,
2381 &argtup,
2382 &state,
2383 &listitems,
2384 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002386
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002387 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002388 cPickle_ErrFormat(PicklingError, "Second element of "
2389 "tuple returned by %s must be a tuple",
2390 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002391 return -1;
2392 }
2393
Tim Peters71fcda52003-02-14 23:05:28 +00002394 if (state == Py_None)
2395 state = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002396
Tim Peters71fcda52003-02-14 23:05:28 +00002397 if (listitems == Py_None)
2398 listitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002399 else if (!PyIter_Check(listitems)) {
2400 cPickle_ErrFormat(PicklingError, "Fourth element of "
2401 "tuple returned by %s must be an iterator, not %s",
2402 "Os", fn, Py_TYPE(listitems)->tp_name);
2403 return -1;
2404 }
2405
Tim Peters71fcda52003-02-14 23:05:28 +00002406 if (dictitems == Py_None)
2407 dictitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002408 else if (!PyIter_Check(dictitems)) {
2409 cPickle_ErrFormat(PicklingError, "Fifth element of "
2410 "tuple returned by %s must be an iterator, not %s",
2411 "Os", fn, Py_TYPE(dictitems)->tp_name);
2412 return -1;
2413 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414
Tim Peters71fcda52003-02-14 23:05:28 +00002415 /* Protocol 2 special case: if callable's name is __newobj__, use
2416 * NEWOBJ. This consumes a lot of code.
2417 */
2418 if (use_newobj) {
2419 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002420
Tim Peters71fcda52003-02-14 23:05:28 +00002421 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002422 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2423 PyErr_Clear();
2424 else
2425 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002426 use_newobj = 0;
2427 }
2428 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002429 use_newobj = PyString_Check(temp) &&
2430 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002431 "__newobj__") == 0;
2432 Py_DECREF(temp);
2433 }
2434 }
2435 if (use_newobj) {
2436 PyObject *cls;
2437 PyObject *newargtup;
2438 int n, i;
2439
2440 /* Sanity checks. */
2441 n = PyTuple_Size(argtup);
2442 if (n < 1) {
2443 PyErr_SetString(PicklingError, "__newobj__ arglist "
2444 "is empty");
2445 return -1;
2446 }
2447
2448 cls = PyTuple_GET_ITEM(argtup, 0);
2449 if (! PyObject_HasAttrString(cls, "__new__")) {
2450 PyErr_SetString(PicklingError, "args[0] from "
2451 "__newobj__ args has no __new__");
2452 return -1;
2453 }
2454
2455 /* XXX How could ob be NULL? */
2456 if (ob != NULL) {
2457 PyObject *ob_dot_class;
2458
2459 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002460 if (ob_dot_class == NULL) {
2461 if (PyErr_ExceptionMatches(
2462 PyExc_AttributeError))
2463 PyErr_Clear();
2464 else
2465 return -1;
2466 }
Tim Peters71fcda52003-02-14 23:05:28 +00002467 i = ob_dot_class != cls; /* true iff a problem */
2468 Py_XDECREF(ob_dot_class);
2469 if (i) {
2470 PyErr_SetString(PicklingError, "args[0] from "
2471 "__newobj__ args has the wrong class");
2472 return -1;
2473 }
2474 }
2475
2476 /* Save the class and its __new__ arguments. */
2477 if (save(self, cls, 0) < 0)
2478 return -1;
2479
2480 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2481 if (newargtup == NULL)
2482 return -1;
2483 for (i = 1; i < n; ++i) {
2484 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2485 Py_INCREF(temp);
2486 PyTuple_SET_ITEM(newargtup, i-1, temp);
2487 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002488 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002489 Py_DECREF(newargtup);
2490 if (i < 0)
2491 return -1;
2492
2493 /* Add NEWOBJ opcode. */
2494 if (self->write_func(self, &newobj, 1) < 0)
2495 return -1;
2496 }
2497 else {
2498 /* Not using NEWOBJ. */
2499 if (save(self, callable, 0) < 0 ||
2500 save(self, argtup, 0) < 0 ||
2501 self->write_func(self, &reduce, 1) < 0)
2502 return -1;
2503 }
2504
2505 /* Memoize. */
2506 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002507 if (ob != NULL) {
2508 if (state && !PyDict_Check(state)) {
2509 if (put2(self, ob) < 0)
2510 return -1;
2511 }
Tim Peters71fcda52003-02-14 23:05:28 +00002512 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002514 }
Tim Peters84e87f32001-03-17 04:50:51 +00002515
Guido van Rossum60456fd1997-04-09 17:36:32 +00002516
Tim Peters71fcda52003-02-14 23:05:28 +00002517 if (listitems && batch_list(self, listitems) < 0)
2518 return -1;
2519
2520 if (dictitems && batch_dict(self, dictitems) < 0)
2521 return -1;
2522
2523 if (state) {
2524 if (save(self, state, 0) < 0 ||
2525 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 return -1;
2527 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002530}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002531
Guido van Rossum60456fd1997-04-09 17:36:32 +00002532static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002533save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002534{
2535 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002536 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002537 int res = -1;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002538 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002539
Facundo Batista763d3092008-06-30 01:10:55 +00002540 if (Py_EnterRecursiveCall(" while pickling an object"))
2541 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 if (!pers_save && self->pers_func) {
2544 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2545 res = tmp;
2546 goto finally;
2547 }
2548 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 if (args == Py_None) {
2551 res = save_none(self, args);
2552 goto finally;
2553 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002554
Christian Heimese93237d2007-12-19 02:37:44 +00002555 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002557 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002558 case 'b':
2559 if (args == Py_False || args == Py_True) {
2560 res = save_bool(self, args);
2561 goto finally;
2562 }
2563 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002564 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 if (type == &PyInt_Type) {
2566 res = save_int(self, args);
2567 goto finally;
2568 }
2569 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002570
Guido van Rossum60456fd1997-04-09 17:36:32 +00002571 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572 if (type == &PyLong_Type) {
2573 res = save_long(self, args);
2574 goto finally;
2575 }
2576 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002577
Guido van Rossum60456fd1997-04-09 17:36:32 +00002578 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 if (type == &PyFloat_Type) {
2580 res = save_float(self, args);
2581 goto finally;
2582 }
2583 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002584
Guido van Rossum60456fd1997-04-09 17:36:32 +00002585 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002586 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2587 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588 goto finally;
2589 }
2590 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002591
Guido van Rossum60456fd1997-04-09 17:36:32 +00002592 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002593 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 res = save_string(self, args, 0);
2595 goto finally;
2596 }
Facundo Batista14618862008-06-22 15:27:10 +00002597 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002598
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002599#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002600 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002601 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 res = save_unicode(self, args, 0);
2603 goto finally;
2604 }
Facundo Batista14618862008-06-22 15:27:10 +00002605 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002606#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002608
Christian Heimese93237d2007-12-19 02:37:44 +00002609 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002610 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613 if (PyDict_GetItem(self->memo, py_ob_id)) {
2614 if (get(self, py_ob_id) < 0)
2615 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617 res = 0;
2618 goto finally;
2619 }
2620 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002622 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002623 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002624 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 res = save_string(self, args, 1);
2626 goto finally;
2627 }
2628 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002629
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002630#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002631 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 if (type == &PyUnicode_Type) {
2633 res = save_unicode(self, args, 1);
2634 goto finally;
2635 }
2636 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002637#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002638
Guido van Rossum60456fd1997-04-09 17:36:32 +00002639 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 if (type == &PyTuple_Type) {
2641 res = save_tuple(self, args);
2642 goto finally;
2643 }
2644 if (type == &PyType_Type) {
2645 res = save_global(self, args, NULL);
2646 goto finally;
2647 }
2648 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002649
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 if (type == &PyList_Type) {
2652 res = save_list(self, args);
2653 goto finally;
2654 }
2655 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
2657 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 if (type == &PyDict_Type) {
2659 res = save_dict(self, args);
2660 goto finally;
2661 }
2662 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002663
2664 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 if (type == &PyInstance_Type) {
2666 res = save_inst(self, args);
2667 goto finally;
2668 }
2669 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002670
2671 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 if (type == &PyClass_Type) {
2673 res = save_global(self, args, NULL);
2674 goto finally;
2675 }
2676 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002677
2678 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679 if (type == &PyFunction_Type) {
2680 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002681 if (res && PyErr_ExceptionMatches(PickleError)) {
2682 /* fall back to reduce */
2683 PyErr_Clear();
2684 break;
2685 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 goto finally;
2687 }
2688 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002689
2690 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 if (type == &PyCFunction_Type) {
2692 res = save_global(self, args, NULL);
2693 goto finally;
2694 }
2695 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 if (!pers_save && self->inst_pers_func) {
2698 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2699 res = tmp;
2700 goto finally;
2701 }
2702 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002703
Jeremy Hylton39c61162002-07-16 19:47:43 +00002704 if (PyType_IsSubtype(type, &PyType_Type)) {
2705 res = save_global(self, args, NULL);
2706 goto finally;
2707 }
2708
Guido van Rossumb289b872003-02-19 01:45:13 +00002709 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002710 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002711 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002712 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002713 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2714 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002716 Py_INCREF(args);
2717 ARG_TUP(self, args);
2718 if (self->arg) {
2719 t = PyObject_Call(__reduce__, self->arg, NULL);
2720 FREE_ARG_TUP(self);
2721 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 }
2723 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002724 /* Check for a __reduce_ex__ method. */
2725 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2726 if (__reduce__ != NULL) {
2727 t = PyInt_FromLong(self->proto);
2728 if (t != NULL) {
2729 ARG_TUP(self, t);
2730 t = NULL;
2731 if (self->arg) {
2732 t = PyObject_Call(__reduce__,
2733 self->arg, NULL);
2734 FREE_ARG_TUP(self);
2735 }
2736 }
2737 }
2738 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002739 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2740 PyErr_Clear();
2741 else
2742 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002743 /* Check for a __reduce__ method. */
2744 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2745 if (__reduce__ != NULL) {
2746 t = PyObject_Call(__reduce__,
2747 empty_tuple, NULL);
2748 }
2749 else {
2750 PyErr_SetObject(UnpickleableError, args);
2751 goto finally;
2752 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755
Tim Peters71fcda52003-02-14 23:05:28 +00002756 if (t == NULL)
2757 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002758
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002759 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002760 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 goto finally;
2762 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002763
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002764 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002765 cPickle_ErrFormat(PicklingError, "Value returned by "
2766 "%s must be string or tuple",
2767 "O", __reduce__);
2768 goto finally;
2769 }
2770
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002771 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002774 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 Py_XDECREF(py_ob_id);
2776 Py_XDECREF(__reduce__);
2777 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780}
2781
2782
2783static int
Tim Peterscba30e22003-02-01 06:24:36 +00002784dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785{
2786 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002787
Tim Peters4190fb82003-02-02 16:09:05 +00002788 if (self->proto >= 2) {
2789 char bytes[2];
2790
2791 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002792 assert(self->proto >= 0 && self->proto < 256);
2793 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002794 if (self->write_func(self, bytes, 2) < 0)
2795 return -1;
2796 }
2797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 if (save(self, args, 0) < 0)
2799 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002800
Tim Peters4190fb82003-02-02 16:09:05 +00002801 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803
Tim Peters4190fb82003-02-02 16:09:05 +00002804 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002807 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002808}
2809
2810static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002811Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812{
Tim Peterscba30e22003-02-01 06:24:36 +00002813 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 PyDict_Clear(self->memo);
2815 Py_INCREF(Py_None);
2816 return Py_None;
2817}
2818
2819static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002820Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821{
2822 int l, i, rsize, ssize, clear=1, lm;
2823 long ik;
2824 PyObject *k, *r;
2825 char *s, *p, *have_get;
2826 Pdata *data;
2827
2828 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002829 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002830 return NULL;
2831
2832 /* Check to make sure we are based on a list */
2833 if (! Pdata_Check(self->file)) {
2834 PyErr_SetString(PicklingError,
2835 "Attempt to getvalue() a non-list-based pickler");
2836 return NULL;
2837 }
2838
2839 /* flush write buffer */
2840 if (write_other(self, NULL, 0) < 0) return NULL;
2841
2842 data=(Pdata*)self->file;
2843 l=data->length;
2844
2845 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002846 lm = PyDict_Size(self->memo);
2847 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002849 have_get = malloc(lm);
2850 if (have_get == NULL) return PyErr_NoMemory();
2851 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852
2853 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002854 for (rsize = 0, i = l; --i >= 0; ) {
2855 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002857 if (PyString_Check(k))
2858 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859
2860 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002861 ik = PyInt_AS_LONG((PyIntObject*)k);
2862 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 PyErr_SetString(PicklingError,
2864 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002865 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 }
Tim Petersac5687a2003-02-02 18:08:34 +00002867 if (have_get[ik]) /* with matching get */
2868 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 }
2870
2871 else if (! (PyTuple_Check(k) &&
2872 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002873 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 ) {
2875 PyErr_SetString(PicklingError,
2876 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002877 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 }
2879
2880 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002881 ik = PyInt_AS_LONG((PyIntObject *)k);
2882 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002883 PyErr_SetString(PicklingError,
2884 "Invalid get data");
2885 return NULL;
2886 }
Tim Petersac5687a2003-02-02 18:08:34 +00002887 have_get[ik] = 1;
2888 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 }
2891
2892 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002893 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002894 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002895 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896
Tim Petersac5687a2003-02-02 18:08:34 +00002897 for (i = 0; i < l; i++) {
2898 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002899
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002900 if (PyString_Check(k)) {
2901 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002902 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002903 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002904 while (--ssize >= 0)
2905 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002906 }
2907 }
2908
2909 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002910 ik = PyInt_AS_LONG((PyIntObject *)
2911 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912 if (ik < 256) {
2913 *s++ = BINGET;
2914 *s++ = (int)(ik & 0xff);
2915 }
2916 else {
2917 *s++ = LONG_BINGET;
2918 *s++ = (int)(ik & 0xff);
2919 *s++ = (int)((ik >> 8) & 0xff);
2920 *s++ = (int)((ik >> 16) & 0xff);
2921 *s++ = (int)((ik >> 24) & 0xff);
2922 }
2923 }
2924
2925 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002926 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927
2928 if (have_get[ik]) { /* with matching get */
2929 if (ik < 256) {
2930 *s++ = BINPUT;
2931 *s++ = (int)(ik & 0xff);
2932 }
2933 else {
2934 *s++ = LONG_BINPUT;
2935 *s++ = (int)(ik & 0xff);
2936 *s++ = (int)((ik >> 8) & 0xff);
2937 *s++ = (int)((ik >> 16) & 0xff);
2938 *s++ = (int)((ik >> 24) & 0xff);
2939 }
2940 }
2941 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 }
2943
2944 if (clear) {
2945 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002946 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 }
2948
2949 free(have_get);
2950 return r;
2951 err:
2952 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002953 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002954}
2955
2956static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002957Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958{
2959 PyObject *ob;
2960 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002961
Tim Peterscba30e22003-02-01 06:24:36 +00002962 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965 if (dump(self, ob) < 0)
2966 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 /* XXX Why does dump() return self? */
2971 Py_INCREF(self);
2972 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002973}
2974
2975
Tim Peterscba30e22003-02-01 06:24:36 +00002976static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977{
Neal Norwitzb0493252002-03-31 14:44:22 +00002978 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002979 PyDoc_STR("dump(object) -- "
2980 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002981 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002982 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002983 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002984 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002986};
2987
2988
2989static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002990newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991{
2992 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002993
Tim Peters5bd2a792003-02-01 16:45:06 +00002994 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002995 proto = HIGHEST_PROTOCOL;
2996 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002997 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2998 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002999 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003001 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003002
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003003 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00003004 if (self == NULL)
3005 return NULL;
3006 self->proto = proto;
3007 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 self->fp = NULL;
3009 self->write = NULL;
3010 self->memo = NULL;
3011 self->arg = NULL;
3012 self->pers_func = NULL;
3013 self->inst_pers_func = NULL;
3014 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 self->fast = 0;
3016 self->fast_container = 0;
3017 self->fast_memo = NULL;
3018 self->buf_size = 0;
3019 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003020
Tim Peters5bd2a792003-02-01 16:45:06 +00003021 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022 if (file)
3023 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00003024 else {
3025 file = Pdata_New();
3026 if (file == NULL)
3027 goto err;
3028 }
3029 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003030
Tim Peterscba30e22003-02-01 06:24:36 +00003031 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 if (PyFile_Check(file)) {
3035 self->fp = PyFile_AsFile(file);
3036 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00003037 PyErr_SetString(PyExc_ValueError,
3038 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 goto err;
3040 }
3041 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00003042 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043 else if (PycStringIO_OutputCheck(file)) {
3044 self->write_func = write_cStringIO;
3045 }
3046 else if (file == Py_None) {
3047 self->write_func = write_none;
3048 }
3049 else {
3050 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052 if (! Pdata_Check(file)) {
3053 self->write = PyObject_GetAttr(file, write_str);
3054 if (!self->write) {
3055 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003056 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 "argument must have 'write' "
3058 "attribute");
3059 goto err;
3060 }
3061 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003062
Tim Peters5bd2a792003-02-01 16:45:06 +00003063 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3064 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 PyErr_NoMemory();
3066 goto err;
3067 }
3068 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003070 if (PyEval_GetRestricted()) {
3071 /* Restricted execution, get private tables */
Alexandre Vassalotti8b2d7132009-11-24 17:53:23 +00003072 PyObject *m = PyImport_ImportModule("copy_reg");
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003073
Tim Peters5b7da392003-02-04 00:21:07 +00003074 if (m == NULL)
3075 goto err;
3076 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00003078 if (self->dispatch_table == NULL)
3079 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 }
3081 else {
Tim Peters5b7da392003-02-04 00:21:07 +00003082 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 Py_INCREF(dispatch_table);
3084 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003085 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003090 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003092}
3093
3094
3095static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003096get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003098 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003100 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003101
Tim Peters92c8bb32003-02-13 23:00:26 +00003102 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003103 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003104 * accepts Pickler() and Pickler(integer) too. The meaning then
3105 * is clear as mud, undocumented, and not supported by pickle.py.
3106 * I'm told Zope uses this, but I haven't traced into this code
3107 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003108 */
3109 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003111 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003112 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3113 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114 return NULL;
3115 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003116 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003117}
3118
3119
3120static void
Tim Peterscba30e22003-02-01 06:24:36 +00003121Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003123 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 Py_XDECREF(self->write);
3125 Py_XDECREF(self->memo);
3126 Py_XDECREF(self->fast_memo);
3127 Py_XDECREF(self->arg);
3128 Py_XDECREF(self->file);
3129 Py_XDECREF(self->pers_func);
3130 Py_XDECREF(self->inst_pers_func);
3131 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003132 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003133 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003134}
3135
3136static int
3137Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3138{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003139 Py_VISIT(self->write);
3140 Py_VISIT(self->memo);
3141 Py_VISIT(self->fast_memo);
3142 Py_VISIT(self->arg);
3143 Py_VISIT(self->file);
3144 Py_VISIT(self->pers_func);
3145 Py_VISIT(self->inst_pers_func);
3146 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003147 return 0;
3148}
3149
3150static int
3151Pickler_clear(Picklerobject *self)
3152{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003153 Py_CLEAR(self->write);
3154 Py_CLEAR(self->memo);
3155 Py_CLEAR(self->fast_memo);
3156 Py_CLEAR(self->arg);
3157 Py_CLEAR(self->file);
3158 Py_CLEAR(self->pers_func);
3159 Py_CLEAR(self->inst_pers_func);
3160 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003161 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003162}
3163
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003164static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003165Pickler_get_pers_func(Picklerobject *p)
3166{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167 if (p->pers_func == NULL)
3168 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3169 else
3170 Py_INCREF(p->pers_func);
3171 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003172}
3173
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003174static int
3175Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3176{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 if (v == NULL) {
3178 PyErr_SetString(PyExc_TypeError,
3179 "attribute deletion is not supported");
3180 return -1;
3181 }
3182 Py_XDECREF(p->pers_func);
3183 Py_INCREF(v);
3184 p->pers_func = v;
3185 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003186}
3187
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003188static int
3189Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3190{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 if (v == NULL) {
3192 PyErr_SetString(PyExc_TypeError,
3193 "attribute deletion is not supported");
3194 return -1;
3195 }
3196 Py_XDECREF(p->inst_pers_func);
3197 Py_INCREF(v);
3198 p->inst_pers_func = v;
3199 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003200}
3201
3202static PyObject *
3203Pickler_get_memo(Picklerobject *p)
3204{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 if (p->memo == NULL)
3206 PyErr_SetString(PyExc_AttributeError, "memo");
3207 else
3208 Py_INCREF(p->memo);
3209 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003210}
3211
3212static int
3213Pickler_set_memo(Picklerobject *p, PyObject *v)
3214{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 if (v == NULL) {
3216 PyErr_SetString(PyExc_TypeError,
3217 "attribute deletion is not supported");
3218 return -1;
3219 }
3220 if (!PyDict_Check(v)) {
3221 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3222 return -1;
3223 }
3224 Py_XDECREF(p->memo);
3225 Py_INCREF(v);
3226 p->memo = v;
3227 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003228}
3229
3230static PyObject *
3231Pickler_get_error(Picklerobject *p)
3232{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 /* why is this an attribute on the Pickler? */
3234 Py_INCREF(PicklingError);
3235 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003236}
3237
3238static PyMemberDef Pickler_members[] = {
3239 {"binary", T_INT, offsetof(Picklerobject, bin)},
3240 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003241 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003242};
3243
3244static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003245 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003246 (setter)Pickler_set_pers_func},
3247 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3248 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003249 {"PicklingError", (getter)Pickler_get_error, NULL},
3250 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003251};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003253PyDoc_STRVAR(Picklertype__doc__,
3254"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003255
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003256static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003257 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003258 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003259 sizeof(Picklerobject), /*tp_basicsize*/
3260 0,
3261 (destructor)Pickler_dealloc, /* tp_dealloc */
3262 0, /* tp_print */
3263 0, /* tp_getattr */
3264 0, /* tp_setattr */
3265 0, /* tp_compare */
3266 0, /* tp_repr */
3267 0, /* tp_as_number */
3268 0, /* tp_as_sequence */
3269 0, /* tp_as_mapping */
3270 0, /* tp_hash */
3271 0, /* tp_call */
3272 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003273 PyObject_GenericGetAttr, /* tp_getattro */
3274 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003275 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003276 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003277 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003278 (traverseproc)Pickler_traverse, /* tp_traverse */
3279 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003280 0, /* tp_richcompare */
3281 0, /* tp_weaklistoffset */
3282 0, /* tp_iter */
3283 0, /* tp_iternext */
3284 Pickler_methods, /* tp_methods */
3285 Pickler_members, /* tp_members */
3286 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003287};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003288
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003289static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003290find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291{
3292 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 if (fc) {
3295 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003296 PyErr_SetString(UnpicklingError, "Global and instance "
3297 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 return NULL;
3299 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003300 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3301 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003302 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304 module = PySys_GetObject("modules");
3305 if (module == NULL)
3306 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308 module = PyDict_GetItem(module, py_module_name);
3309 if (module == NULL) {
3310 module = PyImport_Import(py_module_name);
3311 if (!module)
3312 return NULL;
3313 global = PyObject_GetAttr(module, py_global_name);
3314 Py_DECREF(module);
3315 }
3316 else
3317 global = PyObject_GetAttr(module, py_global_name);
3318 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003319}
3320
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003321static int
Tim Peterscba30e22003-02-01 06:24:36 +00003322marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003323{
3324 if (self->num_marks < 1) {
3325 PyErr_SetString(UnpicklingError, "could not find MARK");
3326 return -1;
3327 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003330}
3331
Tim Peters84e87f32001-03-17 04:50:51 +00003332
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333static int
Tim Peterscba30e22003-02-01 06:24:36 +00003334load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335{
3336 PDATA_APPEND(self->stack, Py_None, -1);
3337 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338}
3339
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003340static int
Tim Peterscba30e22003-02-01 06:24:36 +00003341bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342{
3343 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3344 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003345}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003346
3347static int
Tim Peterscba30e22003-02-01 06:24:36 +00003348load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349{
3350 PyObject *py_int = 0;
3351 char *endptr, *s;
3352 int len, res = -1;
3353 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Tim Peters0bc93f52003-02-02 18:29:33 +00003355 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 if (len < 2) return bad_readline();
3357 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359 errno = 0;
3360 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3363 /* Hm, maybe we've got something long. Let's try reading
3364 it as a Python long object. */
3365 errno = 0;
3366 py_int = PyLong_FromString(s, NULL, 0);
3367 if (py_int == NULL) {
3368 PyErr_SetString(PyExc_ValueError,
3369 "could not convert string to int");
3370 goto finally;
3371 }
3372 }
3373 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003374 if (len == 3 && (l == 0 || l == 1)) {
3375 if (!( py_int = PyBool_FromLong(l))) goto finally;
3376 }
3377 else {
3378 if (!( py_int = PyInt_FromLong(l))) goto finally;
3379 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 free(s);
3383 PDATA_PUSH(self->stack, py_int, -1);
3384 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 finally:
3387 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003389 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003390}
3391
Tim Peters3c67d792003-02-02 17:59:11 +00003392static int
3393load_bool(Unpicklerobject *self, PyObject *boolean)
3394{
3395 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003396 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003397 return 0;
3398}
3399
Tim Petersee1a53c2003-02-02 02:57:53 +00003400/* s contains x bytes of a little-endian integer. Return its value as a
3401 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3402 * int, but when x is 4 it's a signed one. This is an historical source
3403 * of x-platform bugs.
3404 */
Tim Peters84e87f32001-03-17 04:50:51 +00003405static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003406calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407{
3408 unsigned char c;
3409 int i;
3410 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003412 for (i = 0, l = 0L; i < x; i++) {
3413 c = (unsigned char)s[i];
3414 l |= (long)c << (i * 8);
3415 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003416#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3418 * is signed, so on a box with longs bigger than 4 bytes we need
3419 * to extend a BININT's sign bit to the full width.
3420 */
3421 if (x == 4 && l & (1L << 31))
3422 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003423#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425}
3426
3427
3428static int
Tim Peterscba30e22003-02-01 06:24:36 +00003429load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430{
3431 PyObject *py_int = 0;
3432 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Tim Peterscba30e22003-02-01 06:24:36 +00003436 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 PDATA_PUSH(self->stack, py_int, -1);
3440 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441}
3442
3443
3444static int
Tim Peterscba30e22003-02-01 06:24:36 +00003445load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446{
3447 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Tim Peters0bc93f52003-02-02 18:29:33 +00003449 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453}
3454
3455
3456static int
Tim Peterscba30e22003-02-01 06:24:36 +00003457load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458{
3459 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460
Tim Peters0bc93f52003-02-02 18:29:33 +00003461 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465}
3466
3467
3468static int
Tim Peterscba30e22003-02-01 06:24:36 +00003469load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470{
3471 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Tim Peters0bc93f52003-02-02 18:29:33 +00003473 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003474 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477}
Tim Peters84e87f32001-03-17 04:50:51 +00003478
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479static int
Tim Peterscba30e22003-02-01 06:24:36 +00003480load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481{
3482 PyObject *l = 0;
3483 char *end, *s;
3484 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Tim Peters0bc93f52003-02-02 18:29:33 +00003486 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003487 if (len < 2) return bad_readline();
3488 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
Tim Peterscba30e22003-02-01 06:24:36 +00003490 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 free(s);
3494 PDATA_PUSH(self->stack, l, -1);
3495 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003497 finally:
3498 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003501}
3502
Tim Petersee1a53c2003-02-02 02:57:53 +00003503/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3504 * data following.
3505 */
3506static int
3507load_counted_long(Unpicklerobject *self, int size)
3508{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003509 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003510 char *nbytes;
3511 unsigned char *pdata;
3512 PyObject *along;
3513
3514 assert(size == 1 || size == 4);
3515 i = self->read_func(self, &nbytes, size);
3516 if (i < 0) return -1;
3517
3518 size = calc_binint(nbytes, size);
3519 if (size < 0) {
3520 /* Corrupt or hostile pickle -- we never write one like
3521 * this.
3522 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003523 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003524 "byte count");
3525 return -1;
3526 }
3527
3528 if (size == 0)
3529 along = PyLong_FromLong(0L);
3530 else {
3531 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003532 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003533 if (i < 0) return -1;
3534 along = _PyLong_FromByteArray(pdata, (size_t)size,
3535 1 /* little endian */, 1 /* signed */);
3536 }
3537 if (along == NULL)
3538 return -1;
3539 PDATA_PUSH(self->stack, along, -1);
3540 return 0;
3541}
Tim Peters84e87f32001-03-17 04:50:51 +00003542
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543static int
Tim Peterscba30e22003-02-01 06:24:36 +00003544load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545{
3546 PyObject *py_float = 0;
3547 char *endptr, *s;
3548 int len, res = -1;
3549 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Tim Peters0bc93f52003-02-02 18:29:33 +00003551 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 if (len < 2) return bad_readline();
3553 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Eric Smith97be1ca2009-10-27 11:32:11 +00003555 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556
Eric Smith97be1ca2009-10-27 11:32:11 +00003557 if (d == -1.0 && PyErr_Occurred()) {
3558 goto finally;
3559 } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560 PyErr_SetString(PyExc_ValueError,
3561 "could not convert string to float");
3562 goto finally;
3563 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Tim Peterscba30e22003-02-01 06:24:36 +00003565 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 free(s);
3569 PDATA_PUSH(self->stack, py_float, -1);
3570 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572 finally:
3573 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003575 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576}
3577
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578static int
Tim Peterscba30e22003-02-01 06:24:36 +00003579load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003580{
Tim Peters9905b942003-03-20 20:53:32 +00003581 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 double x;
3583 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584
Tim Peters0bc93f52003-02-02 18:29:33 +00003585 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Tim Peters9905b942003-03-20 20:53:32 +00003588 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3589 if (x == -1.0 && PyErr_Occurred())
3590 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591
Tim Peters9905b942003-03-20 20:53:32 +00003592 py_float = PyFloat_FromDouble(x);
3593 if (py_float == NULL)
3594 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596 PDATA_PUSH(self->stack, py_float, -1);
3597 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003599
3600static int
Tim Peterscba30e22003-02-01 06:24:36 +00003601load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602{
3603 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003604 int len, res = -1;
3605 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Tim Peters0bc93f52003-02-02 18:29:33 +00003607 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (len < 2) return bad_readline();
3609 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003610
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003611
3612 /* Strip outermost quotes */
3613 while (s[len-1] <= ' ')
3614 len--;
3615 if(s[0]=='"' && s[len-1]=='"'){
3616 s[len-1] = '\0';
3617 p = s + 1 ;
3618 len -= 2;
3619 } else if(s[0]=='\'' && s[len-1]=='\''){
3620 s[len-1] = '\0';
3621 p = s + 1 ;
3622 len -= 2;
3623 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003624 goto insecure;
3625 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003626
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003627 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003628 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003629 if (str) {
3630 PDATA_PUSH(self->stack, str, -1);
3631 res = 0;
3632 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 insecure:
3636 free(s);
3637 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3638 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003639}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640
3641
3642static int
Tim Peterscba30e22003-02-01 06:24:36 +00003643load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644{
3645 PyObject *py_string = 0;
3646 long l;
3647 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003648
Tim Peters0bc93f52003-02-02 18:29:33 +00003649 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003652 if (l < 0) {
3653 /* Corrupt or hostile pickle -- we never write one like
3654 * this.
3655 */
3656 PyErr_SetString(UnpicklingError,
3657 "BINSTRING pickle has negative byte count");
3658 return -1;
3659 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Tim Peters0bc93f52003-02-02 18:29:33 +00003661 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003664 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003667 PDATA_PUSH(self->stack, py_string, -1);
3668 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669}
3670
3671
3672static int
Tim Peterscba30e22003-02-01 06:24:36 +00003673load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003674{
3675 PyObject *py_string = 0;
3676 unsigned char l;
3677 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678
Tim Peters0bc93f52003-02-02 18:29:33 +00003679 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003680 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003683
Tim Peters0bc93f52003-02-02 18:29:33 +00003684 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003685
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003686 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 PDATA_PUSH(self->stack, py_string, -1);
3689 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003690}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003691
3692
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003693#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003694static int
Tim Peterscba30e22003-02-01 06:24:36 +00003695load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696{
3697 PyObject *str = 0;
3698 int len, res = -1;
3699 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003700
Tim Peters0bc93f52003-02-02 18:29:33 +00003701 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003703
Tim Peterscba30e22003-02-01 06:24:36 +00003704 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 PDATA_PUSH(self->stack, str, -1);
3708 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 finally:
3711 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003712}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003713#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003714
3715
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003716#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003717static int
Tim Peterscba30e22003-02-01 06:24:36 +00003718load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719{
3720 PyObject *unicode;
3721 long l;
3722 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003723
Tim Peters0bc93f52003-02-02 18:29:33 +00003724 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003727 if (l < 0) {
3728 /* Corrupt or hostile pickle -- we never write one like
3729 * this.
3730 */
3731 PyErr_SetString(UnpicklingError,
3732 "BINUNICODE pickle has negative byte count");
3733 return -1;
3734 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003735
Tim Peters0bc93f52003-02-02 18:29:33 +00003736 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003737 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003738
Tim Peterscba30e22003-02-01 06:24:36 +00003739 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742 PDATA_PUSH(self->stack, unicode, -1);
3743 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003744}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003745#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003746
3747
3748static int
Tim Peterscba30e22003-02-01 06:24:36 +00003749load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003750{
3751 PyObject *tup;
3752 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 if ((i = marker(self)) < 0) return -1;
3755 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3756 PDATA_PUSH(self->stack, tup, -1);
3757 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758}
3759
3760static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003761load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003763 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Tim Peters1d63c9f2003-02-02 20:29:39 +00003765 if (tup == NULL)
3766 return -1;
3767
3768 while (--len >= 0) {
3769 PyObject *element;
3770
3771 PDATA_POP(self->stack, element);
3772 if (element == NULL)
3773 return -1;
3774 PyTuple_SET_ITEM(tup, len, element);
3775 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003776 PDATA_PUSH(self->stack, tup, -1);
3777 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778}
3779
3780static int
Tim Peterscba30e22003-02-01 06:24:36 +00003781load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782{
3783 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 if (!( list=PyList_New(0))) return -1;
3786 PDATA_PUSH(self->stack, list, -1);
3787 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788}
3789
3790static int
Tim Peterscba30e22003-02-01 06:24:36 +00003791load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792{
3793 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795 if (!( dict=PyDict_New())) return -1;
3796 PDATA_PUSH(self->stack, dict, -1);
3797 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798}
3799
3800
3801static int
Tim Peterscba30e22003-02-01 06:24:36 +00003802load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803{
3804 PyObject *list = 0;
3805 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003807 if ((i = marker(self)) < 0) return -1;
3808 if (!( list=Pdata_popList(self->stack, i))) return -1;
3809 PDATA_PUSH(self->stack, list, -1);
3810 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811}
3812
3813static int
Tim Peterscba30e22003-02-01 06:24:36 +00003814load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815{
3816 PyObject *dict, *key, *value;
3817 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 if ((i = marker(self)) < 0) return -1;
3820 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 for (k = i+1; k < j; k += 2) {
3825 key =self->stack->data[k-1];
3826 value=self->stack->data[k ];
3827 if (PyDict_SetItem(dict, key, value) < 0) {
3828 Py_DECREF(dict);
3829 return -1;
3830 }
3831 }
3832 Pdata_clear(self->stack, i);
3833 PDATA_PUSH(self->stack, dict, -1);
3834 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003835}
3836
3837static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003838Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003840 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 if (PyClass_Check(cls)) {
3843 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 if ((l=PyObject_Size(args)) < 0) goto err;
3846 if (!( l )) {
3847 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003848
Tim Peterscba30e22003-02-01 06:24:36 +00003849 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003850 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003852 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003853 so bypass usual construction */
3854 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003857 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003858 goto err;
3859 return inst;
3860 }
3861 Py_DECREF(__getinitargs__);
3862 }
Tim Peters84e87f32001-03-17 04:50:51 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 if ((r=PyInstance_New(cls, args, NULL))) return r;
3865 else goto err;
3866 }
Tim Peters84e87f32001-03-17 04:50:51 +00003867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870 err:
3871 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003872 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003875 tmp_value = v;
3876 /* NULL occurs when there was a KeyboardInterrupt */
3877 if (tmp_value == NULL)
3878 tmp_value = Py_None;
3879 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003880 Py_XDECREF(v);
3881 v=r;
3882 }
3883 PyErr_Restore(tp,v,tb);
3884 }
3885 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003886}
Tim Peters84e87f32001-03-17 04:50:51 +00003887
Guido van Rossum60456fd1997-04-09 17:36:32 +00003888
3889static int
Tim Peterscba30e22003-02-01 06:24:36 +00003890load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891{
3892 PyObject *class, *tup, *obj=0;
3893 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 if ((i = marker(self)) < 0) return -1;
3896 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3897 PDATA_POP(self->stack, class);
3898 if (class) {
3899 obj = Instance_New(class, tup);
3900 Py_DECREF(class);
3901 }
3902 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 if (! obj) return -1;
3905 PDATA_PUSH(self->stack, obj, -1);
3906 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907}
3908
3909
3910static int
Tim Peterscba30e22003-02-01 06:24:36 +00003911load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912{
3913 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3914 int i, len;
3915 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003918
Tim Peters0bc93f52003-02-02 18:29:33 +00003919 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003921 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003923
Tim Peters0bc93f52003-02-02 18:29:33 +00003924 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003925 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003926 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003927 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928 self->find_class);
3929 Py_DECREF(class_name);
3930 }
3931 }
3932 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003934 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936 if ((tup=Pdata_popTuple(self->stack, i))) {
3937 obj = Instance_New(class, tup);
3938 Py_DECREF(tup);
3939 }
3940 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 PDATA_PUSH(self->stack, obj, -1);
3945 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946}
3947
Tim Peterseab7db32003-02-13 18:24:14 +00003948static int
3949load_newobj(Unpicklerobject *self)
3950{
3951 PyObject *args = NULL;
3952 PyObject *clsraw = NULL;
3953 PyTypeObject *cls; /* clsraw cast to its true type */
3954 PyObject *obj;
3955
3956 /* Stack is ... cls argtuple, and we want to call
3957 * cls.__new__(cls, *argtuple).
3958 */
3959 PDATA_POP(self->stack, args);
3960 if (args == NULL) goto Fail;
3961 if (! PyTuple_Check(args)) {
3962 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3963 "tuple.");
3964 goto Fail;
3965 }
3966
3967 PDATA_POP(self->stack, clsraw);
3968 cls = (PyTypeObject *)clsraw;
3969 if (cls == NULL) goto Fail;
3970 if (! PyType_Check(cls)) {
3971 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3972 "isn't a type object");
3973 goto Fail;
3974 }
3975 if (cls->tp_new == NULL) {
3976 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3977 "has NULL tp_new");
3978 goto Fail;
3979 }
3980
3981 /* Call __new__. */
3982 obj = cls->tp_new(cls, args, NULL);
3983 if (obj == NULL) goto Fail;
3984
3985 Py_DECREF(args);
3986 Py_DECREF(clsraw);
3987 PDATA_PUSH(self->stack, obj, -1);
3988 return 0;
3989
3990 Fail:
3991 Py_XDECREF(args);
3992 Py_XDECREF(clsraw);
3993 return -1;
3994}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003995
3996static int
Tim Peterscba30e22003-02-01 06:24:36 +00003997load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998{
3999 PyObject *class = 0, *module_name = 0, *class_name = 0;
4000 int len;
4001 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004002
Tim Peters0bc93f52003-02-02 18:29:33 +00004003 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004005 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004007
Tim Peters0bc93f52003-02-02 18:29:33 +00004008 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00004009 if (len < 2) {
4010 Py_DECREF(module_name);
4011 return bad_readline();
4012 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004013 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00004014 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004015 self->find_class);
4016 Py_DECREF(class_name);
4017 }
4018 }
4019 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021 if (! class) return -1;
4022 PDATA_PUSH(self->stack, class, -1);
4023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004024}
4025
4026
4027static int
Tim Peterscba30e22003-02-01 06:24:36 +00004028load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029{
4030 PyObject *pid = 0;
4031 int len;
4032 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004035 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004036 if (len < 2) return bad_readline();
4037
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004038 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 if (!pid) return -1;
4040
4041 if (PyList_Check(self->pers_func)) {
4042 if (PyList_Append(self->pers_func, pid) < 0) {
4043 Py_DECREF(pid);
4044 return -1;
4045 }
4046 }
4047 else {
4048 ARG_TUP(self, pid);
4049 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004050 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051 NULL);
4052 FREE_ARG_TUP(self);
4053 }
4054 }
4055
4056 if (! pid) return -1;
4057
4058 PDATA_PUSH(self->stack, pid, -1);
4059 return 0;
4060 }
4061 else {
4062 PyErr_SetString(UnpicklingError,
4063 "A load persistent id instruction was encountered,\n"
4064 "but no persistent_load function was specified.");
4065 return -1;
4066 }
4067}
4068
4069static int
Tim Peterscba30e22003-02-01 06:24:36 +00004070load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071{
4072 PyObject *pid = 0;
4073
4074 if (self->pers_func) {
4075 PDATA_POP(self->stack, pid);
4076 if (! pid) return -1;
4077
4078 if (PyList_Check(self->pers_func)) {
4079 if (PyList_Append(self->pers_func, pid) < 0) {
4080 Py_DECREF(pid);
4081 return -1;
4082 }
4083 }
4084 else {
4085 ARG_TUP(self, pid);
4086 if (self->arg) {
4087 pid = PyObject_Call(self->pers_func, self->arg,
4088 NULL);
4089 FREE_ARG_TUP(self);
4090 }
4091 if (! pid) return -1;
4092 }
4093
4094 PDATA_PUSH(self->stack, pid, -1);
4095 return 0;
4096 }
4097 else {
4098 PyErr_SetString(UnpicklingError,
4099 "A load persistent id instruction was encountered,\n"
4100 "but no persistent_load function was specified.");
4101 return -1;
4102 }
4103}
4104
4105
4106static int
Tim Peterscba30e22003-02-01 06:24:36 +00004107load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108{
Collin Winter57bef682009-05-26 04:12:39 +00004109 int len = self->stack->length;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110
4111 /* Note that we split the (pickle.py) stack into two stacks,
4112 an object stack and a mark stack. We have to be clever and
4113 pop the right one. We do this by looking at the top of the
Collin Winter57bef682009-05-26 04:12:39 +00004114 mark stack first, and only signalling a stack underflow if
4115 the object stack is empty and the mark stack doesn't match
4116 our expectations.
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 */
Collin Winter57bef682009-05-26 04:12:39 +00004118 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 self->num_marks--;
Antoine Pitrou0d423b82010-01-07 17:46:49 +00004120 } else if (len > 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 len--;
4122 Py_DECREF(self->stack->data[len]);
Collin Winter57bef682009-05-26 04:12:39 +00004123 self->stack->length = len;
4124 } else {
4125 return stackUnderflow();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 return 0;
4128}
4129
4130
4131static int
Tim Peterscba30e22003-02-01 06:24:36 +00004132load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133{
4134 int i;
4135
4136 if ((i = marker(self)) < 0)
4137 return -1;
4138
4139 Pdata_clear(self->stack, i);
4140
4141 return 0;
4142}
4143
4144
4145static int
Tim Peterscba30e22003-02-01 06:24:36 +00004146load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147{
4148 PyObject *last;
4149 int len;
4150
4151 if ((len = self->stack->length) <= 0) return stackUnderflow();
4152 last=self->stack->data[len-1];
4153 Py_INCREF(last);
4154 PDATA_PUSH(self->stack, last, -1);
4155 return 0;
4156}
4157
4158
4159static int
Tim Peterscba30e22003-02-01 06:24:36 +00004160load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004161{
4162 PyObject *py_str = 0, *value = 0;
4163 int len;
4164 char *s;
4165 int rc;
4166
Tim Peters0bc93f52003-02-02 18:29:33 +00004167 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004168 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004169
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004170 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 value = PyDict_GetItem(self->memo, py_str);
4173 if (! value) {
4174 PyErr_SetObject(BadPickleGet, py_str);
4175 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004176 }
4177 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 PDATA_APPEND(self->stack, value, -1);
4179 rc = 0;
4180 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 Py_DECREF(py_str);
4183 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184}
4185
4186
4187static int
Tim Peterscba30e22003-02-01 06:24:36 +00004188load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189{
4190 PyObject *py_key = 0, *value = 0;
4191 unsigned char key;
4192 char *s;
4193 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194
Tim Peters0bc93f52003-02-02 18:29:33 +00004195 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 key = (unsigned char)s[0];
4198 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 value = PyDict_GetItem(self->memo, py_key);
4201 if (! value) {
4202 PyErr_SetObject(BadPickleGet, py_key);
4203 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004204 }
4205 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 PDATA_APPEND(self->stack, value, -1);
4207 rc = 0;
4208 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 Py_DECREF(py_key);
4211 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212}
4213
4214
4215static int
Tim Peterscba30e22003-02-01 06:24:36 +00004216load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217{
4218 PyObject *py_key = 0, *value = 0;
4219 unsigned char c;
4220 char *s;
4221 long key;
4222 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004223
Tim Peters0bc93f52003-02-02 18:29:33 +00004224 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 c = (unsigned char)s[0];
4227 key = (long)c;
4228 c = (unsigned char)s[1];
4229 key |= (long)c << 8;
4230 c = (unsigned char)s[2];
4231 key |= (long)c << 16;
4232 c = (unsigned char)s[3];
4233 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4236
4237 value = PyDict_GetItem(self->memo, py_key);
4238 if (! value) {
4239 PyErr_SetObject(BadPickleGet, py_key);
4240 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004241 }
4242 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 PDATA_APPEND(self->stack, value, -1);
4244 rc = 0;
4245 }
4246
4247 Py_DECREF(py_key);
4248 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004249}
4250
Tim Peters2d629652003-02-04 05:06:17 +00004251/* Push an object from the extension registry (EXT[124]). nbytes is
4252 * the number of bytes following the opcode, holding the index (code) value.
4253 */
4254static int
4255load_extension(Unpicklerobject *self, int nbytes)
4256{
4257 char *codebytes; /* the nbytes bytes after the opcode */
4258 long code; /* calc_binint returns long */
4259 PyObject *py_code; /* code as a Python int */
4260 PyObject *obj; /* the object to push */
4261 PyObject *pair; /* (module_name, class_name) */
4262 PyObject *module_name, *class_name;
4263
4264 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4265 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4266 code = calc_binint(codebytes, nbytes);
4267 if (code <= 0) { /* note that 0 is forbidden */
4268 /* Corrupt or hostile pickle. */
4269 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4270 return -1;
4271 }
4272
4273 /* Look for the code in the cache. */
4274 py_code = PyInt_FromLong(code);
4275 if (py_code == NULL) return -1;
4276 obj = PyDict_GetItem(extension_cache, py_code);
4277 if (obj != NULL) {
4278 /* Bingo. */
4279 Py_DECREF(py_code);
4280 PDATA_APPEND(self->stack, obj, -1);
4281 return 0;
4282 }
4283
4284 /* Look up the (module_name, class_name) pair. */
4285 pair = PyDict_GetItem(inverted_registry, py_code);
4286 if (pair == NULL) {
4287 Py_DECREF(py_code);
4288 PyErr_Format(PyExc_ValueError, "unregistered extension "
4289 "code %ld", code);
4290 return -1;
4291 }
4292 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004293 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004294 */
4295 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004296 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4297 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004298 Py_DECREF(py_code);
4299 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4300 "isn't a 2-tuple of strings", code);
4301 return -1;
4302 }
4303 /* Load the object. */
4304 obj = find_class(module_name, class_name, self->find_class);
4305 if (obj == NULL) {
4306 Py_DECREF(py_code);
4307 return -1;
4308 }
4309 /* Cache code -> obj. */
4310 code = PyDict_SetItem(extension_cache, py_code, obj);
4311 Py_DECREF(py_code);
4312 if (code < 0) {
4313 Py_DECREF(obj);
4314 return -1;
4315 }
4316 PDATA_PUSH(self->stack, obj, -1);
4317 return 0;
4318}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004319
4320static int
Tim Peterscba30e22003-02-01 06:24:36 +00004321load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322{
4323 PyObject *py_str = 0, *value = 0;
4324 int len, l;
4325 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326
Tim Peters0bc93f52003-02-02 18:29:33 +00004327 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 if (l < 2) return bad_readline();
4329 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004330 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 value=self->stack->data[len-1];
4332 l=PyDict_SetItem(self->memo, py_str, value);
4333 Py_DECREF(py_str);
4334 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335}
4336
4337
4338static int
Tim Peterscba30e22003-02-01 06:24:36 +00004339load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340{
4341 PyObject *py_key = 0, *value = 0;
4342 unsigned char key;
4343 char *s;
4344 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004345
Tim Peters0bc93f52003-02-02 18:29:33 +00004346 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004349 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4352 value=self->stack->data[len-1];
4353 len=PyDict_SetItem(self->memo, py_key, value);
4354 Py_DECREF(py_key);
4355 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356}
4357
4358
4359static int
Tim Peterscba30e22003-02-01 06:24:36 +00004360load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361{
4362 PyObject *py_key = 0, *value = 0;
4363 long key;
4364 unsigned char c;
4365 char *s;
4366 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Tim Peters0bc93f52003-02-02 18:29:33 +00004368 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 c = (unsigned char)s[0];
4372 key = (long)c;
4373 c = (unsigned char)s[1];
4374 key |= (long)c << 8;
4375 c = (unsigned char)s[2];
4376 key |= (long)c << 16;
4377 c = (unsigned char)s[3];
4378 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 if (!( py_key = PyInt_FromLong(key))) return -1;
4381 value=self->stack->data[len-1];
4382 len=PyDict_SetItem(self->memo, py_key, value);
4383 Py_DECREF(py_key);
4384 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385}
4386
4387
4388static int
Tim Peterscba30e22003-02-01 06:24:36 +00004389do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390{
4391 PyObject *value = 0, *list = 0, *append_method = 0;
4392 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 len=self->stack->length;
4395 if (!( len >= x && x > 0 )) return stackUnderflow();
4396 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004397 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004399 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 if (PyList_Check(list)) {
4402 PyObject *slice;
4403 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004406 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 list_len = PyList_GET_SIZE(list);
4408 i=PyList_SetSlice(list, list_len, list_len, slice);
4409 Py_DECREF(slice);
4410 return i;
4411 }
4412 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004413
Tim Peterscba30e22003-02-01 06:24:36 +00004414 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 return -1;
4416
4417 for (i = x; i < len; i++) {
4418 PyObject *junk;
4419
4420 value=self->stack->data[i];
4421 junk=0;
4422 ARG_TUP(self, value);
4423 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004424 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 NULL);
4426 FREE_ARG_TUP(self);
4427 }
4428 if (! junk) {
4429 Pdata_clear(self->stack, i+1);
4430 self->stack->length=x;
4431 Py_DECREF(append_method);
4432 return -1;
4433 }
4434 Py_DECREF(junk);
4435 }
4436 self->stack->length=x;
4437 Py_DECREF(append_method);
4438 }
4439
4440 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004441}
4442
4443
4444static int
Tim Peterscba30e22003-02-01 06:24:36 +00004445load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446{
4447 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004448}
4449
4450
4451static int
Tim Peterscba30e22003-02-01 06:24:36 +00004452load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453{
4454 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004455}
4456
4457
4458static int
Tim Peterscba30e22003-02-01 06:24:36 +00004459do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460{
4461 PyObject *value = 0, *key = 0, *dict = 0;
4462 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 if (!( (len=self->stack->length) >= x
4465 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 for (i = x+1; i < len; i += 2) {
4470 key =self->stack->data[i-1];
4471 value=self->stack->data[i ];
4472 if (PyObject_SetItem(dict, key, value) < 0) {
4473 r=-1;
4474 break;
4475 }
4476 }
4477
4478 Pdata_clear(self->stack, x);
4479
4480 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004481}
4482
4483
Tim Peters84e87f32001-03-17 04:50:51 +00004484static int
Tim Peterscba30e22003-02-01 06:24:36 +00004485load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486{
4487 return do_setitems(self, self->stack->length - 2);
4488}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490static int
Tim Peterscba30e22003-02-01 06:24:36 +00004491load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492{
4493 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494}
4495
Tim Peters84e87f32001-03-17 04:50:51 +00004496
Guido van Rossum60456fd1997-04-09 17:36:32 +00004497static int
Tim Peterscba30e22003-02-01 06:24:36 +00004498load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499{
Tim Peters080c88b2003-02-15 03:01:11 +00004500 PyObject *state, *inst, *slotstate;
4501 PyObject *__setstate__;
4502 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004503 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004504 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505
Tim Peters080c88b2003-02-15 03:01:11 +00004506 /* Stack is ... instance, state. We want to leave instance at
4507 * the stack top, possibly mutated via instance.__setstate__(state).
4508 */
4509 if (self->stack->length < 2)
4510 return stackUnderflow();
4511 PDATA_POP(self->stack, state);
4512 if (state == NULL)
4513 return -1;
4514 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515
Tim Peters080c88b2003-02-15 03:01:11 +00004516 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4517 if (__setstate__ != NULL) {
4518 PyObject *junk = NULL;
4519
4520 /* The explicit __setstate__ is responsible for everything. */
4521 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 if (self->arg) {
4523 junk = PyObject_Call(__setstate__, self->arg, NULL);
4524 FREE_ARG_TUP(self);
4525 }
4526 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004527 if (junk == NULL)
4528 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 Py_DECREF(junk);
4530 return 0;
4531 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004532 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4533 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004535
4536 /* A default __setstate__. First see whether state embeds a
4537 * slot state dict too (a proto 2 addition).
4538 */
4539 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4540 PyObject *temp = state;
4541 state = PyTuple_GET_ITEM(temp, 0);
4542 slotstate = PyTuple_GET_ITEM(temp, 1);
4543 Py_INCREF(state);
4544 Py_INCREF(slotstate);
4545 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004546 }
Tim Peters080c88b2003-02-15 03:01:11 +00004547 else
4548 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549
Tim Peters080c88b2003-02-15 03:01:11 +00004550 /* Set inst.__dict__ from the state dict (if any). */
4551 if (state != Py_None) {
4552 PyObject *dict;
4553 if (! PyDict_Check(state)) {
4554 PyErr_SetString(UnpicklingError, "state is not a "
4555 "dictionary");
4556 goto finally;
4557 }
4558 dict = PyObject_GetAttr(inst, __dict___str);
4559 if (dict == NULL)
4560 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561
Tim Peters080c88b2003-02-15 03:01:11 +00004562 i = 0;
4563 while (PyDict_Next(state, &i, &d_key, &d_value)) {
Antoine Pitrou74309892009-05-02 21:13:23 +00004564 /* normally the keys for instance attributes are
4565 interned. we should try to do that here. */
4566 Py_INCREF(d_key);
4567 if (PyString_CheckExact(d_key))
4568 PyString_InternInPlace(&d_key);
4569 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4570 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004571 goto finally;
Antoine Pitrou74309892009-05-02 21:13:23 +00004572 }
4573 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004574 }
4575 Py_DECREF(dict);
4576 }
4577
4578 /* Also set instance attributes from the slotstate dict (if any). */
4579 if (slotstate != NULL) {
4580 if (! PyDict_Check(slotstate)) {
4581 PyErr_SetString(UnpicklingError, "slot state is not "
4582 "a dictionary");
4583 goto finally;
4584 }
4585 i = 0;
4586 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4587 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4588 goto finally;
4589 }
4590 }
4591 res = 0;
4592
4593 finally:
4594 Py_DECREF(state);
4595 Py_XDECREF(slotstate);
4596 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004597}
4598
4599
4600static int
Tim Peterscba30e22003-02-01 06:24:36 +00004601load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602{
4603 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 /* Note that we split the (pickle.py) stack into two stacks, an
4606 object stack and a mark stack. Here we push a mark onto the
4607 mark stack.
4608 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004610 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004611 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 s=self->marks_size+20;
4613 if (s <= self->num_marks) s=self->num_marks + 1;
4614 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004615 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004617 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004619 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004620 PyErr_NoMemory();
4621 return -1;
4622 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004623 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624 self->marks_size = s;
4625 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004629 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630}
4631
Guido van Rossum60456fd1997-04-09 17:36:32 +00004632static int
Tim Peterscba30e22003-02-01 06:24:36 +00004633load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634{
4635 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 PDATA_POP(self->stack, arg_tup);
4638 if (! arg_tup) return -1;
4639 PDATA_POP(self->stack, callable);
4640 if (callable) {
4641 ob = Instance_New(callable, arg_tup);
4642 Py_DECREF(callable);
4643 }
4644 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 PDATA_PUSH(self->stack, ob, -1);
4649 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650}
Tim Peters84e87f32001-03-17 04:50:51 +00004651
Tim Peters4190fb82003-02-02 16:09:05 +00004652/* Just raises an error if we don't know the protocol specified. PROTO
4653 * is the first opcode for protocols >= 2.
4654 */
4655static int
4656load_proto(Unpicklerobject *self)
4657{
4658 int i;
4659 char *protobyte;
4660
4661 i = self->read_func(self, &protobyte, 1);
4662 if (i < 0)
4663 return -1;
4664
4665 i = calc_binint(protobyte, 1);
4666 /* No point checking for < 0, since calc_binint returns an unsigned
4667 * int when chewing on 1 byte.
4668 */
4669 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004670 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004671 return 0;
4672
4673 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4674 return -1;
4675}
4676
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004678load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679{
4680 PyObject *err = 0, *val = 0;
4681 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 self->num_marks = 0;
4684 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004687 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 switch (s[0]) {
4691 case NONE:
4692 if (load_none(self) < 0)
4693 break;
4694 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 case BININT:
4697 if (load_binint(self) < 0)
4698 break;
4699 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 case BININT1:
4702 if (load_binint1(self) < 0)
4703 break;
4704 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 case BININT2:
4707 if (load_binint2(self) < 0)
4708 break;
4709 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case INT:
4712 if (load_int(self) < 0)
4713 break;
4714 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case LONG:
4717 if (load_long(self) < 0)
4718 break;
4719 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004720
Tim Petersee1a53c2003-02-02 02:57:53 +00004721 case LONG1:
4722 if (load_counted_long(self, 1) < 0)
4723 break;
4724 continue;
4725
4726 case LONG4:
4727 if (load_counted_long(self, 4) < 0)
4728 break;
4729 continue;
4730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 case FLOAT:
4732 if (load_float(self) < 0)
4733 break;
4734 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 case BINFLOAT:
4737 if (load_binfloat(self) < 0)
4738 break;
4739 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 case BINSTRING:
4742 if (load_binstring(self) < 0)
4743 break;
4744 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 case SHORT_BINSTRING:
4747 if (load_short_binstring(self) < 0)
4748 break;
4749 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 case STRING:
4752 if (load_string(self) < 0)
4753 break;
4754 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004755
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004756#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 case UNICODE:
4758 if (load_unicode(self) < 0)
4759 break;
4760 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 case BINUNICODE:
4763 if (load_binunicode(self) < 0)
4764 break;
4765 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004766#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004769 if (load_counted_tuple(self, 0) < 0)
4770 break;
4771 continue;
4772
4773 case TUPLE1:
4774 if (load_counted_tuple(self, 1) < 0)
4775 break;
4776 continue;
4777
4778 case TUPLE2:
4779 if (load_counted_tuple(self, 2) < 0)
4780 break;
4781 continue;
4782
4783 case TUPLE3:
4784 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 break;
4786 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 case TUPLE:
4789 if (load_tuple(self) < 0)
4790 break;
4791 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 case EMPTY_LIST:
4794 if (load_empty_list(self) < 0)
4795 break;
4796 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 case LIST:
4799 if (load_list(self) < 0)
4800 break;
4801 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 case EMPTY_DICT:
4804 if (load_empty_dict(self) < 0)
4805 break;
4806 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 case DICT:
4809 if (load_dict(self) < 0)
4810 break;
4811 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 case OBJ:
4814 if (load_obj(self) < 0)
4815 break;
4816 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 case INST:
4819 if (load_inst(self) < 0)
4820 break;
4821 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004822
Tim Peterseab7db32003-02-13 18:24:14 +00004823 case NEWOBJ:
4824 if (load_newobj(self) < 0)
4825 break;
4826 continue;
4827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 case GLOBAL:
4829 if (load_global(self) < 0)
4830 break;
4831 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 case APPEND:
4834 if (load_append(self) < 0)
4835 break;
4836 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 case APPENDS:
4839 if (load_appends(self) < 0)
4840 break;
4841 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 case BUILD:
4844 if (load_build(self) < 0)
4845 break;
4846 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004848 case DUP:
4849 if (load_dup(self) < 0)
4850 break;
4851 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004853 case BINGET:
4854 if (load_binget(self) < 0)
4855 break;
4856 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 case LONG_BINGET:
4859 if (load_long_binget(self) < 0)
4860 break;
4861 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 case GET:
4864 if (load_get(self) < 0)
4865 break;
4866 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004867
Tim Peters2d629652003-02-04 05:06:17 +00004868 case EXT1:
4869 if (load_extension(self, 1) < 0)
4870 break;
4871 continue;
4872
4873 case EXT2:
4874 if (load_extension(self, 2) < 0)
4875 break;
4876 continue;
4877
4878 case EXT4:
4879 if (load_extension(self, 4) < 0)
4880 break;
4881 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 case MARK:
4883 if (load_mark(self) < 0)
4884 break;
4885 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 case BINPUT:
4888 if (load_binput(self) < 0)
4889 break;
4890 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case LONG_BINPUT:
4893 if (load_long_binput(self) < 0)
4894 break;
4895 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 case PUT:
4898 if (load_put(self) < 0)
4899 break;
4900 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case POP:
4903 if (load_pop(self) < 0)
4904 break;
4905 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 case POP_MARK:
4908 if (load_pop_mark(self) < 0)
4909 break;
4910 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 case SETITEM:
4913 if (load_setitem(self) < 0)
4914 break;
4915 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 case SETITEMS:
4918 if (load_setitems(self) < 0)
4919 break;
4920 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 case STOP:
4923 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 case PERSID:
4926 if (load_persid(self) < 0)
4927 break;
4928 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 case BINPERSID:
4931 if (load_binpersid(self) < 0)
4932 break;
4933 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 case REDUCE:
4936 if (load_reduce(self) < 0)
4937 break;
4938 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004939
Tim Peters4190fb82003-02-02 16:09:05 +00004940 case PROTO:
4941 if (load_proto(self) < 0)
4942 break;
4943 continue;
4944
Tim Peters3c67d792003-02-02 17:59:11 +00004945 case NEWTRUE:
4946 if (load_bool(self, Py_True) < 0)
4947 break;
4948 continue;
4949
4950 case NEWFALSE:
4951 if (load_bool(self, Py_False) < 0)
4952 break;
4953 continue;
4954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 case '\0':
4956 /* end of file */
4957 PyErr_SetNone(PyExc_EOFError);
4958 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004961 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962 "invalid load key, '%s'.",
4963 "c", s[0]);
4964 return NULL;
4965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 break;
4968 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 if ((err = PyErr_Occurred())) {
4971 if (err == PyExc_EOFError) {
4972 PyErr_SetNone(PyExc_EOFError);
4973 }
4974 return NULL;
4975 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977 PDATA_POP(self->stack, val);
4978 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004979}
Tim Peters84e87f32001-03-17 04:50:51 +00004980
Guido van Rossum60456fd1997-04-09 17:36:32 +00004981
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004982/* No-load functions to support noload, which is used to
4983 find persistent references. */
4984
4985static int
Tim Peterscba30e22003-02-01 06:24:36 +00004986noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987{
4988 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 if ((i = marker(self)) < 0) return -1;
4991 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004992}
4993
4994
4995static int
Tim Peterscba30e22003-02-01 06:24:36 +00004996noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004997{
4998 int i;
4999 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 if ((i = marker(self)) < 0) return -1;
5002 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00005003 if (self->readline_func(self, &s) < 0) return -1;
5004 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00005005 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005007}
5008
5009static int
Tim Peterseab7db32003-02-13 18:24:14 +00005010noload_newobj(Unpicklerobject *self)
5011{
5012 PyObject *obj;
5013
5014 PDATA_POP(self->stack, obj); /* pop argtuple */
5015 if (obj == NULL) return -1;
5016 Py_DECREF(obj);
5017
5018 PDATA_POP(self->stack, obj); /* pop cls */
5019 if (obj == NULL) return -1;
5020 Py_DECREF(obj);
5021
5022 PDATA_APPEND(self->stack, Py_None, -1);
5023 return 0;
5024}
5025
5026static int
Tim Peterscba30e22003-02-01 06:24:36 +00005027noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005028{
5029 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005030
Tim Peters0bc93f52003-02-02 18:29:33 +00005031 if (self->readline_func(self, &s) < 0) return -1;
5032 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 PDATA_APPEND(self->stack, Py_None,-1);
5034 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005035}
5036
5037static int
Tim Peterscba30e22003-02-01 06:24:36 +00005038noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005039{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 if (self->stack->length < 2) return stackUnderflow();
5042 Pdata_clear(self->stack, self->stack->length-2);
5043 PDATA_APPEND(self->stack, Py_None,-1);
5044 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005045}
5046
5047static int
5048noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005049
Guido van Rossum053b8df1998-11-25 16:18:00 +00005050 if (self->stack->length < 1) return stackUnderflow();
5051 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00005052 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005053}
5054
Tim Peters2d629652003-02-04 05:06:17 +00005055static int
5056noload_extension(Unpicklerobject *self, int nbytes)
5057{
5058 char *codebytes;
5059
5060 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5061 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5062 PDATA_APPEND(self->stack, Py_None, -1);
5063 return 0;
5064}
5065
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005066static int
5067noload_append(Unpicklerobject *self)
5068{
5069 return Pdata_clear(self->stack, self->stack->length - 1);
5070}
5071
5072static int
5073noload_appends(Unpicklerobject *self)
5074{
5075 int i;
5076 if ((i = marker(self)) < 0) return -1;
5077 return Pdata_clear(self->stack, i);
5078}
5079
5080static int
5081noload_setitem(Unpicklerobject *self)
5082{
5083 return Pdata_clear(self->stack, self->stack->length - 2);
5084}
5085
5086static int
5087noload_setitems(Unpicklerobject *self)
5088{
5089 int i;
5090 if ((i = marker(self)) < 0) return -1;
5091 return Pdata_clear(self->stack, i);
5092}
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005093
5094static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005095noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005096{
5097 PyObject *err = 0, *val = 0;
5098 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 self->num_marks = 0;
5101 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005103 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00005104 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005105 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 switch (s[0]) {
5108 case NONE:
5109 if (load_none(self) < 0)
5110 break;
5111 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005113 case BININT:
5114 if (load_binint(self) < 0)
5115 break;
5116 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005118 case BININT1:
5119 if (load_binint1(self) < 0)
5120 break;
5121 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005123 case BININT2:
5124 if (load_binint2(self) < 0)
5125 break;
5126 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 case INT:
5129 if (load_int(self) < 0)
5130 break;
5131 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 case LONG:
5134 if (load_long(self) < 0)
5135 break;
5136 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005137
Tim Peters4190fb82003-02-02 16:09:05 +00005138 case LONG1:
5139 if (load_counted_long(self, 1) < 0)
5140 break;
5141 continue;
5142
5143 case LONG4:
5144 if (load_counted_long(self, 4) < 0)
5145 break;
5146 continue;
5147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 case FLOAT:
5149 if (load_float(self) < 0)
5150 break;
5151 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 case BINFLOAT:
5154 if (load_binfloat(self) < 0)
5155 break;
5156 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158 case BINSTRING:
5159 if (load_binstring(self) < 0)
5160 break;
5161 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163 case SHORT_BINSTRING:
5164 if (load_short_binstring(self) < 0)
5165 break;
5166 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 case STRING:
5169 if (load_string(self) < 0)
5170 break;
5171 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005172
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005173#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 case UNICODE:
5175 if (load_unicode(self) < 0)
5176 break;
5177 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 case BINUNICODE:
5180 if (load_binunicode(self) < 0)
5181 break;
5182 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005183#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005186 if (load_counted_tuple(self, 0) < 0)
5187 break;
5188 continue;
5189
5190 case TUPLE1:
5191 if (load_counted_tuple(self, 1) < 0)
5192 break;
5193 continue;
5194
5195 case TUPLE2:
5196 if (load_counted_tuple(self, 2) < 0)
5197 break;
5198 continue;
5199
5200 case TUPLE3:
5201 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 break;
5203 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 case TUPLE:
5206 if (load_tuple(self) < 0)
5207 break;
5208 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005210 case EMPTY_LIST:
5211 if (load_empty_list(self) < 0)
5212 break;
5213 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 case LIST:
5216 if (load_list(self) < 0)
5217 break;
5218 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005220 case EMPTY_DICT:
5221 if (load_empty_dict(self) < 0)
5222 break;
5223 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 case DICT:
5226 if (load_dict(self) < 0)
5227 break;
5228 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 case OBJ:
5231 if (noload_obj(self) < 0)
5232 break;
5233 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 case INST:
5236 if (noload_inst(self) < 0)
5237 break;
5238 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005239
Tim Peterseab7db32003-02-13 18:24:14 +00005240 case NEWOBJ:
5241 if (noload_newobj(self) < 0)
5242 break;
5243 continue;
5244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005245 case GLOBAL:
5246 if (noload_global(self) < 0)
5247 break;
5248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005250 case APPEND:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005251 if (noload_append(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005252 break;
5253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005255 case APPENDS:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005256 if (noload_appends(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005257 break;
5258 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005260 case BUILD:
5261 if (noload_build(self) < 0)
5262 break;
5263 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 case DUP:
5266 if (load_dup(self) < 0)
5267 break;
5268 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005270 case BINGET:
5271 if (load_binget(self) < 0)
5272 break;
5273 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275 case LONG_BINGET:
5276 if (load_long_binget(self) < 0)
5277 break;
5278 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005280 case GET:
5281 if (load_get(self) < 0)
5282 break;
5283 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005284
Tim Peters2d629652003-02-04 05:06:17 +00005285 case EXT1:
5286 if (noload_extension(self, 1) < 0)
5287 break;
5288 continue;
5289
5290 case EXT2:
5291 if (noload_extension(self, 2) < 0)
5292 break;
5293 continue;
5294
5295 case EXT4:
5296 if (noload_extension(self, 4) < 0)
5297 break;
5298 continue;
5299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005300 case MARK:
5301 if (load_mark(self) < 0)
5302 break;
5303 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005305 case BINPUT:
5306 if (load_binput(self) < 0)
5307 break;
5308 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005310 case LONG_BINPUT:
5311 if (load_long_binput(self) < 0)
5312 break;
5313 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315 case PUT:
5316 if (load_put(self) < 0)
5317 break;
5318 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005320 case POP:
5321 if (load_pop(self) < 0)
5322 break;
5323 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005325 case POP_MARK:
5326 if (load_pop_mark(self) < 0)
5327 break;
5328 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005330 case SETITEM:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005331 if (noload_setitem(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005332 break;
5333 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 case SETITEMS:
Neil Schemenauer973f8b42009-10-14 19:33:31 +00005336 if (noload_setitems(self) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005337 break;
5338 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005340 case STOP:
5341 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005343 case PERSID:
5344 if (load_persid(self) < 0)
5345 break;
5346 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005348 case BINPERSID:
5349 if (load_binpersid(self) < 0)
5350 break;
5351 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005353 case REDUCE:
5354 if (noload_reduce(self) < 0)
5355 break;
5356 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005357
Tim Peters4190fb82003-02-02 16:09:05 +00005358 case PROTO:
5359 if (load_proto(self) < 0)
5360 break;
5361 continue;
5362
Tim Peters3c67d792003-02-02 17:59:11 +00005363 case NEWTRUE:
5364 if (load_bool(self, Py_True) < 0)
5365 break;
5366 continue;
5367
5368 case NEWFALSE:
5369 if (load_bool(self, Py_False) < 0)
5370 break;
5371 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005372 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005373 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005374 "invalid load key, '%s'.",
5375 "c", s[0]);
5376 return NULL;
5377 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379 break;
5380 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005382 if ((err = PyErr_Occurred())) {
5383 if (err == PyExc_EOFError) {
5384 PyErr_SetNone(PyExc_EOFError);
5385 }
5386 return NULL;
5387 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005389 PDATA_POP(self->stack, val);
5390 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005391}
Tim Peters84e87f32001-03-17 04:50:51 +00005392
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005393
Guido van Rossum60456fd1997-04-09 17:36:32 +00005394static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005395Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005398}
5399
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005400static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005401Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005403 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005404}
5405
Guido van Rossum60456fd1997-04-09 17:36:32 +00005406
5407static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005408 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005409 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005410 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005411 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005412 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005413 "noload() -- not load a pickle, but go through most of the motions\n"
5414 "\n"
5415 "This function can be used to read past a pickle without instantiating\n"
5416 "any objects or importing any modules. It can also be used to find all\n"
5417 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005418 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005419 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005420 {NULL, NULL} /* sentinel */
5421};
5422
5423
5424static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005425newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426{
5427 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005428
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005429 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005430 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 self->file = NULL;
5433 self->arg = NULL;
5434 self->stack = (Pdata*)Pdata_New();
5435 self->pers_func = NULL;
5436 self->last_string = NULL;
5437 self->marks = NULL;
5438 self->num_marks = 0;
5439 self->marks_size = 0;
5440 self->buf_size = 0;
5441 self->read = NULL;
5442 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005443 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005444
Tim Peterscba30e22003-02-01 06:24:36 +00005445 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005447
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005448 if (!self->stack)
5449 goto err;
5450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 Py_INCREF(f);
5452 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454 /* Set read, readline based on type of f */
5455 if (PyFile_Check(f)) {
5456 self->fp = PyFile_AsFile(f);
5457 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005458 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 "I/O operation on closed file");
5460 goto err;
5461 }
5462 self->read_func = read_file;
5463 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005464 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 else if (PycStringIO_InputCheck(f)) {
5466 self->fp = NULL;
5467 self->read_func = read_cStringIO;
5468 self->readline_func = readline_cStringIO;
5469 }
5470 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 self->fp = NULL;
5473 self->read_func = read_other;
5474 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5477 (self->read = PyObject_GetAttr(f, read_str)))) {
5478 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005479 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 "argument must have 'read' and "
5481 "'readline' attributes" );
5482 goto err;
5483 }
5484 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005485 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005489 err:
5490 Py_DECREF((PyObject *)self);
5491 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005492}
5493
5494
5495static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005496get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005499}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005500
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005501
Guido van Rossum60456fd1997-04-09 17:36:32 +00005502static void
Tim Peterscba30e22003-02-01 06:24:36 +00005503Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005504{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005505 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005506 Py_XDECREF(self->readline);
5507 Py_XDECREF(self->read);
5508 Py_XDECREF(self->file);
5509 Py_XDECREF(self->memo);
5510 Py_XDECREF(self->stack);
5511 Py_XDECREF(self->pers_func);
5512 Py_XDECREF(self->arg);
5513 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005514 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005516 if (self->marks) {
5517 free(self->marks);
5518 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005520 if (self->buf_size) {
5521 free(self->buf);
5522 }
Tim Peters84e87f32001-03-17 04:50:51 +00005523
Christian Heimese93237d2007-12-19 02:37:44 +00005524 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005525}
5526
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005527static int
5528Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5529{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005530 Py_VISIT(self->readline);
5531 Py_VISIT(self->read);
5532 Py_VISIT(self->file);
5533 Py_VISIT(self->memo);
5534 Py_VISIT(self->stack);
5535 Py_VISIT(self->pers_func);
5536 Py_VISIT(self->arg);
5537 Py_VISIT(self->last_string);
5538 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005539 return 0;
5540}
5541
5542static int
5543Unpickler_clear(Unpicklerobject *self)
5544{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005545 Py_CLEAR(self->readline);
5546 Py_CLEAR(self->read);
5547 Py_CLEAR(self->file);
5548 Py_CLEAR(self->memo);
5549 Py_CLEAR(self->stack);
5550 Py_CLEAR(self->pers_func);
5551 Py_CLEAR(self->arg);
5552 Py_CLEAR(self->last_string);
5553 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005554 return 0;
5555}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005556
5557static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005558Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005559{
5560 if (!strcmp(name, "persistent_load")) {
5561 if (!self->pers_func) {
5562 PyErr_SetString(PyExc_AttributeError, name);
5563 return NULL;
5564 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005566 Py_INCREF(self->pers_func);
5567 return self->pers_func;
5568 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005570 if (!strcmp(name, "find_global")) {
5571 if (!self->find_class) {
5572 PyErr_SetString(PyExc_AttributeError, name);
5573 return NULL;
5574 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005576 Py_INCREF(self->find_class);
5577 return self->find_class;
5578 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005580 if (!strcmp(name, "memo")) {
5581 if (!self->memo) {
5582 PyErr_SetString(PyExc_AttributeError, name);
5583 return NULL;
5584 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005586 Py_INCREF(self->memo);
5587 return self->memo;
5588 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005590 if (!strcmp(name, "UnpicklingError")) {
5591 Py_INCREF(UnpicklingError);
5592 return UnpicklingError;
5593 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005595 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005596}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005597
Guido van Rossum60456fd1997-04-09 17:36:32 +00005598
5599static int
Tim Peterscba30e22003-02-01 06:24:36 +00005600Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005601{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005603 if (!strcmp(name, "persistent_load")) {
5604 Py_XDECREF(self->pers_func);
5605 self->pers_func = value;
5606 Py_XINCREF(value);
5607 return 0;
5608 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005610 if (!strcmp(name, "find_global")) {
5611 Py_XDECREF(self->find_class);
5612 self->find_class = value;
5613 Py_XINCREF(value);
5614 return 0;
5615 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005617 if (! value) {
5618 PyErr_SetString(PyExc_TypeError,
5619 "attribute deletion is not supported");
5620 return -1;
5621 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005623 if (strcmp(name, "memo") == 0) {
5624 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005625 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005626 "memo must be a dictionary");
5627 return -1;
5628 }
5629 Py_XDECREF(self->memo);
5630 self->memo = value;
5631 Py_INCREF(value);
5632 return 0;
5633 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005635 PyErr_SetString(PyExc_AttributeError, name);
5636 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005637}
5638
Tim Peters5bd2a792003-02-01 16:45:06 +00005639/* ---------------------------------------------------------------------------
5640 * Module-level functions.
5641 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005642
Martin v. Löwis544f1192004-07-27 05:22:33 +00005643/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005644static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005645cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005646{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005647 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005648 PyObject *ob, *file, *res = NULL;
5649 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005650 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005651
Martin v. Löwis544f1192004-07-27 05:22:33 +00005652 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5653 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005654 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005655
Tim Peters5bd2a792003-02-01 16:45:06 +00005656 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005657 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005659 if (dump(pickler, ob) < 0)
5660 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005662 Py_INCREF(Py_None);
5663 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005665 finally:
5666 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005668 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005669}
5670
5671
Martin v. Löwis544f1192004-07-27 05:22:33 +00005672/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005673static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005674cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005675{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005676 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005677 PyObject *ob, *file = 0, *res = NULL;
5678 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005679 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005680
Martin v. Löwis544f1192004-07-27 05:22:33 +00005681 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5682 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005684
Tim Peterscba30e22003-02-01 06:24:36 +00005685 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005686 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005687
Tim Peters5bd2a792003-02-01 16:45:06 +00005688 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005689 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005691 if (dump(pickler, ob) < 0)
5692 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005694 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005696 finally:
5697 Py_XDECREF(pickler);
5698 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005700 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005701}
5702
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005703
Tim Peters5bd2a792003-02-01 16:45:06 +00005704/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005705static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005706cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005707{
5708 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005709 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005710
Tim Peterscba30e22003-02-01 06:24:36 +00005711 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005712 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005714 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005716 finally:
5717 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005719 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005720}
5721
5722
Tim Peters5bd2a792003-02-01 16:45:06 +00005723/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005724static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005725cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005726{
5727 PyObject *ob, *file = 0, *res = NULL;
5728 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005729
Tim Peterscba30e22003-02-01 06:24:36 +00005730 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005732
Tim Peterscba30e22003-02-01 06:24:36 +00005733 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005734 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005735
Tim Peterscba30e22003-02-01 06:24:36 +00005736 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005737 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005739 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005741 finally:
5742 Py_XDECREF(file);
5743 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005745 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005746}
5747
5748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005749PyDoc_STRVAR(Unpicklertype__doc__,
5750"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005751
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005752static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005753 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005754 "cPickle.Unpickler", /*tp_name*/
5755 sizeof(Unpicklerobject), /*tp_basicsize*/
5756 0,
5757 (destructor)Unpickler_dealloc, /* tp_dealloc */
5758 0, /* tp_print */
5759 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5760 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5761 0, /* tp_compare */
5762 0, /* tp_repr */
5763 0, /* tp_as_number */
5764 0, /* tp_as_sequence */
5765 0, /* tp_as_mapping */
5766 0, /* tp_hash */
5767 0, /* tp_call */
5768 0, /* tp_str */
5769 0, /* tp_getattro */
5770 0, /* tp_setattro */
5771 0, /* tp_as_buffer */
5772 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5773 Unpicklertype__doc__, /* tp_doc */
5774 (traverseproc)Unpickler_traverse, /* tp_traverse */
5775 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005776};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005777
Guido van Rossum60456fd1997-04-09 17:36:32 +00005778static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005779 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5780 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005781 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005782 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005783 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005784 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005785
Martin v. Löwis544f1192004-07-27 05:22:33 +00005786 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5787 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005788 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005789 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005790 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005791 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005792
Georg Brandl96a8c392006-05-29 21:04:52 +00005793 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005794 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005795
Neal Norwitzb0493252002-03-31 14:44:22 +00005796 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005797 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005798
Martin v. Löwis544f1192004-07-27 05:22:33 +00005799 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5800 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005801 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005802 "This takes a file-like object for writing a pickle data stream.\n"
5803 "The optional proto argument tells the pickler to use the given\n"
5804 "protocol; supported protocols are 0, 1, 2. The default\n"
5805 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5806 "only protocol that can be written to a file opened in text\n"
5807 "mode and read back successfully. When using a protocol higher\n"
5808 "than 0, make sure the file is opened in binary mode, both when\n"
5809 "pickling and unpickling.)\n"
5810 "\n"
5811 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5812 "more efficient than protocol 1.\n"
5813 "\n"
5814 "Specifying a negative protocol version selects the highest\n"
5815 "protocol version supported. The higher the protocol used, the\n"
5816 "more recent the version of Python needed to read the pickle\n"
5817 "produced.\n"
5818 "\n"
5819 "The file parameter must have a write() method that accepts a single\n"
5820 "string argument. It can thus be an open file object, a StringIO\n"
5821 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005822 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005823
Georg Brandl96a8c392006-05-29 21:04:52 +00005824 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005825 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5826
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005827 { NULL, NULL }
5828};
5829
Guido van Rossum60456fd1997-04-09 17:36:32 +00005830static int
Tim Peterscba30e22003-02-01 06:24:36 +00005831init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005832{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005833 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005834
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005835#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005836
Tim Peters3cfe7542003-05-21 21:29:48 +00005837 if (PyType_Ready(&Unpicklertype) < 0)
5838 return -1;
5839 if (PyType_Ready(&Picklertype) < 0)
5840 return -1;
5841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005842 INIT_STR(__class__);
5843 INIT_STR(__getinitargs__);
5844 INIT_STR(__dict__);
5845 INIT_STR(__getstate__);
5846 INIT_STR(__setstate__);
5847 INIT_STR(__name__);
5848 INIT_STR(__main__);
5849 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005850 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005851 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005852 INIT_STR(append);
5853 INIT_STR(read);
5854 INIT_STR(readline);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005855 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005856
Georg Brandldffbf5f2008-05-20 07:49:57 +00005857 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005858 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005859
Tim Peters1f1b2d22003-02-01 02:16:37 +00005860 /* This is special because we want to use a different
5861 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005862 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005863 if (!dispatch_table) return -1;
5864
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005865 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005866 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005867 if (!extension_registry) return -1;
5868
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005869 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005870 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005871 if (!inverted_registry) return -1;
5872
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005873 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005874 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005875 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005876
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005877 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005878
Tim Peters731098b2003-02-04 20:56:09 +00005879 if (!(empty_tuple = PyTuple_New(0)))
5880 return -1;
5881
5882 two_tuple = PyTuple_New(2);
5883 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005884 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005885 /* We use this temp container with no regard to refcounts, or to
5886 * keeping containees alive. Exempt from GC, because we don't
5887 * want anything looking at two_tuple() by magic.
5888 */
5889 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005891 /* Ugh */
5892 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5893 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5894 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005896 if (!( t=PyDict_New())) return -1;
5897 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005898 "def __str__(self):\n"
5899 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5900 Py_file_input,
5901 module_dict, t) )) return -1;
5902 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005904 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005905 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005906 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005908 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005909
Tim Peterscba30e22003-02-01 06:24:36 +00005910 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005911 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005912 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005913 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005915 if (!( t=PyDict_New())) return -1;
5916 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005917 "def __str__(self):\n"
5918 " a=self.args\n"
5919 " a=a and type(a[0]) or '(what)'\n"
5920 " return 'Cannot pickle %s objects' % a\n"
5921 , Py_file_input,
5922 module_dict, t) )) return -1;
5923 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005925 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005926 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005927 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005929 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005931 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005932 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005933 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005934
Martin v. Löwis658009a2002-09-16 17:26:24 +00005935 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5936 UnpicklingError, NULL)))
5937 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005939 if (PyDict_SetItemString(module_dict, "PickleError",
5940 PickleError) < 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, "PicklingError",
5944 PicklingError) < 0)
5945 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005947 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5948 UnpicklingError) < 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, "UnpickleableError",
5952 UnpickleableError) < 0)
5953 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005955 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5956 BadPickleGet) < 0)
5957 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005959 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005961 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005962}
5963
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005964#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5965#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005966#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005967PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005968initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005969{
5970 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005971 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005972 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005973 PyObject *format_version;
5974 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005975
Christian Heimese93237d2007-12-19 02:37:44 +00005976 Py_TYPE(&Picklertype) = &PyType_Type;
5977 Py_TYPE(&Unpicklertype) = &PyType_Type;
5978 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005980 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005981 * so we're forced to use a temporary dictionary. :(
5982 */
5983 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005984 if (!di) return;
5985 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005987 /* Create the module and add the functions */
5988 m = Py_InitModule4("cPickle", cPickle_methods,
5989 cPickle_module_documentation,
5990 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005991 if (m == NULL)
5992 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005994 /* Add some symbolic constants to the module */
5995 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005996 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005997 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005998 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00006000 /* Copy data from di. Waaa. */
6001 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
6002 if (PyObject_SetItem(d, k, v) < 0) {
6003 Py_DECREF(di);
6004 return;
6005 }
6006 }
6007 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00006008
Tim Peters8587b3c2003-02-13 15:44:41 +00006009 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
6010 if (i < 0)
6011 return;
6012
Tim Peters5b7da392003-02-04 00:21:07 +00006013 /* These are purely informational; no code uses them. */
6014 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00006015 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00006016 /* Format versions we can read. */
6017 compatible_formats = Py_BuildValue("[sssss]",
6018 "1.0", /* Original protocol 0 */
6019 "1.1", /* Protocol 0 + INST */
6020 "1.2", /* Original protocol 1 */
6021 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00006022 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00006023 PyDict_SetItemString(d, "format_version", format_version);
6024 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
6025 Py_XDECREF(format_version);
6026 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00006027}