blob: 7f836c31269b3d04ecf8a8e435db2ec070d9cffd [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/*
Georg Brandl734373c2009-01-03 21:55:17 +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 Vassalotti9510e4a2008-05-11 08:25:28 +0000135 *copyreg_str, *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;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000667}
668
669
Martin v. Löwis18e16552006-02-15 17:27:45 +0000670static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000671readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672{
673 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
677 return -1;
678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000680 if ((str_size = PyString_Size(str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 Py_XDECREF(self->last_string);
684 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000686 if (! (*s = PyString_AsString(str)))
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 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000690}
691
Tim Petersee1a53c2003-02-02 02:57:53 +0000692/* Copy the first n bytes from s into newly malloc'ed memory, plus a
693 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
694 * The caller is responsible for free()'ing the return value.
695 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000696static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000697pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698{
Tim Petersee1a53c2003-02-02 02:57:53 +0000699 char *r = (char *)malloc(n+1);
700 if (r == NULL)
701 return (char*)PyErr_NoMemory();
702 memcpy(r, s, n);
703 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000705}
706
707
708static int
Tim Peterscba30e22003-02-01 06:24:36 +0000709get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710{
711 PyObject *value, *mv;
712 long c_value;
713 char s[30];
714 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!( mv = PyDict_GetItem(self->memo, id))) {
717 PyErr_SetObject(PyExc_KeyError, id);
718 return -1;
719 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Tim Peterscba30e22003-02-01 06:24:36 +0000721 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724 if (!( PyInt_Check(value))) {
725 PyErr_SetString(PicklingError, "no int where int expected in memo");
726 return -1;
727 }
728 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 if (!self->bin) {
731 s[0] = GET;
732 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
733 len = strlen(s);
734 }
735 else if (Pdata_Check(self->file)) {
736 if (write_other(self, NULL, 0) < 0) return -1;
737 PDATA_APPEND(self->file, mv, -1);
738 return 0;
739 }
740 else {
741 if (c_value < 256) {
742 s[0] = BINGET;
743 s[1] = (int)(c_value & 0xff);
744 len = 2;
745 }
746 else {
747 s[0] = LONG_BINGET;
748 s[1] = (int)(c_value & 0xff);
749 s[2] = (int)((c_value >> 8) & 0xff);
750 s[3] = (int)((c_value >> 16) & 0xff);
751 s[4] = (int)((c_value >> 24) & 0xff);
752 len = 5;
753 }
754 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755
Tim Peters0bc93f52003-02-02 18:29:33 +0000756 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000758
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000759 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000761
Guido van Rossum60456fd1997-04-09 17:36:32 +0000762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763static int
Tim Peterscba30e22003-02-01 06:24:36 +0000764put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765{
Christian Heimese93237d2007-12-19 02:37:44 +0000766 if (Py_REFCNT(ob) < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769 return put2(self, ob);
770}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000771
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773static int
Tim Peterscba30e22003-02-01 06:24:36 +0000774put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775{
776 char c_str[30];
777 int p;
778 size_t len;
779 int res = -1;
780 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000782 if (self->fast)
783 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 if ((p = PyDict_Size(self->memo)) < 0)
786 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000789 /* XXX Why?
790 * XXX And does "positive" really mean non-negative?
791 * XXX pickle.py starts with PUT index 0, not 1. This makes for
792 * XXX gratuitous differences between the pickling modules.
793 */
Tim Peterscba30e22003-02-01 06:24:36 +0000794 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000795
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000798
Tim Peterscba30e22003-02-01 06:24:36 +0000799 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000800 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000801
Tim Peterscba30e22003-02-01 06:24:36 +0000802 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 PyTuple_SET_ITEM(t, 0, memo_len);
806 Py_INCREF(memo_len);
807 PyTuple_SET_ITEM(t, 1, ob);
808 Py_INCREF(ob);
809
810 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
811 goto finally;
812
813 if (!self->bin) {
814 c_str[0] = PUT;
815 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
816 len = strlen(c_str);
817 }
818 else if (Pdata_Check(self->file)) {
819 if (write_other(self, NULL, 0) < 0) return -1;
820 PDATA_APPEND(self->file, memo_len, -1);
821 res=0; /* Job well done ;) */
822 goto finally;
823 }
824 else {
825 if (p >= 256) {
826 c_str[0] = LONG_BINPUT;
827 c_str[1] = (int)(p & 0xff);
828 c_str[2] = (int)((p >> 8) & 0xff);
829 c_str[3] = (int)((p >> 16) & 0xff);
830 c_str[4] = (int)((p >> 24) & 0xff);
831 len = 5;
832 }
833 else {
834 c_str[0] = BINPUT;
835 c_str[1] = p;
836 len = 2;
837 }
838 }
839
Tim Peters0bc93f52003-02-02 18:29:33 +0000840 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 goto finally;
842
843 res = 0;
844
845 finally:
846 Py_XDECREF(py_ob_id);
847 Py_XDECREF(memo_len);
848 Py_XDECREF(t);
849
850 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000851}
852
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000853static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000854whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 PyObject *module = 0, *modules_dict = 0,
858 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000861 if (module)
862 return module;
863 if (PyErr_ExceptionMatches(PyExc_AttributeError))
864 PyErr_Clear();
865 else
866 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000867
Tim Peterscba30e22003-02-01 06:24:36 +0000868 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 i = 0;
872 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 global_name_attr = PyObject_GetAttr(module, global_name);
877 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000878 if (PyErr_ExceptionMatches(PyExc_AttributeError))
879 PyErr_Clear();
880 else
881 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 continue;
883 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 if (global_name_attr != global) {
886 Py_DECREF(global_name_attr);
887 continue;
888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 break;
893 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 /* The following implements the rule in pickle.py added in 1.5
896 that used __main__ if no module is found. I don't actually
897 like this rule. jlf
898 */
899 if (!j) {
900 j=1;
901 name=__main___str;
902 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000904 Py_INCREF(name);
905 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000906}
907
908
Guido van Rossum60456fd1997-04-09 17:36:32 +0000909static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000910fast_save_enter(Picklerobject *self, PyObject *obj)
911{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000912 /* if fast_container < 0, we're doing an error exit. */
913 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
914 PyObject *key = NULL;
915 if (self->fast_memo == NULL) {
916 self->fast_memo = PyDict_New();
917 if (self->fast_memo == NULL) {
918 self->fast_container = -1;
919 return 0;
920 }
921 }
922 key = PyLong_FromVoidPtr(obj);
923 if (key == NULL)
924 return 0;
925 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000926 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000928 "fast mode: can't pickle cyclic objects "
929 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000930 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000931 self->fast_container = -1;
932 return 0;
933 }
934 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000935 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 self->fast_container = -1;
937 return 0;
938 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000939 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000940 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000942}
943
Tim Peterscba30e22003-02-01 06:24:36 +0000944int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945fast_save_leave(Picklerobject *self, PyObject *obj)
946{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000947 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
948 PyObject *key = PyLong_FromVoidPtr(obj);
949 if (key == NULL)
950 return 0;
951 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000952 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return 0;
954 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000955 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000956 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000958}
959
960static int
Tim Peterscba30e22003-02-01 06:24:36 +0000961save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962{
963 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000964 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000965 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000968}
969
Guido van Rossum77f6a652002-04-03 22:41:51 +0000970static int
Tim Peterscba30e22003-02-01 06:24:36 +0000971save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000973 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000974 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 long l = PyInt_AS_LONG((PyIntObject *)args);
976
Tim Peters3c67d792003-02-02 17:59:11 +0000977 if (self->proto >= 2) {
978 char opcode = l ? NEWTRUE : NEWFALSE;
979 if (self->write_func(self, &opcode, 1) < 0)
980 return -1;
981 }
982 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000983 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000984 return 0;
985}
Tim Peters84e87f32001-03-17 04:50:51 +0000986
Guido van Rossum60456fd1997-04-09 17:36:32 +0000987static int
Tim Peterscba30e22003-02-01 06:24:36 +0000988save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989{
990 char c_str[32];
991 long l = PyInt_AS_LONG((PyIntObject *)args);
992 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000994 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000995#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 || l > 0x7fffffffL
997 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000998#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999 ) {
1000 /* Text-mode pickle, or long too big to fit in the 4-byte
1001 * signed BININT format: store as a string.
1002 */
1003 c_str[0] = INT;
1004 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001005 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 return -1;
1007 }
1008 else {
1009 /* Binary pickle and l fits in a signed 4-byte int. */
1010 c_str[1] = (int)( l & 0xff);
1011 c_str[2] = (int)((l >> 8) & 0xff);
1012 c_str[3] = (int)((l >> 16) & 0xff);
1013 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1016 if (c_str[2] == 0) {
1017 c_str[0] = BININT1;
1018 len = 2;
1019 }
1020 else {
1021 c_str[0] = BININT2;
1022 len = 3;
1023 }
1024 }
1025 else {
1026 c_str[0] = BININT;
1027 len = 5;
1028 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Tim Peters0bc93f52003-02-02 18:29:33 +00001030 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 return -1;
1032 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035}
1036
1037
1038static int
Tim Peterscba30e22003-02-01 06:24:36 +00001039save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001041 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001042 int res = -1;
1043 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046
Tim Petersee1a53c2003-02-02 02:57:53 +00001047 if (self->proto >= 2) {
1048 /* Linear-time pickling. */
1049 size_t nbits;
1050 size_t nbytes;
1051 unsigned char *pdata;
1052 char c_str[5];
1053 int i;
1054 int sign = _PyLong_Sign(args);
1055
1056 if (sign == 0) {
1057 /* It's 0 -- an empty bytestring. */
1058 c_str[0] = LONG1;
1059 c_str[1] = 0;
1060 i = self->write_func(self, c_str, 2);
1061 if (i < 0) goto finally;
1062 res = 0;
1063 goto finally;
1064 }
1065 nbits = _PyLong_NumBits(args);
1066 if (nbits == (size_t)-1 && PyErr_Occurred())
1067 goto finally;
1068 /* How many bytes do we need? There are nbits >> 3 full
1069 * bytes of data, and nbits & 7 leftover bits. If there
1070 * are any leftover bits, then we clearly need another
1071 * byte. Wnat's not so obvious is that we *probably*
1072 * need another byte even if there aren't any leftovers:
1073 * the most-significant bit of the most-significant byte
1074 * acts like a sign bit, and it's usually got a sense
1075 * opposite of the one we need. The exception is longs
1076 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1077 * its own 256's-complement, so has the right sign bit
1078 * even without the extra byte. That's a pain to check
1079 * for in advance, though, so we always grab an extra
1080 * byte at the start, and cut it back later if possible.
1081 */
1082 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001083 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001084 PyErr_SetString(PyExc_OverflowError, "long too large "
1085 "to pickle");
1086 goto finally;
1087 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001088 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001089 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001090 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001091 i = _PyLong_AsByteArray((PyLongObject *)args,
1092 pdata, nbytes,
1093 1 /* little endian */, 1 /* signed */);
1094 if (i < 0) goto finally;
1095 /* If the long is negative, this may be a byte more than
1096 * needed. This is so iff the MSB is all redundant sign
1097 * bits.
1098 */
1099 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1100 (pdata[nbytes - 2] & 0x80) != 0)
1101 --nbytes;
1102
1103 if (nbytes < 256) {
1104 c_str[0] = LONG1;
1105 c_str[1] = (char)nbytes;
1106 size = 2;
1107 }
1108 else {
1109 c_str[0] = LONG4;
1110 size = (int)nbytes;
1111 for (i = 1; i < 5; i++) {
1112 c_str[i] = (char)(size & 0xff);
1113 size >>= 8;
1114 }
1115 size = 5;
1116 }
1117 i = self->write_func(self, c_str, size);
1118 if (i < 0) goto finally;
1119 i = self->write_func(self, (char *)pdata, (int)nbytes);
1120 if (i < 0) goto finally;
1121 res = 0;
1122 goto finally;
1123 }
1124
1125 /* proto < 2: write the repr and newline. This is quadratic-time
1126 * (in the number of digits), in both directions.
1127 */
Tim Peterscba30e22003-02-01 06:24:36 +00001128 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001131 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Tim Peters0bc93f52003-02-02 18:29:33 +00001137 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001138 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Tim Peters0bc93f52003-02-02 18:29:33 +00001142 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 finally:
1148 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150}
1151
1152
1153static int
Tim Peterscba30e22003-02-01 06:24:36 +00001154save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155{
1156 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001160 str[0] = BINFLOAT;
1161 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001163 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 return -1;
1165 }
1166 else {
1167 char c_str[250];
1168 c_str[0] = FLOAT;
Georg Brandlde9b6242006-04-30 11:13:56 +00001169 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1170 /* Extend the formatted string with a newline character */
1171 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Tim Peters0bc93f52003-02-02 18:29:33 +00001173 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 return -1;
1175 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178}
1179
1180
1181static int
Tim Peterscba30e22003-02-01 06:24:36 +00001182save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001183{
1184 int size, len;
1185 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001187 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 if (!self->bin) {
1191 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Tim Peterscba30e22003-02-01 06:24:36 +00001195 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001196 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001198 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001200 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Tim Peters0bc93f52003-02-02 18:29:33 +00001202 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Tim Peters0bc93f52003-02-02 18:29:33 +00001205 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Tim Peters0bc93f52003-02-02 18:29:33 +00001208 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 Py_XDECREF(repr);
1212 }
1213 else {
1214 int i;
1215 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001217 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001218 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 if (size < 256) {
1221 c_str[0] = SHORT_BINSTRING;
1222 c_str[1] = size;
1223 len = 2;
1224 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001225 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 c_str[0] = BINSTRING;
1227 for (i = 1; i < 5; i++)
1228 c_str[i] = (int)(size >> ((i - 1) * 8));
1229 len = 5;
1230 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001231 else
1232 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Tim Peters0bc93f52003-02-02 18:29:33 +00001234 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001237 if (size > 128 && Pdata_Check(self->file)) {
1238 if (write_other(self, NULL, 0) < 0) return -1;
1239 PDATA_APPEND(self->file, args, -1);
1240 }
1241 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001242 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001243 PyString_AS_STRING(
1244 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001245 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001246 return -1;
1247 }
1248 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001250 if (doput)
1251 if (put(self, args) < 0)
1252 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001256 err:
1257 Py_XDECREF(repr);
1258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001259}
1260
1261
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001262#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001263/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1264 backslash and newline characters to \uXXXX escapes. */
1265static PyObject *
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001266modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267{
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001268 PyObject *repr;
1269 char *p;
1270 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001271
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001272 static const char *hexdigit = "0123456789abcdef";
1273#ifdef Py_UNICODE_WIDE
1274 const Py_ssize_t expandsize = 10;
1275#else
1276 const Py_ssize_t expandsize = 6;
1277#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001278
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001279 if (size > PY_SSIZE_T_MAX / expandsize)
1280 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001282 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1283 if (repr == NULL)
1284 return NULL;
1285 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001286 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001287
Alexandre Vassalotti966322f2008-12-27 07:16:40 +00001288 p = q = PyString_AS_STRING(repr);
1289 while (size-- > 0) {
1290 Py_UNICODE ch = *s++;
1291#ifdef Py_UNICODE_WIDE
1292 /* Map 32-bit characters to '\Uxxxxxxxx' */
1293 if (ch >= 0x10000) {
1294 *p++ = '\\';
1295 *p++ = 'U';
1296 *p++ = hexdigit[(ch >> 28) & 0xf];
1297 *p++ = hexdigit[(ch >> 24) & 0xf];
1298 *p++ = hexdigit[(ch >> 20) & 0xf];
1299 *p++ = hexdigit[(ch >> 16) & 0xf];
1300 *p++ = hexdigit[(ch >> 12) & 0xf];
1301 *p++ = hexdigit[(ch >> 8) & 0xf];
1302 *p++ = hexdigit[(ch >> 4) & 0xf];
1303 *p++ = hexdigit[ch & 15];
1304 }
1305 else
1306#else
1307 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1308 if (ch >= 0xD800 && ch < 0xDC00) {
1309 Py_UNICODE ch2;
1310 Py_UCS4 ucs;
1311
1312 ch2 = *s++;
1313 size--;
1314 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1315 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1316 *p++ = '\\';
1317 *p++ = 'U';
1318 *p++ = hexdigit[(ucs >> 28) & 0xf];
1319 *p++ = hexdigit[(ucs >> 24) & 0xf];
1320 *p++ = hexdigit[(ucs >> 20) & 0xf];
1321 *p++ = hexdigit[(ucs >> 16) & 0xf];
1322 *p++ = hexdigit[(ucs >> 12) & 0xf];
1323 *p++ = hexdigit[(ucs >> 8) & 0xf];
1324 *p++ = hexdigit[(ucs >> 4) & 0xf];
1325 *p++ = hexdigit[ucs & 0xf];
1326 continue;
1327 }
1328 /* Fall through: isolated surrogates are copied as-is */
1329 s--;
1330 size++;
1331 }
1332#endif
1333 /* Map 16-bit characters to '\uxxxx' */
1334 if (ch >= 256 || ch == '\\' || ch == '\n') {
1335 *p++ = '\\';
1336 *p++ = 'u';
1337 *p++ = hexdigit[(ch >> 12) & 0xf];
1338 *p++ = hexdigit[(ch >> 8) & 0xf];
1339 *p++ = hexdigit[(ch >> 4) & 0xf];
1340 *p++ = hexdigit[ch & 15];
1341 }
1342 /* Copy everything else as-is */
1343 else
1344 *p++ = (char) ch;
1345 }
1346 *p = '\0';
1347 _PyString_Resize(&repr, p - q);
1348 return repr;
1349}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001350
Guido van Rossum60456fd1997-04-09 17:36:32 +00001351static int
Tim Peterscba30e22003-02-01 06:24:36 +00001352save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001353{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001354 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 if (!PyUnicode_Check(args))
1358 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 if (!self->bin) {
1361 char *repr_str;
1362 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 repr = modified_EncodeRawUnicodeEscape(
1365 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001366 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001368
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001369 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001371 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372
Tim Peters0bc93f52003-02-02 18:29:33 +00001373 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375
Tim Peters0bc93f52003-02-02 18:29:33 +00001376 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001378
Tim Peters0bc93f52003-02-02 18:29:33 +00001379 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001382 Py_XDECREF(repr);
1383 }
1384 else {
1385 int i;
1386 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001387
Tim Peterscba30e22003-02-01 06:24:36 +00001388 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001390
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001391 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001393 if (size > INT_MAX)
1394 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 c_str[0] = BINUNICODE;
1397 for (i = 1; i < 5; i++)
1398 c_str[i] = (int)(size >> ((i - 1) * 8));
1399 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001400
Tim Peters0bc93f52003-02-02 18:29:33 +00001401 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 if (size > 128 && Pdata_Check(self->file)) {
1405 if (write_other(self, NULL, 0) < 0)
1406 goto err;
1407 PDATA_APPEND(self->file, repr, -1);
1408 }
1409 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001410 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001411 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 goto err;
1413 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001415 Py_DECREF(repr);
1416 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 if (doput)
1419 if (put(self, args) < 0)
1420 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 err:
1425 Py_XDECREF(repr);
1426 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001427}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001428#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001429
Tim Peters1d63c9f2003-02-02 20:29:39 +00001430/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1431static int
Tim Peters67920142003-02-05 03:46:17 +00001432store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001433{
1434 int i;
1435 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001436
Tim Peters1d63c9f2003-02-02 20:29:39 +00001437 assert(PyTuple_Size(t) == len);
1438
1439 for (i = 0; i < len; i++) {
1440 PyObject *element = PyTuple_GET_ITEM(t, i);
1441
1442 if (element == NULL)
1443 goto finally;
1444 if (save(self, element, 0) < 0)
1445 goto finally;
1446 }
1447 res = 0;
1448
1449 finally:
1450 return res;
1451}
1452
1453/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1454 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001455 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001456 * (a tuple can be reached from itself), and that requires some subtle
1457 * magic so that it works in all cases. IOW, this is a long routine.
1458 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001459static int
Tim Peterscba30e22003-02-01 06:24:36 +00001460save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001462 PyObject *py_tuple_id = NULL;
1463 int len, i;
1464 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001467 static char pop = POP;
1468 static char pop_mark = POP_MARK;
1469 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001471 if ((len = PyTuple_Size(args)) < 0)
1472 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001473
Tim Peters1d63c9f2003-02-02 20:29:39 +00001474 if (len == 0) {
1475 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001476
Tim Peters1d63c9f2003-02-02 20:29:39 +00001477 if (self->proto) {
1478 c_str[0] = EMPTY_TUPLE;
1479 len = 1;
1480 }
1481 else {
1482 c_str[0] = MARK;
1483 c_str[1] = TUPLE;
1484 len = 2;
1485 }
1486 if (self->write_func(self, c_str, len) >= 0)
1487 res = 0;
1488 /* Don't memoize an empty tuple. */
1489 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001491
Tim Peters1d63c9f2003-02-02 20:29:39 +00001492 /* A non-empty tuple. */
1493
1494 /* id(tuple) isn't in the memo now. If it shows up there after
1495 * saving the tuple elements, the tuple must be recursive, in
1496 * which case we'll pop everything we put on the stack, and fetch
1497 * its value from the memo.
1498 */
1499 py_tuple_id = PyLong_FromVoidPtr(args);
1500 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001502
Tim Peters1d63c9f2003-02-02 20:29:39 +00001503 if (len <= 3 && self->proto >= 2) {
1504 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001505 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001506 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001508 /* pop the len elements */
1509 for (i = 0; i < len; ++i)
1510 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001511 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001512 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513 if (get(self, py_tuple_id) < 0)
1514 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001515 res = 0;
1516 goto finally;
1517 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001518 /* Not recursive. */
1519 if (self->write_func(self, len2opcode + len, 1) < 0)
1520 goto finally;
1521 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001523
Tim Peters1d63c9f2003-02-02 20:29:39 +00001524 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1525 * Generate MARK elt1 elt2 ... TUPLE
1526 */
1527 if (self->write_func(self, &MARKv, 1) < 0)
1528 goto finally;
1529
Tim Peters67920142003-02-05 03:46:17 +00001530 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001531 goto finally;
1532
1533 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1534 /* pop the stack stuff we pushed */
1535 if (self->bin) {
1536 if (self->write_func(self, &pop_mark, 1) < 0)
1537 goto finally;
1538 }
1539 else {
1540 /* Note that we pop one more than len, to remove
1541 * the MARK too.
1542 */
1543 for (i = 0; i <= len; i++)
1544 if (self->write_func(self, &pop, 1) < 0)
1545 goto finally;
1546 }
1547 /* fetch from memo */
1548 if (get(self, py_tuple_id) >= 0)
1549 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 goto finally;
1551 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001552
Tim Peters1d63c9f2003-02-02 20:29:39 +00001553 /* Not recursive. */
1554 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001555 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001556
Tim Peters1d63c9f2003-02-02 20:29:39 +00001557 memoize:
1558 if (put(self, args) >= 0)
1559 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 finally:
1562 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564}
1565
Tim Peters1092d642003-02-11 21:06:20 +00001566/* iter is an iterator giving items, and we batch up chunks of
1567 * MARK item item ... item APPENDS
1568 * opcode sequences. Calling code should have arranged to first create an
1569 * empty list, or list-like object, for the APPENDS to operate on.
1570 * Returns 0 on success, <0 on error.
1571 */
1572static int
1573batch_list(Picklerobject *self, PyObject *iter)
1574{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001575 PyObject *obj = NULL;
1576 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001577 int i, n;
1578
1579 static char append = APPEND;
1580 static char appends = APPENDS;
1581
1582 assert(iter != NULL);
1583
1584 if (self->proto == 0) {
1585 /* APPENDS isn't available; do one at a time. */
1586 for (;;) {
1587 obj = PyIter_Next(iter);
1588 if (obj == NULL) {
1589 if (PyErr_Occurred())
1590 return -1;
1591 break;
1592 }
1593 i = save(self, obj, 0);
1594 Py_DECREF(obj);
1595 if (i < 0)
1596 return -1;
1597 if (self->write_func(self, &append, 1) < 0)
1598 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001599 }
1600 return 0;
1601 }
1602
1603 /* proto > 0: write in batches of BATCHSIZE. */
1604 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001605 /* Get first item */
1606 firstitem = PyIter_Next(iter);
1607 if (firstitem == NULL) {
1608 if (PyErr_Occurred())
1609 goto BatchFailed;
1610
1611 /* nothing more to add */
1612 break;
1613 }
1614
1615 /* Try to get a second item */
1616 obj = PyIter_Next(iter);
1617 if (obj == NULL) {
1618 if (PyErr_Occurred())
1619 goto BatchFailed;
1620
1621 /* Only one item to write */
1622 if (save(self, firstitem, 0) < 0)
1623 goto BatchFailed;
1624 if (self->write_func(self, &append, 1) < 0)
1625 goto BatchFailed;
1626 Py_CLEAR(firstitem);
1627 break;
1628 }
1629
1630 /* More than one item to write */
1631
1632 /* Pump out MARK, items, APPENDS. */
1633 if (self->write_func(self, &MARKv, 1) < 0)
1634 goto BatchFailed;
1635
1636 if (save(self, firstitem, 0) < 0)
1637 goto BatchFailed;
1638 Py_CLEAR(firstitem);
1639 n = 1;
1640
1641 /* Fetch and save up to BATCHSIZE items */
1642 while (obj) {
1643 if (save(self, obj, 0) < 0)
1644 goto BatchFailed;
1645 Py_CLEAR(obj);
1646 n += 1;
1647
1648 if (n == BATCHSIZE)
1649 break;
1650
Tim Peters1092d642003-02-11 21:06:20 +00001651 obj = PyIter_Next(iter);
1652 if (obj == NULL) {
1653 if (PyErr_Occurred())
1654 goto BatchFailed;
1655 break;
1656 }
Tim Peters1092d642003-02-11 21:06:20 +00001657 }
1658
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001659 if (self->write_func(self, &appends, 1) < 0)
1660 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001661
Tim Peters90975f12003-02-12 05:28:58 +00001662 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001663 return 0;
1664
1665BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001666 Py_XDECREF(firstitem);
1667 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001668 return -1;
1669}
1670
Guido van Rossum60456fd1997-04-09 17:36:32 +00001671static int
Tim Peterscba30e22003-02-01 06:24:36 +00001672save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001673{
Tim Peters1092d642003-02-11 21:06:20 +00001674 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001675 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001676 int len;
1677 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 if (self->fast && !fast_save_enter(self, args))
1680 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001681
Tim Peters1092d642003-02-11 21:06:20 +00001682 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 if (self->bin) {
1684 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001685 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001686 }
1687 else {
1688 s[0] = MARK;
1689 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001690 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001692
Tim Peters1092d642003-02-11 21:06:20 +00001693 if (self->write_func(self, s, len) < 0)
1694 goto finally;
1695
1696 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001697 if ((len = PyList_Size(args)) < 0)
1698 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001699
Tim Peters1092d642003-02-11 21:06:20 +00001700 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001702 if (put(self, args) >= 0)
1703 res = 0;
1704 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001705 }
Tim Peters90975f12003-02-12 05:28:58 +00001706 if (put2(self, args) < 0)
1707 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001708
Tim Peters1092d642003-02-11 21:06:20 +00001709 /* Materialize the list elements. */
1710 iter = PyObject_GetIter(args);
1711 if (iter == NULL)
1712 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001713
1714 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1715 {
1716 res = batch_list(self, iter);
1717 Py_LeaveRecursiveCall();
1718 }
Tim Peters1092d642003-02-11 21:06:20 +00001719 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 finally:
1722 if (self->fast && !fast_save_leave(self, args))
1723 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001725 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726}
1727
1728
Tim Peters42f08ac2003-02-11 22:43:24 +00001729/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1730 * MARK key value ... key value SETITEMS
1731 * opcode sequences. Calling code should have arranged to first create an
1732 * empty dict, or dict-like object, for the SETITEMS to operate on.
1733 * Returns 0 on success, <0 on error.
1734 *
1735 * This is very much like batch_list(). The difference between saving
1736 * elements directly, and picking apart two-tuples, is so long-winded at
1737 * the C level, though, that attempts to combine these routines were too
1738 * ugly to bear.
1739 */
1740static int
1741batch_dict(Picklerobject *self, PyObject *iter)
1742{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001743 PyObject *p = NULL;
1744 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001745 int i, n;
1746
1747 static char setitem = SETITEM;
1748 static char setitems = SETITEMS;
1749
1750 assert(iter != NULL);
1751
1752 if (self->proto == 0) {
1753 /* SETITEMS isn't available; do one at a time. */
1754 for (;;) {
1755 p = PyIter_Next(iter);
1756 if (p == NULL) {
1757 if (PyErr_Occurred())
1758 return -1;
1759 break;
1760 }
1761 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1762 PyErr_SetString(PyExc_TypeError, "dict items "
1763 "iterator must return 2-tuples");
1764 return -1;
1765 }
1766 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1767 if (i >= 0)
1768 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1769 Py_DECREF(p);
1770 if (i < 0)
1771 return -1;
1772 if (self->write_func(self, &setitem, 1) < 0)
1773 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001774 }
1775 return 0;
1776 }
1777
1778 /* proto > 0: write in batches of BATCHSIZE. */
1779 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001780 /* Get first item */
1781 firstitem = PyIter_Next(iter);
1782 if (firstitem == NULL) {
1783 if (PyErr_Occurred())
1784 goto BatchFailed;
1785
1786 /* nothing more to add */
1787 break;
1788 }
1789 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1790 PyErr_SetString(PyExc_TypeError, "dict items "
1791 "iterator must return 2-tuples");
1792 goto BatchFailed;
1793 }
1794
1795 /* Try to get a second item */
1796 p = PyIter_Next(iter);
1797 if (p == NULL) {
1798 if (PyErr_Occurred())
1799 goto BatchFailed;
1800
1801 /* Only one item to write */
1802 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1803 goto BatchFailed;
1804 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1805 goto BatchFailed;
1806 if (self->write_func(self, &setitem, 1) < 0)
1807 goto BatchFailed;
1808 Py_CLEAR(firstitem);
1809 break;
1810 }
1811
1812 /* More than one item to write */
1813
1814 /* Pump out MARK, items, SETITEMS. */
1815 if (self->write_func(self, &MARKv, 1) < 0)
1816 goto BatchFailed;
1817
1818 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1819 goto BatchFailed;
1820 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1821 goto BatchFailed;
1822 Py_CLEAR(firstitem);
1823 n = 1;
1824
1825 /* Fetch and save up to BATCHSIZE items */
1826 while (p) {
1827 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1828 PyErr_SetString(PyExc_TypeError, "dict items "
1829 "iterator must return 2-tuples");
1830 goto BatchFailed;
1831 }
1832 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1833 goto BatchFailed;
1834 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1835 goto BatchFailed;
1836 Py_CLEAR(p);
1837 n += 1;
1838
1839 if (n == BATCHSIZE)
1840 break;
1841
Tim Peters42f08ac2003-02-11 22:43:24 +00001842 p = PyIter_Next(iter);
1843 if (p == NULL) {
1844 if (PyErr_Occurred())
1845 goto BatchFailed;
1846 break;
1847 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001848 }
1849
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001850 if (self->write_func(self, &setitems, 1) < 0)
1851 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001852
Tim Peters90975f12003-02-12 05:28:58 +00001853 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001854 return 0;
1855
1856BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001857 Py_XDECREF(firstitem);
1858 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001859 return -1;
1860}
1861
Guido van Rossum60456fd1997-04-09 17:36:32 +00001862static int
Tim Peterscba30e22003-02-01 06:24:36 +00001863save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864{
Tim Peters42f08ac2003-02-11 22:43:24 +00001865 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001867 int len;
1868 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (self->fast && !fast_save_enter(self, args))
1871 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001872
Tim Peters42f08ac2003-02-11 22:43:24 +00001873 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 if (self->bin) {
1875 s[0] = EMPTY_DICT;
1876 len = 1;
1877 }
1878 else {
1879 s[0] = MARK;
1880 s[1] = DICT;
1881 len = 2;
1882 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001883
Tim Peters0bc93f52003-02-02 18:29:33 +00001884 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001885 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001886
Tim Peters42f08ac2003-02-11 22:43:24 +00001887 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 if ((len = PyDict_Size(args)) < 0)
1889 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001891 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001892 if (put(self, args) >= 0)
1893 res = 0;
1894 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 }
Tim Peters90975f12003-02-12 05:28:58 +00001896 if (put2(self, args) < 0)
1897 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Tim Peters42f08ac2003-02-11 22:43:24 +00001899 /* Materialize the dict items. */
1900 iter = PyObject_CallMethod(args, "iteritems", "()");
1901 if (iter == NULL)
1902 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001903 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1904 {
1905 res = batch_dict(self, iter);
1906 Py_LeaveRecursiveCall();
1907 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001908 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001910 finally:
1911 if (self->fast && !fast_save_leave(self, args))
1912 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001914 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001915}
1916
1917
Tim Peters84e87f32001-03-17 04:50:51 +00001918static int
Tim Peterscba30e22003-02-01 06:24:36 +00001919save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920{
1921 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1922 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1923 char *module_str, *name_str;
1924 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 if (self->fast && !fast_save_enter(self, args))
1929 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001930
Tim Peters0bc93f52003-02-02 18:29:33 +00001931 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001933
Tim Peterscba30e22003-02-01 06:24:36 +00001934 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 if (self->bin) {
1938 if (save(self, class, 0) < 0)
1939 goto finally;
1940 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1943 PyObject *element = 0;
1944 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001947 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if ((len = PyObject_Size(class_args)) < 0)
1951 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001954 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 if (save(self, element, 0) < 0) {
1958 Py_DECREF(element);
1959 goto finally;
1960 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 Py_DECREF(element);
1963 }
1964 }
1965 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001966 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1967 PyErr_Clear();
1968 else
1969 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 if (!self->bin) {
1973 if (!( name = ((PyClassObject *)class)->cl_name )) {
1974 PyErr_SetString(PicklingError, "class has no name");
1975 goto finally;
1976 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Tim Peterscba30e22003-02-01 06:24:36 +00001978 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001980
Tim Peters84e87f32001-03-17 04:50:51 +00001981
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001982 if ((module_size = PyString_Size(module)) < 0 ||
1983 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001985
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001986 module_str = PyString_AS_STRING((PyStringObject *)module);
1987 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001988
Tim Peters0bc93f52003-02-02 18:29:33 +00001989 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991
Tim Peters0bc93f52003-02-02 18:29:33 +00001992 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001994
Tim Peters0bc93f52003-02-02 18:29:33 +00001995 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001997
Tim Peters0bc93f52003-02-02 18:29:33 +00001998 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002000
Tim Peters0bc93f52003-02-02 18:29:33 +00002001 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 goto finally;
2003 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002004 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 goto finally;
2006 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002008 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2009 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002010 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 goto finally;
2012 }
2013 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002014 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2015 PyErr_Clear();
2016 else
2017 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002019 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002020 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2021 PyErr_Clear();
2022 else
2023 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 res = 0;
2025 goto finally;
2026 }
2027 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 if (!PyDict_Check(state)) {
2030 if (put2(self, args) < 0)
2031 goto finally;
2032 }
2033 else {
2034 if (put(self, args) < 0)
2035 goto finally;
2036 }
Tim Peters84e87f32001-03-17 04:50:51 +00002037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 if (save(self, state, 0) < 0)
2039 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002040
Tim Peters0bc93f52003-02-02 18:29:33 +00002041 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002045
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002046 finally:
2047 if (self->fast && !fast_save_leave(self, args))
2048 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 Py_XDECREF(module);
2051 Py_XDECREF(class);
2052 Py_XDECREF(state);
2053 Py_XDECREF(getinitargs_func);
2054 Py_XDECREF(getstate_func);
2055 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058}
2059
2060
Guido van Rossum60456fd1997-04-09 17:36:32 +00002061static int
Tim Peterscba30e22003-02-01 06:24:36 +00002062save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002064 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 char *name_str, *module_str;
2066 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002070 if (name) {
2071 global_name = name;
2072 Py_INCREF(global_name);
2073 }
2074 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002075 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 goto finally;
2077 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002078
Tim Peterscba30e22003-02-01 06:24:36 +00002079 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002081
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002082 if ((module_size = PyString_Size(module)) < 0 ||
2083 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002085
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002086 module_str = PyString_AS_STRING((PyStringObject *)module);
2087 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002088
Guido van Rossum75bfd052002-12-24 18:10:07 +00002089 /* XXX This can be doing a relative import. Clearly it shouldn't,
2090 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 mod = PyImport_ImportModule(module_str);
2092 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002094 "Can't pickle %s: import of module %s "
2095 "failed",
2096 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 goto finally;
2098 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002099 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 if (klass == NULL) {
2101 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002102 "Can't pickle %s: attribute lookup %s.%s "
2103 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104 "OSS", args, module, global_name);
2105 goto finally;
2106 }
2107 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002108 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002110 "Can't pickle %s: it's not the same object "
2111 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 "OSS", args, module, global_name);
2113 goto finally;
2114 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002115 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002116
Tim Peters731098b2003-02-04 20:56:09 +00002117 if (self->proto >= 2) {
2118 /* See whether this is in the extension registry, and if
2119 * so generate an EXT opcode.
2120 */
2121 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002122 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002123 char c_str[5];
2124 int n;
2125
2126 PyTuple_SET_ITEM(two_tuple, 0, module);
2127 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2128 py_code = PyDict_GetItem(extension_registry, two_tuple);
2129 if (py_code == NULL)
2130 goto gen_global; /* not registered */
2131
2132 /* Verify py_code has the right type and value. */
2133 if (!PyInt_Check(py_code)) {
2134 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002135 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002136 "OO", args, py_code);
2137 goto finally;
2138 }
2139 code = PyInt_AS_LONG(py_code);
2140 if (code <= 0 || code > 0x7fffffffL) {
2141 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2142 "extension code %ld is out of range",
2143 "Ol", args, code);
2144 goto finally;
2145 }
2146
2147 /* Generate an EXT opcode. */
2148 if (code <= 0xff) {
2149 c_str[0] = EXT1;
2150 c_str[1] = (char)code;
2151 n = 2;
2152 }
2153 else if (code <= 0xffff) {
2154 c_str[0] = EXT2;
2155 c_str[1] = (char)(code & 0xff);
2156 c_str[2] = (char)((code >> 8) & 0xff);
2157 n = 3;
2158 }
2159 else {
2160 c_str[0] = EXT4;
2161 c_str[1] = (char)(code & 0xff);
2162 c_str[2] = (char)((code >> 8) & 0xff);
2163 c_str[3] = (char)((code >> 16) & 0xff);
2164 c_str[4] = (char)((code >> 24) & 0xff);
2165 n = 5;
2166 }
2167
2168 if (self->write_func(self, c_str, n) >= 0)
2169 res = 0;
2170 goto finally; /* and don't memoize */
2171 }
2172
2173 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002174 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002175 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002176
Tim Peters0bc93f52003-02-02 18:29:33 +00002177 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002179
Tim Peters0bc93f52003-02-02 18:29:33 +00002180 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002181 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002182
Tim Peters0bc93f52003-02-02 18:29:33 +00002183 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002185
Tim Peters0bc93f52003-02-02 18:29:33 +00002186 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002187 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 if (put(self, args) < 0)
2190 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 finally:
2195 Py_XDECREF(module);
2196 Py_XDECREF(global_name);
2197 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002199 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002200}
2201
Guido van Rossum60456fd1997-04-09 17:36:32 +00002202static int
Tim Peterscba30e22003-02-01 06:24:36 +00002203save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204{
2205 PyObject *pid = 0;
2206 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002210 Py_INCREF(args);
2211 ARG_TUP(self, args);
2212 if (self->arg) {
2213 pid = PyObject_Call(f, self->arg, NULL);
2214 FREE_ARG_TUP(self);
2215 }
2216 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218 if (pid != Py_None) {
2219 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002220 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 PyErr_SetString(PicklingError,
2222 "persistent id must be string");
2223 goto finally;
2224 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002225
Tim Peters0bc93f52003-02-02 18:29:33 +00002226 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002227 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002228
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002229 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002231
Tim Peters0bc93f52003-02-02 18:29:33 +00002232 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002233 PyString_AS_STRING(
2234 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002235 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002237
Tim Peters0bc93f52003-02-02 18:29:33 +00002238 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 res = 1;
2242 goto finally;
2243 }
2244 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002245 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002246 res = -1;
2247 else
2248 res = 1;
2249 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 goto finally;
2252 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002256 finally:
2257 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002259 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002260}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261
Tim Peters71fcda52003-02-14 23:05:28 +00002262/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2263 * appropriate __reduce__ method for ob.
2264 */
Tim Peters84e87f32001-03-17 04:50:51 +00002265static int
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002266save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267{
Tim Peters71fcda52003-02-14 23:05:28 +00002268 PyObject *callable;
2269 PyObject *argtup;
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002270 PyObject *state = NULL;
2271 PyObject *listitems = Py_None;
2272 PyObject *dictitems = Py_None;
2273 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002274
Tim Peters71fcda52003-02-14 23:05:28 +00002275 int use_newobj = self->proto >= 2;
2276
2277 static char reduce = REDUCE;
2278 static char build = BUILD;
2279 static char newobj = NEWOBJ;
2280
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002281 size = PyTuple_Size(args);
2282 if (size < 2 || size > 5) {
2283 cPickle_ErrFormat(PicklingError, "tuple returned by "
2284 "%s must contain 2 through 5 elements",
2285 "O", fn);
2286 return -1;
2287 }
2288
Tim Peters71fcda52003-02-14 23:05:28 +00002289 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2290 &callable,
2291 &argtup,
2292 &state,
2293 &listitems,
2294 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002296
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002297 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002298 cPickle_ErrFormat(PicklingError, "Second element of "
2299 "tuple returned by %s must be a tuple",
2300 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002301 return -1;
2302 }
2303
Tim Peters71fcda52003-02-14 23:05:28 +00002304 if (state == Py_None)
2305 state = NULL;
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002306
Tim Peters71fcda52003-02-14 23:05:28 +00002307 if (listitems == Py_None)
2308 listitems = NULL;
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002309 else if (!PyIter_Check(listitems)) {
2310 cPickle_ErrFormat(PicklingError, "Fourth element of "
2311 "tuple returned by %s must be an iterator, not %s",
2312 "Os", fn, Py_TYPE(listitems)->tp_name);
2313 return -1;
2314 }
2315
Tim Peters71fcda52003-02-14 23:05:28 +00002316 if (dictitems == Py_None)
2317 dictitems = NULL;
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002318 else if (!PyIter_Check(dictitems)) {
2319 cPickle_ErrFormat(PicklingError, "Fifth element of "
2320 "tuple returned by %s must be an iterator, not %s",
2321 "Os", fn, Py_TYPE(dictitems)->tp_name);
2322 return -1;
2323 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002324
Tim Peters71fcda52003-02-14 23:05:28 +00002325 /* Protocol 2 special case: if callable's name is __newobj__, use
2326 * NEWOBJ. This consumes a lot of code.
2327 */
2328 if (use_newobj) {
2329 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002330
Tim Peters71fcda52003-02-14 23:05:28 +00002331 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002332 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2333 PyErr_Clear();
2334 else
2335 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002336 use_newobj = 0;
2337 }
2338 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002339 use_newobj = PyString_Check(temp) &&
2340 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002341 "__newobj__") == 0;
2342 Py_DECREF(temp);
2343 }
2344 }
2345 if (use_newobj) {
2346 PyObject *cls;
2347 PyObject *newargtup;
2348 int n, i;
2349
2350 /* Sanity checks. */
2351 n = PyTuple_Size(argtup);
2352 if (n < 1) {
2353 PyErr_SetString(PicklingError, "__newobj__ arglist "
2354 "is empty");
2355 return -1;
2356 }
2357
2358 cls = PyTuple_GET_ITEM(argtup, 0);
2359 if (! PyObject_HasAttrString(cls, "__new__")) {
2360 PyErr_SetString(PicklingError, "args[0] from "
2361 "__newobj__ args has no __new__");
2362 return -1;
2363 }
2364
2365 /* XXX How could ob be NULL? */
2366 if (ob != NULL) {
2367 PyObject *ob_dot_class;
2368
2369 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002370 if (ob_dot_class == NULL) {
2371 if (PyErr_ExceptionMatches(
2372 PyExc_AttributeError))
2373 PyErr_Clear();
2374 else
2375 return -1;
2376 }
Tim Peters71fcda52003-02-14 23:05:28 +00002377 i = ob_dot_class != cls; /* true iff a problem */
2378 Py_XDECREF(ob_dot_class);
2379 if (i) {
2380 PyErr_SetString(PicklingError, "args[0] from "
2381 "__newobj__ args has the wrong class");
2382 return -1;
2383 }
2384 }
2385
2386 /* Save the class and its __new__ arguments. */
2387 if (save(self, cls, 0) < 0)
2388 return -1;
2389
2390 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2391 if (newargtup == NULL)
2392 return -1;
2393 for (i = 1; i < n; ++i) {
2394 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2395 Py_INCREF(temp);
2396 PyTuple_SET_ITEM(newargtup, i-1, temp);
2397 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002398 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002399 Py_DECREF(newargtup);
2400 if (i < 0)
2401 return -1;
2402
2403 /* Add NEWOBJ opcode. */
2404 if (self->write_func(self, &newobj, 1) < 0)
2405 return -1;
2406 }
2407 else {
2408 /* Not using NEWOBJ. */
2409 if (save(self, callable, 0) < 0 ||
2410 save(self, argtup, 0) < 0 ||
2411 self->write_func(self, &reduce, 1) < 0)
2412 return -1;
2413 }
2414
2415 /* Memoize. */
2416 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 if (ob != NULL) {
2418 if (state && !PyDict_Check(state)) {
2419 if (put2(self, ob) < 0)
2420 return -1;
2421 }
Tim Peters71fcda52003-02-14 23:05:28 +00002422 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002423 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 }
Tim Peters84e87f32001-03-17 04:50:51 +00002425
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Tim Peters71fcda52003-02-14 23:05:28 +00002427 if (listitems && batch_list(self, listitems) < 0)
2428 return -1;
2429
2430 if (dictitems && batch_dict(self, dictitems) < 0)
2431 return -1;
2432
2433 if (state) {
2434 if (save(self, state, 0) < 0 ||
2435 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002436 return -1;
2437 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002439 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002440}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002441
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002443save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002444{
2445 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002446 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002447 int res = -1;
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002448 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002449
Facundo Batista763d3092008-06-30 01:10:55 +00002450 if (Py_EnterRecursiveCall(" while pickling an object"))
2451 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453 if (!pers_save && self->pers_func) {
2454 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2455 res = tmp;
2456 goto finally;
2457 }
2458 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 if (args == Py_None) {
2461 res = save_none(self, args);
2462 goto finally;
2463 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002464
Christian Heimese93237d2007-12-19 02:37:44 +00002465 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002467 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002468 case 'b':
2469 if (args == Py_False || args == Py_True) {
2470 res = save_bool(self, args);
2471 goto finally;
2472 }
2473 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002474 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 if (type == &PyInt_Type) {
2476 res = save_int(self, args);
2477 goto finally;
2478 }
2479 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002480
Guido van Rossum60456fd1997-04-09 17:36:32 +00002481 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 if (type == &PyLong_Type) {
2483 res = save_long(self, args);
2484 goto finally;
2485 }
2486 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002487
Guido van Rossum60456fd1997-04-09 17:36:32 +00002488 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489 if (type == &PyFloat_Type) {
2490 res = save_float(self, args);
2491 goto finally;
2492 }
2493 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002494
Guido van Rossum60456fd1997-04-09 17:36:32 +00002495 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002496 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2497 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002498 goto finally;
2499 }
2500 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002501
Guido van Rossum60456fd1997-04-09 17:36:32 +00002502 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002503 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 res = save_string(self, args, 0);
2505 goto finally;
2506 }
Facundo Batista14618862008-06-22 15:27:10 +00002507 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002508
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002509#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002510 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002511 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 res = save_unicode(self, args, 0);
2513 goto finally;
2514 }
Facundo Batista14618862008-06-22 15:27:10 +00002515 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002516#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002518
Christian Heimese93237d2007-12-19 02:37:44 +00002519 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002520 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002521 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 if (PyDict_GetItem(self->memo, py_ob_id)) {
2524 if (get(self, py_ob_id) < 0)
2525 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 res = 0;
2528 goto finally;
2529 }
2530 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002533 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002534 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 res = save_string(self, args, 1);
2536 goto finally;
2537 }
2538 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002539
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002540#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002541 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 if (type == &PyUnicode_Type) {
2543 res = save_unicode(self, args, 1);
2544 goto finally;
2545 }
2546 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002547#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002548
Guido van Rossum60456fd1997-04-09 17:36:32 +00002549 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 if (type == &PyTuple_Type) {
2551 res = save_tuple(self, args);
2552 goto finally;
2553 }
2554 if (type == &PyType_Type) {
2555 res = save_global(self, args, NULL);
2556 goto finally;
2557 }
2558 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002559
Guido van Rossum60456fd1997-04-09 17:36:32 +00002560 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 if (type == &PyList_Type) {
2562 res = save_list(self, args);
2563 goto finally;
2564 }
2565 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002566
2567 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568 if (type == &PyDict_Type) {
2569 res = save_dict(self, args);
2570 goto finally;
2571 }
2572 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002573
2574 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 if (type == &PyInstance_Type) {
2576 res = save_inst(self, args);
2577 goto finally;
2578 }
2579 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002580
2581 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 if (type == &PyClass_Type) {
2583 res = save_global(self, args, NULL);
2584 goto finally;
2585 }
2586 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002587
2588 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 if (type == &PyFunction_Type) {
2590 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002591 if (res && PyErr_ExceptionMatches(PickleError)) {
2592 /* fall back to reduce */
2593 PyErr_Clear();
2594 break;
2595 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 goto finally;
2597 }
2598 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002599
2600 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 if (type == &PyCFunction_Type) {
2602 res = save_global(self, args, NULL);
2603 goto finally;
2604 }
2605 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 if (!pers_save && self->inst_pers_func) {
2608 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2609 res = tmp;
2610 goto finally;
2611 }
2612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002613
Jeremy Hylton39c61162002-07-16 19:47:43 +00002614 if (PyType_IsSubtype(type, &PyType_Type)) {
2615 res = save_global(self, args, NULL);
2616 goto finally;
2617 }
2618
Guido van Rossumb289b872003-02-19 01:45:13 +00002619 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002620 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002621 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002622 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002623 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2624 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002625 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002626 Py_INCREF(args);
2627 ARG_TUP(self, args);
2628 if (self->arg) {
2629 t = PyObject_Call(__reduce__, self->arg, NULL);
2630 FREE_ARG_TUP(self);
2631 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 }
2633 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002634 /* Check for a __reduce_ex__ method. */
2635 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2636 if (__reduce__ != NULL) {
2637 t = PyInt_FromLong(self->proto);
2638 if (t != NULL) {
2639 ARG_TUP(self, t);
2640 t = NULL;
2641 if (self->arg) {
2642 t = PyObject_Call(__reduce__,
2643 self->arg, NULL);
2644 FREE_ARG_TUP(self);
2645 }
2646 }
2647 }
2648 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002649 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2650 PyErr_Clear();
2651 else
2652 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002653 /* Check for a __reduce__ method. */
2654 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2655 if (__reduce__ != NULL) {
2656 t = PyObject_Call(__reduce__,
2657 empty_tuple, NULL);
2658 }
2659 else {
2660 PyErr_SetObject(UnpickleableError, args);
2661 goto finally;
2662 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002664 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002665
Tim Peters71fcda52003-02-14 23:05:28 +00002666 if (t == NULL)
2667 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002668
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002669 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002670 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 goto finally;
2672 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002673
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002674 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002675 cPickle_ErrFormat(PicklingError, "Value returned by "
2676 "%s must be string or tuple",
2677 "O", __reduce__);
2678 goto finally;
2679 }
2680
Amaury Forgeot d'Arcc353ea72008-10-30 21:29:12 +00002681 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002684 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 Py_XDECREF(py_ob_id);
2686 Py_XDECREF(__reduce__);
2687 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002690}
2691
2692
2693static int
Tim Peterscba30e22003-02-01 06:24:36 +00002694dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695{
2696 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002697
Tim Peters4190fb82003-02-02 16:09:05 +00002698 if (self->proto >= 2) {
2699 char bytes[2];
2700
2701 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002702 assert(self->proto >= 0 && self->proto < 256);
2703 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002704 if (self->write_func(self, bytes, 2) < 0)
2705 return -1;
2706 }
2707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 if (save(self, args, 0) < 0)
2709 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002710
Tim Peters4190fb82003-02-02 16:09:05 +00002711 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002713
Tim Peters4190fb82003-02-02 16:09:05 +00002714 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002718}
2719
2720static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002721Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722{
Tim Peterscba30e22003-02-01 06:24:36 +00002723 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 PyDict_Clear(self->memo);
2725 Py_INCREF(Py_None);
2726 return Py_None;
2727}
2728
2729static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002730Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731{
2732 int l, i, rsize, ssize, clear=1, lm;
2733 long ik;
2734 PyObject *k, *r;
2735 char *s, *p, *have_get;
2736 Pdata *data;
2737
2738 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002739 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 return NULL;
2741
2742 /* Check to make sure we are based on a list */
2743 if (! Pdata_Check(self->file)) {
2744 PyErr_SetString(PicklingError,
2745 "Attempt to getvalue() a non-list-based pickler");
2746 return NULL;
2747 }
2748
2749 /* flush write buffer */
2750 if (write_other(self, NULL, 0) < 0) return NULL;
2751
2752 data=(Pdata*)self->file;
2753 l=data->length;
2754
2755 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002756 lm = PyDict_Size(self->memo);
2757 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002759 have_get = malloc(lm);
2760 if (have_get == NULL) return PyErr_NoMemory();
2761 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762
2763 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002764 for (rsize = 0, i = l; --i >= 0; ) {
2765 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002767 if (PyString_Check(k))
2768 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002769
2770 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002771 ik = PyInt_AS_LONG((PyIntObject*)k);
2772 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 PyErr_SetString(PicklingError,
2774 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002775 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 }
Tim Petersac5687a2003-02-02 18:08:34 +00002777 if (have_get[ik]) /* with matching get */
2778 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 }
2780
2781 else if (! (PyTuple_Check(k) &&
2782 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002783 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 ) {
2785 PyErr_SetString(PicklingError,
2786 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002787 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 }
2789
2790 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002791 ik = PyInt_AS_LONG((PyIntObject *)k);
2792 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 PyErr_SetString(PicklingError,
2794 "Invalid get data");
2795 return NULL;
2796 }
Tim Petersac5687a2003-02-02 18:08:34 +00002797 have_get[ik] = 1;
2798 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 }
2801
2802 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002803 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002804 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002805 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806
Tim Petersac5687a2003-02-02 18:08:34 +00002807 for (i = 0; i < l; i++) {
2808 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002810 if (PyString_Check(k)) {
2811 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002813 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002814 while (--ssize >= 0)
2815 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 }
2817 }
2818
2819 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002820 ik = PyInt_AS_LONG((PyIntObject *)
2821 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 if (ik < 256) {
2823 *s++ = BINGET;
2824 *s++ = (int)(ik & 0xff);
2825 }
2826 else {
2827 *s++ = LONG_BINGET;
2828 *s++ = (int)(ik & 0xff);
2829 *s++ = (int)((ik >> 8) & 0xff);
2830 *s++ = (int)((ik >> 16) & 0xff);
2831 *s++ = (int)((ik >> 24) & 0xff);
2832 }
2833 }
2834
2835 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002836 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837
2838 if (have_get[ik]) { /* with matching get */
2839 if (ik < 256) {
2840 *s++ = BINPUT;
2841 *s++ = (int)(ik & 0xff);
2842 }
2843 else {
2844 *s++ = LONG_BINPUT;
2845 *s++ = (int)(ik & 0xff);
2846 *s++ = (int)((ik >> 8) & 0xff);
2847 *s++ = (int)((ik >> 16) & 0xff);
2848 *s++ = (int)((ik >> 24) & 0xff);
2849 }
2850 }
2851 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 }
2853
2854 if (clear) {
2855 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002856 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 }
2858
2859 free(have_get);
2860 return r;
2861 err:
2862 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002863 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002864}
2865
2866static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002867Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868{
2869 PyObject *ob;
2870 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002871
Tim Peterscba30e22003-02-01 06:24:36 +00002872 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875 if (dump(self, ob) < 0)
2876 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 /* XXX Why does dump() return self? */
2881 Py_INCREF(self);
2882 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002883}
2884
2885
Tim Peterscba30e22003-02-01 06:24:36 +00002886static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887{
Neal Norwitzb0493252002-03-31 14:44:22 +00002888 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002889 PyDoc_STR("dump(object) -- "
2890 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002891 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002892 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002893 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002894 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002895 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002896};
2897
2898
2899static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002900newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002901{
2902 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002903
Tim Peters5bd2a792003-02-01 16:45:06 +00002904 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002905 proto = HIGHEST_PROTOCOL;
2906 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002907 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2908 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002909 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002910 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002911 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002912
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002913 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002914 if (self == NULL)
2915 return NULL;
2916 self->proto = proto;
2917 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002918 self->fp = NULL;
2919 self->write = NULL;
2920 self->memo = NULL;
2921 self->arg = NULL;
2922 self->pers_func = NULL;
2923 self->inst_pers_func = NULL;
2924 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002925 self->fast = 0;
2926 self->fast_container = 0;
2927 self->fast_memo = NULL;
2928 self->buf_size = 0;
2929 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002930
Tim Peters5bd2a792003-02-01 16:45:06 +00002931 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 if (file)
2933 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002934 else {
2935 file = Pdata_New();
2936 if (file == NULL)
2937 goto err;
2938 }
2939 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002940
Tim Peterscba30e22003-02-01 06:24:36 +00002941 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if (PyFile_Check(file)) {
2945 self->fp = PyFile_AsFile(file);
2946 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002947 PyErr_SetString(PyExc_ValueError,
2948 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 goto err;
2950 }
2951 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002952 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 else if (PycStringIO_OutputCheck(file)) {
2954 self->write_func = write_cStringIO;
2955 }
2956 else if (file == Py_None) {
2957 self->write_func = write_none;
2958 }
2959 else {
2960 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962 if (! Pdata_Check(file)) {
2963 self->write = PyObject_GetAttr(file, write_str);
2964 if (!self->write) {
2965 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002966 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 "argument must have 'write' "
2968 "attribute");
2969 goto err;
2970 }
2971 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002972
Tim Peters5bd2a792003-02-01 16:45:06 +00002973 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2974 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 PyErr_NoMemory();
2976 goto err;
2977 }
2978 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 if (PyEval_GetRestricted()) {
2981 /* Restricted execution, get private tables */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00002982 PyObject *m = PyImport_Import(copyreg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002983
Tim Peters5b7da392003-02-04 00:21:07 +00002984 if (m == NULL)
2985 goto err;
2986 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002988 if (self->dispatch_table == NULL)
2989 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 }
2991 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002992 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 Py_INCREF(dispatch_table);
2994 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002995 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003000 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003002}
3003
3004
3005static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003006get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003008 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003009 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003010 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003011
Tim Peters92c8bb32003-02-13 23:00:26 +00003012 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003013 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003014 * accepts Pickler() and Pickler(integer) too. The meaning then
3015 * is clear as mud, undocumented, and not supported by pickle.py.
3016 * I'm told Zope uses this, but I haven't traced into this code
3017 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003018 */
3019 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003021 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003022 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3023 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 return NULL;
3025 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003026 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003027}
3028
3029
3030static void
Tim Peterscba30e22003-02-01 06:24:36 +00003031Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003033 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 Py_XDECREF(self->write);
3035 Py_XDECREF(self->memo);
3036 Py_XDECREF(self->fast_memo);
3037 Py_XDECREF(self->arg);
3038 Py_XDECREF(self->file);
3039 Py_XDECREF(self->pers_func);
3040 Py_XDECREF(self->inst_pers_func);
3041 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003042 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003043 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003044}
3045
3046static int
3047Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3048{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003049 Py_VISIT(self->write);
3050 Py_VISIT(self->memo);
3051 Py_VISIT(self->fast_memo);
3052 Py_VISIT(self->arg);
3053 Py_VISIT(self->file);
3054 Py_VISIT(self->pers_func);
3055 Py_VISIT(self->inst_pers_func);
3056 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003057 return 0;
3058}
3059
3060static int
3061Pickler_clear(Picklerobject *self)
3062{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003063 Py_CLEAR(self->write);
3064 Py_CLEAR(self->memo);
3065 Py_CLEAR(self->fast_memo);
3066 Py_CLEAR(self->arg);
3067 Py_CLEAR(self->file);
3068 Py_CLEAR(self->pers_func);
3069 Py_CLEAR(self->inst_pers_func);
3070 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003071 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003072}
3073
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003074static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003075Pickler_get_pers_func(Picklerobject *p)
3076{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 if (p->pers_func == NULL)
3078 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3079 else
3080 Py_INCREF(p->pers_func);
3081 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003082}
3083
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003084static int
3085Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3086{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 if (v == NULL) {
3088 PyErr_SetString(PyExc_TypeError,
3089 "attribute deletion is not supported");
3090 return -1;
3091 }
3092 Py_XDECREF(p->pers_func);
3093 Py_INCREF(v);
3094 p->pers_func = v;
3095 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003096}
3097
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003098static int
3099Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3100{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 if (v == NULL) {
3102 PyErr_SetString(PyExc_TypeError,
3103 "attribute deletion is not supported");
3104 return -1;
3105 }
3106 Py_XDECREF(p->inst_pers_func);
3107 Py_INCREF(v);
3108 p->inst_pers_func = v;
3109 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003110}
3111
3112static PyObject *
3113Pickler_get_memo(Picklerobject *p)
3114{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 if (p->memo == NULL)
3116 PyErr_SetString(PyExc_AttributeError, "memo");
3117 else
3118 Py_INCREF(p->memo);
3119 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003120}
3121
3122static int
3123Pickler_set_memo(Picklerobject *p, PyObject *v)
3124{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (v == NULL) {
3126 PyErr_SetString(PyExc_TypeError,
3127 "attribute deletion is not supported");
3128 return -1;
3129 }
3130 if (!PyDict_Check(v)) {
3131 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3132 return -1;
3133 }
3134 Py_XDECREF(p->memo);
3135 Py_INCREF(v);
3136 p->memo = v;
3137 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003138}
3139
3140static PyObject *
3141Pickler_get_error(Picklerobject *p)
3142{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003143 /* why is this an attribute on the Pickler? */
3144 Py_INCREF(PicklingError);
3145 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003146}
3147
3148static PyMemberDef Pickler_members[] = {
3149 {"binary", T_INT, offsetof(Picklerobject, bin)},
3150 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003151 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003152};
3153
3154static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003155 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003156 (setter)Pickler_set_pers_func},
3157 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3158 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003159 {"PicklingError", (getter)Pickler_get_error, NULL},
3160 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003161};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003163PyDoc_STRVAR(Picklertype__doc__,
3164"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003165
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003166static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003167 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003168 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003169 sizeof(Picklerobject), /*tp_basicsize*/
3170 0,
3171 (destructor)Pickler_dealloc, /* tp_dealloc */
3172 0, /* tp_print */
3173 0, /* tp_getattr */
3174 0, /* tp_setattr */
3175 0, /* tp_compare */
3176 0, /* tp_repr */
3177 0, /* tp_as_number */
3178 0, /* tp_as_sequence */
3179 0, /* tp_as_mapping */
3180 0, /* tp_hash */
3181 0, /* tp_call */
3182 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003183 PyObject_GenericGetAttr, /* tp_getattro */
3184 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003185 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003186 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003187 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003188 (traverseproc)Pickler_traverse, /* tp_traverse */
3189 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003190 0, /* tp_richcompare */
3191 0, /* tp_weaklistoffset */
3192 0, /* tp_iter */
3193 0, /* tp_iternext */
3194 Pickler_methods, /* tp_methods */
3195 Pickler_members, /* tp_members */
3196 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003197};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003198
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003199static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003200find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201{
3202 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 if (fc) {
3205 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003206 PyErr_SetString(UnpicklingError, "Global and instance "
3207 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 return NULL;
3209 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003210 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3211 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214 module = PySys_GetObject("modules");
3215 if (module == NULL)
3216 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 module = PyDict_GetItem(module, py_module_name);
3219 if (module == NULL) {
3220 module = PyImport_Import(py_module_name);
3221 if (!module)
3222 return NULL;
3223 global = PyObject_GetAttr(module, py_global_name);
3224 Py_DECREF(module);
3225 }
3226 else
3227 global = PyObject_GetAttr(module, py_global_name);
3228 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003229}
3230
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003231static int
Tim Peterscba30e22003-02-01 06:24:36 +00003232marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233{
3234 if (self->num_marks < 1) {
3235 PyErr_SetString(UnpicklingError, "could not find MARK");
3236 return -1;
3237 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240}
3241
Tim Peters84e87f32001-03-17 04:50:51 +00003242
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243static int
Tim Peterscba30e22003-02-01 06:24:36 +00003244load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245{
3246 PDATA_APPEND(self->stack, Py_None, -1);
3247 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248}
3249
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003250static int
Tim Peterscba30e22003-02-01 06:24:36 +00003251bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003252{
3253 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3254 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003255}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256
3257static int
Tim Peterscba30e22003-02-01 06:24:36 +00003258load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003259{
3260 PyObject *py_int = 0;
3261 char *endptr, *s;
3262 int len, res = -1;
3263 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003264
Tim Peters0bc93f52003-02-02 18:29:33 +00003265 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003266 if (len < 2) return bad_readline();
3267 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269 errno = 0;
3270 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3273 /* Hm, maybe we've got something long. Let's try reading
3274 it as a Python long object. */
3275 errno = 0;
3276 py_int = PyLong_FromString(s, NULL, 0);
3277 if (py_int == NULL) {
3278 PyErr_SetString(PyExc_ValueError,
3279 "could not convert string to int");
3280 goto finally;
3281 }
3282 }
3283 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003284 if (len == 3 && (l == 0 || l == 1)) {
3285 if (!( py_int = PyBool_FromLong(l))) goto finally;
3286 }
3287 else {
3288 if (!( py_int = PyInt_FromLong(l))) goto finally;
3289 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292 free(s);
3293 PDATA_PUSH(self->stack, py_int, -1);
3294 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003296 finally:
3297 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003299 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003300}
3301
Tim Peters3c67d792003-02-02 17:59:11 +00003302static int
3303load_bool(Unpicklerobject *self, PyObject *boolean)
3304{
3305 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003306 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003307 return 0;
3308}
3309
Tim Petersee1a53c2003-02-02 02:57:53 +00003310/* s contains x bytes of a little-endian integer. Return its value as a
3311 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3312 * int, but when x is 4 it's a signed one. This is an historical source
3313 * of x-platform bugs.
3314 */
Tim Peters84e87f32001-03-17 04:50:51 +00003315static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003316calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003317{
3318 unsigned char c;
3319 int i;
3320 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 for (i = 0, l = 0L; i < x; i++) {
3323 c = (unsigned char)s[i];
3324 l |= (long)c << (i * 8);
3325 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003326#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3328 * is signed, so on a box with longs bigger than 4 bytes we need
3329 * to extend a BININT's sign bit to the full width.
3330 */
3331 if (x == 4 && l & (1L << 31))
3332 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003333#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335}
3336
3337
3338static int
Tim Peterscba30e22003-02-01 06:24:36 +00003339load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003340{
3341 PyObject *py_int = 0;
3342 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345
Tim Peterscba30e22003-02-01 06:24:36 +00003346 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003347 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 PDATA_PUSH(self->stack, py_int, -1);
3350 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003351}
3352
3353
3354static int
Tim Peterscba30e22003-02-01 06:24:36 +00003355load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356{
3357 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358
Tim Peters0bc93f52003-02-02 18:29:33 +00003359 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003363}
3364
3365
3366static int
Tim Peterscba30e22003-02-01 06:24:36 +00003367load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368{
3369 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370
Tim Peters0bc93f52003-02-02 18:29:33 +00003371 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003375}
3376
3377
3378static int
Tim Peterscba30e22003-02-01 06:24:36 +00003379load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380{
3381 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382
Tim Peters0bc93f52003-02-02 18:29:33 +00003383 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003387}
Tim Peters84e87f32001-03-17 04:50:51 +00003388
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389static int
Tim Peterscba30e22003-02-01 06:24:36 +00003390load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391{
3392 PyObject *l = 0;
3393 char *end, *s;
3394 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395
Tim Peters0bc93f52003-02-02 18:29:33 +00003396 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 if (len < 2) return bad_readline();
3398 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399
Tim Peterscba30e22003-02-01 06:24:36 +00003400 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003401 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 free(s);
3404 PDATA_PUSH(self->stack, l, -1);
3405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 finally:
3408 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411}
3412
Tim Petersee1a53c2003-02-02 02:57:53 +00003413/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3414 * data following.
3415 */
3416static int
3417load_counted_long(Unpicklerobject *self, int size)
3418{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003419 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003420 char *nbytes;
3421 unsigned char *pdata;
3422 PyObject *along;
3423
3424 assert(size == 1 || size == 4);
3425 i = self->read_func(self, &nbytes, size);
3426 if (i < 0) return -1;
3427
3428 size = calc_binint(nbytes, size);
3429 if (size < 0) {
3430 /* Corrupt or hostile pickle -- we never write one like
3431 * this.
3432 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003433 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003434 "byte count");
3435 return -1;
3436 }
3437
3438 if (size == 0)
3439 along = PyLong_FromLong(0L);
3440 else {
3441 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003442 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003443 if (i < 0) return -1;
3444 along = _PyLong_FromByteArray(pdata, (size_t)size,
3445 1 /* little endian */, 1 /* signed */);
3446 }
3447 if (along == NULL)
3448 return -1;
3449 PDATA_PUSH(self->stack, along, -1);
3450 return 0;
3451}
Tim Peters84e87f32001-03-17 04:50:51 +00003452
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453static int
Tim Peterscba30e22003-02-01 06:24:36 +00003454load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003455{
3456 PyObject *py_float = 0;
3457 char *endptr, *s;
3458 int len, res = -1;
3459 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460
Tim Peters0bc93f52003-02-02 18:29:33 +00003461 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 if (len < 2) return bad_readline();
3463 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003466 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3469 PyErr_SetString(PyExc_ValueError,
3470 "could not convert string to float");
3471 goto finally;
3472 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003473
Tim Peterscba30e22003-02-01 06:24:36 +00003474 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003475 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 free(s);
3478 PDATA_PUSH(self->stack, py_float, -1);
3479 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481 finally:
3482 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003484 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485}
3486
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
Tim Peters9905b942003-03-20 20:53:32 +00003490 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 double x;
3492 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003493
Tim Peters0bc93f52003-02-02 18:29:33 +00003494 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003495 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003496
Tim Peters9905b942003-03-20 20:53:32 +00003497 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3498 if (x == -1.0 && PyErr_Occurred())
3499 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003500
Tim Peters9905b942003-03-20 20:53:32 +00003501 py_float = PyFloat_FromDouble(x);
3502 if (py_float == NULL)
3503 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 PDATA_PUSH(self->stack, py_float, -1);
3506 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508
3509static int
Tim Peterscba30e22003-02-01 06:24:36 +00003510load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511{
3512 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003513 int len, res = -1;
3514 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003515
Tim Peters0bc93f52003-02-02 18:29:33 +00003516 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003517 if (len < 2) return bad_readline();
3518 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003519
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003520
3521 /* Strip outermost quotes */
3522 while (s[len-1] <= ' ')
3523 len--;
3524 if(s[0]=='"' && s[len-1]=='"'){
3525 s[len-1] = '\0';
3526 p = s + 1 ;
3527 len -= 2;
3528 } else if(s[0]=='\'' && s[len-1]=='\''){
3529 s[len-1] = '\0';
3530 p = s + 1 ;
3531 len -= 2;
3532 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 goto insecure;
3534 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003535
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003536 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003537 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003538 if (str) {
3539 PDATA_PUSH(self->stack, str, -1);
3540 res = 0;
3541 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 insecure:
3545 free(s);
3546 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3547 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003548}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003549
3550
3551static int
Tim Peterscba30e22003-02-01 06:24:36 +00003552load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553{
3554 PyObject *py_string = 0;
3555 long l;
3556 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Tim Peters0bc93f52003-02-02 18:29:33 +00003558 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003561 if (l < 0) {
3562 /* Corrupt or hostile pickle -- we never write one like
3563 * this.
3564 */
3565 PyErr_SetString(UnpicklingError,
3566 "BINSTRING pickle has negative byte count");
3567 return -1;
3568 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569
Tim Peters0bc93f52003-02-02 18:29:33 +00003570 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003573 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003574 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003576 PDATA_PUSH(self->stack, py_string, -1);
3577 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578}
3579
3580
3581static int
Tim Peterscba30e22003-02-01 06:24:36 +00003582load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003583{
3584 PyObject *py_string = 0;
3585 unsigned char l;
3586 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Tim Peters0bc93f52003-02-02 18:29:33 +00003588 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592
Tim Peters0bc93f52003-02-02 18:29:33 +00003593 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003595 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597 PDATA_PUSH(self->stack, py_string, -1);
3598 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003599}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003600
3601
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003602#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603static int
Tim Peterscba30e22003-02-01 06:24:36 +00003604load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605{
3606 PyObject *str = 0;
3607 int len, res = -1;
3608 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003609
Tim Peters0bc93f52003-02-02 18:29:33 +00003610 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003612
Tim Peterscba30e22003-02-01 06:24:36 +00003613 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003614 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616 PDATA_PUSH(self->stack, str, -1);
3617 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 finally:
3620 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003621}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003622#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003623
3624
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003625#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003626static int
Tim Peterscba30e22003-02-01 06:24:36 +00003627load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628{
3629 PyObject *unicode;
3630 long l;
3631 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003632
Tim Peters0bc93f52003-02-02 18:29:33 +00003633 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003636 if (l < 0) {
3637 /* Corrupt or hostile pickle -- we never write one like
3638 * this.
3639 */
3640 PyErr_SetString(UnpicklingError,
3641 "BINUNICODE pickle has negative byte count");
3642 return -1;
3643 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003644
Tim Peters0bc93f52003-02-02 18:29:33 +00003645 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003646 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003647
Tim Peterscba30e22003-02-01 06:24:36 +00003648 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003649 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651 PDATA_PUSH(self->stack, unicode, -1);
3652 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003653}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003654#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003655
3656
3657static int
Tim Peterscba30e22003-02-01 06:24:36 +00003658load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003659{
3660 PyObject *tup;
3661 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003663 if ((i = marker(self)) < 0) return -1;
3664 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3665 PDATA_PUSH(self->stack, tup, -1);
3666 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667}
3668
3669static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003670load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003671{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003672 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673
Tim Peters1d63c9f2003-02-02 20:29:39 +00003674 if (tup == NULL)
3675 return -1;
3676
3677 while (--len >= 0) {
3678 PyObject *element;
3679
3680 PDATA_POP(self->stack, element);
3681 if (element == NULL)
3682 return -1;
3683 PyTuple_SET_ITEM(tup, len, element);
3684 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 PDATA_PUSH(self->stack, tup, -1);
3686 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687}
3688
3689static int
Tim Peterscba30e22003-02-01 06:24:36 +00003690load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691{
3692 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if (!( list=PyList_New(0))) return -1;
3695 PDATA_PUSH(self->stack, list, -1);
3696 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697}
3698
3699static int
Tim Peterscba30e22003-02-01 06:24:36 +00003700load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003701{
3702 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704 if (!( dict=PyDict_New())) return -1;
3705 PDATA_PUSH(self->stack, dict, -1);
3706 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003707}
3708
3709
3710static int
Tim Peterscba30e22003-02-01 06:24:36 +00003711load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712{
3713 PyObject *list = 0;
3714 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003716 if ((i = marker(self)) < 0) return -1;
3717 if (!( list=Pdata_popList(self->stack, i))) return -1;
3718 PDATA_PUSH(self->stack, list, -1);
3719 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003720}
3721
3722static int
Tim Peterscba30e22003-02-01 06:24:36 +00003723load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724{
3725 PyObject *dict, *key, *value;
3726 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 if ((i = marker(self)) < 0) return -1;
3729 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003731 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003733 for (k = i+1; k < j; k += 2) {
3734 key =self->stack->data[k-1];
3735 value=self->stack->data[k ];
3736 if (PyDict_SetItem(dict, key, value) < 0) {
3737 Py_DECREF(dict);
3738 return -1;
3739 }
3740 }
3741 Pdata_clear(self->stack, i);
3742 PDATA_PUSH(self->stack, dict, -1);
3743 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744}
3745
3746static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003747Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003748{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003749 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003751 if (PyClass_Check(cls)) {
3752 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003754 if ((l=PyObject_Size(args)) < 0) goto err;
3755 if (!( l )) {
3756 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003757
Tim Peterscba30e22003-02-01 06:24:36 +00003758 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003759 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003761 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 so bypass usual construction */
3763 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003766 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 goto err;
3768 return inst;
3769 }
3770 Py_DECREF(__getinitargs__);
3771 }
Tim Peters84e87f32001-03-17 04:50:51 +00003772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 if ((r=PyInstance_New(cls, args, NULL))) return r;
3774 else goto err;
3775 }
Tim Peters84e87f32001-03-17 04:50:51 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 err:
3780 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003781 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003784 tmp_value = v;
3785 /* NULL occurs when there was a KeyboardInterrupt */
3786 if (tmp_value == NULL)
3787 tmp_value = Py_None;
3788 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 Py_XDECREF(v);
3790 v=r;
3791 }
3792 PyErr_Restore(tp,v,tb);
3793 }
3794 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795}
Tim Peters84e87f32001-03-17 04:50:51 +00003796
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
3798static int
Tim Peterscba30e22003-02-01 06:24:36 +00003799load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800{
3801 PyObject *class, *tup, *obj=0;
3802 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 if ((i = marker(self)) < 0) return -1;
3805 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3806 PDATA_POP(self->stack, class);
3807 if (class) {
3808 obj = Instance_New(class, tup);
3809 Py_DECREF(class);
3810 }
3811 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003813 if (! obj) return -1;
3814 PDATA_PUSH(self->stack, obj, -1);
3815 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003816}
3817
3818
3819static int
Tim Peterscba30e22003-02-01 06:24:36 +00003820load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003821{
3822 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3823 int i, len;
3824 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003827
Tim Peters0bc93f52003-02-02 18:29:33 +00003828 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003829 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003830 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003832
Tim Peters0bc93f52003-02-02 18:29:33 +00003833 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003835 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003836 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 self->find_class);
3838 Py_DECREF(class_name);
3839 }
3840 }
3841 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 if ((tup=Pdata_popTuple(self->stack, i))) {
3846 obj = Instance_New(class, tup);
3847 Py_DECREF(tup);
3848 }
3849 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003851 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003853 PDATA_PUSH(self->stack, obj, -1);
3854 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855}
3856
Tim Peterseab7db32003-02-13 18:24:14 +00003857static int
3858load_newobj(Unpicklerobject *self)
3859{
3860 PyObject *args = NULL;
3861 PyObject *clsraw = NULL;
3862 PyTypeObject *cls; /* clsraw cast to its true type */
3863 PyObject *obj;
3864
3865 /* Stack is ... cls argtuple, and we want to call
3866 * cls.__new__(cls, *argtuple).
3867 */
3868 PDATA_POP(self->stack, args);
3869 if (args == NULL) goto Fail;
3870 if (! PyTuple_Check(args)) {
3871 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3872 "tuple.");
3873 goto Fail;
3874 }
3875
3876 PDATA_POP(self->stack, clsraw);
3877 cls = (PyTypeObject *)clsraw;
3878 if (cls == NULL) goto Fail;
3879 if (! PyType_Check(cls)) {
3880 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3881 "isn't a type object");
3882 goto Fail;
3883 }
3884 if (cls->tp_new == NULL) {
3885 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3886 "has NULL tp_new");
3887 goto Fail;
3888 }
3889
3890 /* Call __new__. */
3891 obj = cls->tp_new(cls, args, NULL);
3892 if (obj == NULL) goto Fail;
3893
3894 Py_DECREF(args);
3895 Py_DECREF(clsraw);
3896 PDATA_PUSH(self->stack, obj, -1);
3897 return 0;
3898
3899 Fail:
3900 Py_XDECREF(args);
3901 Py_XDECREF(clsraw);
3902 return -1;
3903}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003904
3905static int
Tim Peterscba30e22003-02-01 06:24:36 +00003906load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003907{
3908 PyObject *class = 0, *module_name = 0, *class_name = 0;
3909 int len;
3910 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003911
Tim Peters0bc93f52003-02-02 18:29:33 +00003912 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003913 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003914 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Tim Peters0bc93f52003-02-02 18:29:33 +00003917 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003918 if (len < 2) {
3919 Py_DECREF(module_name);
3920 return bad_readline();
3921 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003922 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003923 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 self->find_class);
3925 Py_DECREF(class_name);
3926 }
3927 }
3928 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 if (! class) return -1;
3931 PDATA_PUSH(self->stack, class, -1);
3932 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933}
3934
3935
3936static int
Tim Peterscba30e22003-02-01 06:24:36 +00003937load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938{
3939 PyObject *pid = 0;
3940 int len;
3941 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003944 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 if (len < 2) return bad_readline();
3946
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003947 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 if (!pid) return -1;
3949
3950 if (PyList_Check(self->pers_func)) {
3951 if (PyList_Append(self->pers_func, pid) < 0) {
3952 Py_DECREF(pid);
3953 return -1;
3954 }
3955 }
3956 else {
3957 ARG_TUP(self, pid);
3958 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003959 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 NULL);
3961 FREE_ARG_TUP(self);
3962 }
3963 }
3964
3965 if (! pid) return -1;
3966
3967 PDATA_PUSH(self->stack, pid, -1);
3968 return 0;
3969 }
3970 else {
3971 PyErr_SetString(UnpicklingError,
3972 "A load persistent id instruction was encountered,\n"
3973 "but no persistent_load function was specified.");
3974 return -1;
3975 }
3976}
3977
3978static int
Tim Peterscba30e22003-02-01 06:24:36 +00003979load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980{
3981 PyObject *pid = 0;
3982
3983 if (self->pers_func) {
3984 PDATA_POP(self->stack, pid);
3985 if (! pid) return -1;
3986
3987 if (PyList_Check(self->pers_func)) {
3988 if (PyList_Append(self->pers_func, pid) < 0) {
3989 Py_DECREF(pid);
3990 return -1;
3991 }
3992 }
3993 else {
3994 ARG_TUP(self, pid);
3995 if (self->arg) {
3996 pid = PyObject_Call(self->pers_func, self->arg,
3997 NULL);
3998 FREE_ARG_TUP(self);
3999 }
4000 if (! pid) return -1;
4001 }
4002
4003 PDATA_PUSH(self->stack, pid, -1);
4004 return 0;
4005 }
4006 else {
4007 PyErr_SetString(UnpicklingError,
4008 "A load persistent id instruction was encountered,\n"
4009 "but no persistent_load function was specified.");
4010 return -1;
4011 }
4012}
4013
4014
4015static int
Tim Peterscba30e22003-02-01 06:24:36 +00004016load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017{
4018 int len;
4019
4020 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
4021
4022 /* Note that we split the (pickle.py) stack into two stacks,
4023 an object stack and a mark stack. We have to be clever and
4024 pop the right one. We do this by looking at the top of the
4025 mark stack.
4026 */
4027
4028 if ((self->num_marks > 0) &&
4029 (self->marks[self->num_marks - 1] == len))
4030 self->num_marks--;
4031 else {
4032 len--;
4033 Py_DECREF(self->stack->data[len]);
4034 self->stack->length=len;
4035 }
4036
4037 return 0;
4038}
4039
4040
4041static int
Tim Peterscba30e22003-02-01 06:24:36 +00004042load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043{
4044 int i;
4045
4046 if ((i = marker(self)) < 0)
4047 return -1;
4048
4049 Pdata_clear(self->stack, i);
4050
4051 return 0;
4052}
4053
4054
4055static int
Tim Peterscba30e22003-02-01 06:24:36 +00004056load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057{
4058 PyObject *last;
4059 int len;
4060
4061 if ((len = self->stack->length) <= 0) return stackUnderflow();
4062 last=self->stack->data[len-1];
4063 Py_INCREF(last);
4064 PDATA_PUSH(self->stack, last, -1);
4065 return 0;
4066}
4067
4068
4069static int
Tim Peterscba30e22003-02-01 06:24:36 +00004070load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071{
4072 PyObject *py_str = 0, *value = 0;
4073 int len;
4074 char *s;
4075 int rc;
4076
Tim Peters0bc93f52003-02-02 18:29:33 +00004077 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004078 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004079
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004080 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 value = PyDict_GetItem(self->memo, py_str);
4083 if (! value) {
4084 PyErr_SetObject(BadPickleGet, py_str);
4085 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004086 }
4087 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 PDATA_APPEND(self->stack, value, -1);
4089 rc = 0;
4090 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 Py_DECREF(py_str);
4093 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094}
4095
4096
4097static int
Tim Peterscba30e22003-02-01 06:24:36 +00004098load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099{
4100 PyObject *py_key = 0, *value = 0;
4101 unsigned char key;
4102 char *s;
4103 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004104
Tim Peters0bc93f52003-02-02 18:29:33 +00004105 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 key = (unsigned char)s[0];
4108 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 value = PyDict_GetItem(self->memo, py_key);
4111 if (! value) {
4112 PyErr_SetObject(BadPickleGet, py_key);
4113 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004114 }
4115 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 PDATA_APPEND(self->stack, value, -1);
4117 rc = 0;
4118 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004120 Py_DECREF(py_key);
4121 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004122}
4123
4124
4125static int
Tim Peterscba30e22003-02-01 06:24:36 +00004126load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127{
4128 PyObject *py_key = 0, *value = 0;
4129 unsigned char c;
4130 char *s;
4131 long key;
4132 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004133
Tim Peters0bc93f52003-02-02 18:29:33 +00004134 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 c = (unsigned char)s[0];
4137 key = (long)c;
4138 c = (unsigned char)s[1];
4139 key |= (long)c << 8;
4140 c = (unsigned char)s[2];
4141 key |= (long)c << 16;
4142 c = (unsigned char)s[3];
4143 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4146
4147 value = PyDict_GetItem(self->memo, py_key);
4148 if (! value) {
4149 PyErr_SetObject(BadPickleGet, py_key);
4150 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004151 }
4152 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 PDATA_APPEND(self->stack, value, -1);
4154 rc = 0;
4155 }
4156
4157 Py_DECREF(py_key);
4158 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159}
4160
Tim Peters2d629652003-02-04 05:06:17 +00004161/* Push an object from the extension registry (EXT[124]). nbytes is
4162 * the number of bytes following the opcode, holding the index (code) value.
4163 */
4164static int
4165load_extension(Unpicklerobject *self, int nbytes)
4166{
4167 char *codebytes; /* the nbytes bytes after the opcode */
4168 long code; /* calc_binint returns long */
4169 PyObject *py_code; /* code as a Python int */
4170 PyObject *obj; /* the object to push */
4171 PyObject *pair; /* (module_name, class_name) */
4172 PyObject *module_name, *class_name;
4173
4174 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4175 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4176 code = calc_binint(codebytes, nbytes);
4177 if (code <= 0) { /* note that 0 is forbidden */
4178 /* Corrupt or hostile pickle. */
4179 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4180 return -1;
4181 }
4182
4183 /* Look for the code in the cache. */
4184 py_code = PyInt_FromLong(code);
4185 if (py_code == NULL) return -1;
4186 obj = PyDict_GetItem(extension_cache, py_code);
4187 if (obj != NULL) {
4188 /* Bingo. */
4189 Py_DECREF(py_code);
4190 PDATA_APPEND(self->stack, obj, -1);
4191 return 0;
4192 }
4193
4194 /* Look up the (module_name, class_name) pair. */
4195 pair = PyDict_GetItem(inverted_registry, py_code);
4196 if (pair == NULL) {
4197 Py_DECREF(py_code);
4198 PyErr_Format(PyExc_ValueError, "unregistered extension "
4199 "code %ld", code);
4200 return -1;
4201 }
4202 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004203 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004204 */
4205 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004206 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4207 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004208 Py_DECREF(py_code);
4209 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4210 "isn't a 2-tuple of strings", code);
4211 return -1;
4212 }
4213 /* Load the object. */
4214 obj = find_class(module_name, class_name, self->find_class);
4215 if (obj == NULL) {
4216 Py_DECREF(py_code);
4217 return -1;
4218 }
4219 /* Cache code -> obj. */
4220 code = PyDict_SetItem(extension_cache, py_code, obj);
4221 Py_DECREF(py_code);
4222 if (code < 0) {
4223 Py_DECREF(obj);
4224 return -1;
4225 }
4226 PDATA_PUSH(self->stack, obj, -1);
4227 return 0;
4228}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229
4230static int
Tim Peterscba30e22003-02-01 06:24:36 +00004231load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232{
4233 PyObject *py_str = 0, *value = 0;
4234 int len, l;
4235 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004236
Tim Peters0bc93f52003-02-02 18:29:33 +00004237 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 if (l < 2) return bad_readline();
4239 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004240 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004241 value=self->stack->data[len-1];
4242 l=PyDict_SetItem(self->memo, py_str, value);
4243 Py_DECREF(py_str);
4244 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004245}
4246
4247
4248static int
Tim Peterscba30e22003-02-01 06:24:36 +00004249load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250{
4251 PyObject *py_key = 0, *value = 0;
4252 unsigned char key;
4253 char *s;
4254 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004255
Tim Peters0bc93f52003-02-02 18:29:33 +00004256 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004261 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4262 value=self->stack->data[len-1];
4263 len=PyDict_SetItem(self->memo, py_key, value);
4264 Py_DECREF(py_key);
4265 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004266}
4267
4268
4269static int
Tim Peterscba30e22003-02-01 06:24:36 +00004270load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271{
4272 PyObject *py_key = 0, *value = 0;
4273 long key;
4274 unsigned char c;
4275 char *s;
4276 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
Tim Peters0bc93f52003-02-02 18:29:33 +00004278 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 c = (unsigned char)s[0];
4282 key = (long)c;
4283 c = (unsigned char)s[1];
4284 key |= (long)c << 8;
4285 c = (unsigned char)s[2];
4286 key |= (long)c << 16;
4287 c = (unsigned char)s[3];
4288 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 if (!( py_key = PyInt_FromLong(key))) return -1;
4291 value=self->stack->data[len-1];
4292 len=PyDict_SetItem(self->memo, py_key, value);
4293 Py_DECREF(py_key);
4294 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295}
4296
4297
4298static int
Tim Peterscba30e22003-02-01 06:24:36 +00004299do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300{
4301 PyObject *value = 0, *list = 0, *append_method = 0;
4302 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004304 len=self->stack->length;
4305 if (!( len >= x && x > 0 )) return stackUnderflow();
4306 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004307 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 if (PyList_Check(list)) {
4312 PyObject *slice;
4313 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004316 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 list_len = PyList_GET_SIZE(list);
4318 i=PyList_SetSlice(list, list_len, list_len, slice);
4319 Py_DECREF(slice);
4320 return i;
4321 }
4322 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004323
Tim Peterscba30e22003-02-01 06:24:36 +00004324 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 return -1;
4326
4327 for (i = x; i < len; i++) {
4328 PyObject *junk;
4329
4330 value=self->stack->data[i];
4331 junk=0;
4332 ARG_TUP(self, value);
4333 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004334 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 NULL);
4336 FREE_ARG_TUP(self);
4337 }
4338 if (! junk) {
4339 Pdata_clear(self->stack, i+1);
4340 self->stack->length=x;
4341 Py_DECREF(append_method);
4342 return -1;
4343 }
4344 Py_DECREF(junk);
4345 }
4346 self->stack->length=x;
4347 Py_DECREF(append_method);
4348 }
4349
4350 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004351}
4352
4353
4354static int
Tim Peterscba30e22003-02-01 06:24:36 +00004355load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356{
4357 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004358}
4359
4360
4361static int
Tim Peterscba30e22003-02-01 06:24:36 +00004362load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363{
4364 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365}
4366
4367
4368static int
Tim Peterscba30e22003-02-01 06:24:36 +00004369do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370{
4371 PyObject *value = 0, *key = 0, *dict = 0;
4372 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 if (!( (len=self->stack->length) >= x
4375 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 for (i = x+1; i < len; i += 2) {
4380 key =self->stack->data[i-1];
4381 value=self->stack->data[i ];
4382 if (PyObject_SetItem(dict, key, value) < 0) {
4383 r=-1;
4384 break;
4385 }
4386 }
4387
4388 Pdata_clear(self->stack, x);
4389
4390 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391}
4392
4393
Tim Peters84e87f32001-03-17 04:50:51 +00004394static int
Tim Peterscba30e22003-02-01 06:24:36 +00004395load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396{
4397 return do_setitems(self, self->stack->length - 2);
4398}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400static int
Tim Peterscba30e22003-02-01 06:24:36 +00004401load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402{
4403 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404}
4405
Tim Peters84e87f32001-03-17 04:50:51 +00004406
Guido van Rossum60456fd1997-04-09 17:36:32 +00004407static int
Tim Peterscba30e22003-02-01 06:24:36 +00004408load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004409{
Tim Peters080c88b2003-02-15 03:01:11 +00004410 PyObject *state, *inst, *slotstate;
4411 PyObject *__setstate__;
4412 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004413 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004414 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415
Tim Peters080c88b2003-02-15 03:01:11 +00004416 /* Stack is ... instance, state. We want to leave instance at
4417 * the stack top, possibly mutated via instance.__setstate__(state).
4418 */
4419 if (self->stack->length < 2)
4420 return stackUnderflow();
4421 PDATA_POP(self->stack, state);
4422 if (state == NULL)
4423 return -1;
4424 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425
Tim Peters080c88b2003-02-15 03:01:11 +00004426 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4427 if (__setstate__ != NULL) {
4428 PyObject *junk = NULL;
4429
4430 /* The explicit __setstate__ is responsible for everything. */
4431 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 if (self->arg) {
4433 junk = PyObject_Call(__setstate__, self->arg, NULL);
4434 FREE_ARG_TUP(self);
4435 }
4436 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004437 if (junk == NULL)
4438 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 Py_DECREF(junk);
4440 return 0;
4441 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004442 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4443 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004445
4446 /* A default __setstate__. First see whether state embeds a
4447 * slot state dict too (a proto 2 addition).
4448 */
4449 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4450 PyObject *temp = state;
4451 state = PyTuple_GET_ITEM(temp, 0);
4452 slotstate = PyTuple_GET_ITEM(temp, 1);
4453 Py_INCREF(state);
4454 Py_INCREF(slotstate);
4455 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 }
Tim Peters080c88b2003-02-15 03:01:11 +00004457 else
4458 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459
Tim Peters080c88b2003-02-15 03:01:11 +00004460 /* Set inst.__dict__ from the state dict (if any). */
4461 if (state != Py_None) {
4462 PyObject *dict;
4463 if (! PyDict_Check(state)) {
4464 PyErr_SetString(UnpicklingError, "state is not a "
4465 "dictionary");
4466 goto finally;
4467 }
4468 dict = PyObject_GetAttr(inst, __dict___str);
4469 if (dict == NULL)
4470 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471
Tim Peters080c88b2003-02-15 03:01:11 +00004472 i = 0;
4473 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4474 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4475 goto finally;
4476 }
4477 Py_DECREF(dict);
4478 }
4479
4480 /* Also set instance attributes from the slotstate dict (if any). */
4481 if (slotstate != NULL) {
4482 if (! PyDict_Check(slotstate)) {
4483 PyErr_SetString(UnpicklingError, "slot state is not "
4484 "a dictionary");
4485 goto finally;
4486 }
4487 i = 0;
4488 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4489 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4490 goto finally;
4491 }
4492 }
4493 res = 0;
4494
4495 finally:
4496 Py_DECREF(state);
4497 Py_XDECREF(slotstate);
4498 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004499}
4500
4501
4502static int
Tim Peterscba30e22003-02-01 06:24:36 +00004503load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504{
4505 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 /* Note that we split the (pickle.py) stack into two stacks, an
4508 object stack and a mark stack. Here we push a mark onto the
4509 mark stack.
4510 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004513 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 s=self->marks_size+20;
4515 if (s <= self->num_marks) s=self->num_marks + 1;
4516 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004517 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004519 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004521 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 PyErr_NoMemory();
4523 return -1;
4524 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004525 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 self->marks_size = s;
4527 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532}
4533
Guido van Rossum60456fd1997-04-09 17:36:32 +00004534static int
Tim Peterscba30e22003-02-01 06:24:36 +00004535load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536{
4537 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 PDATA_POP(self->stack, arg_tup);
4540 if (! arg_tup) return -1;
4541 PDATA_POP(self->stack, callable);
4542 if (callable) {
4543 ob = Instance_New(callable, arg_tup);
4544 Py_DECREF(callable);
4545 }
4546 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 PDATA_PUSH(self->stack, ob, -1);
4551 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552}
Tim Peters84e87f32001-03-17 04:50:51 +00004553
Tim Peters4190fb82003-02-02 16:09:05 +00004554/* Just raises an error if we don't know the protocol specified. PROTO
4555 * is the first opcode for protocols >= 2.
4556 */
4557static int
4558load_proto(Unpicklerobject *self)
4559{
4560 int i;
4561 char *protobyte;
4562
4563 i = self->read_func(self, &protobyte, 1);
4564 if (i < 0)
4565 return -1;
4566
4567 i = calc_binint(protobyte, 1);
4568 /* No point checking for < 0, since calc_binint returns an unsigned
4569 * int when chewing on 1 byte.
4570 */
4571 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004572 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004573 return 0;
4574
4575 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4576 return -1;
4577}
4578
Guido van Rossum60456fd1997-04-09 17:36:32 +00004579static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004580load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581{
4582 PyObject *err = 0, *val = 0;
4583 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 self->num_marks = 0;
4586 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004589 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 switch (s[0]) {
4593 case NONE:
4594 if (load_none(self) < 0)
4595 break;
4596 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 case BININT:
4599 if (load_binint(self) < 0)
4600 break;
4601 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 case BININT1:
4604 if (load_binint1(self) < 0)
4605 break;
4606 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 case BININT2:
4609 if (load_binint2(self) < 0)
4610 break;
4611 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 case INT:
4614 if (load_int(self) < 0)
4615 break;
4616 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 case LONG:
4619 if (load_long(self) < 0)
4620 break;
4621 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622
Tim Petersee1a53c2003-02-02 02:57:53 +00004623 case LONG1:
4624 if (load_counted_long(self, 1) < 0)
4625 break;
4626 continue;
4627
4628 case LONG4:
4629 if (load_counted_long(self, 4) < 0)
4630 break;
4631 continue;
4632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 case FLOAT:
4634 if (load_float(self) < 0)
4635 break;
4636 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638 case BINFLOAT:
4639 if (load_binfloat(self) < 0)
4640 break;
4641 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004643 case BINSTRING:
4644 if (load_binstring(self) < 0)
4645 break;
4646 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 case SHORT_BINSTRING:
4649 if (load_short_binstring(self) < 0)
4650 break;
4651 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004653 case STRING:
4654 if (load_string(self) < 0)
4655 break;
4656 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004657
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004658#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659 case UNICODE:
4660 if (load_unicode(self) < 0)
4661 break;
4662 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 case BINUNICODE:
4665 if (load_binunicode(self) < 0)
4666 break;
4667 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004668#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004671 if (load_counted_tuple(self, 0) < 0)
4672 break;
4673 continue;
4674
4675 case TUPLE1:
4676 if (load_counted_tuple(self, 1) < 0)
4677 break;
4678 continue;
4679
4680 case TUPLE2:
4681 if (load_counted_tuple(self, 2) < 0)
4682 break;
4683 continue;
4684
4685 case TUPLE3:
4686 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 break;
4688 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 case TUPLE:
4691 if (load_tuple(self) < 0)
4692 break;
4693 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 case EMPTY_LIST:
4696 if (load_empty_list(self) < 0)
4697 break;
4698 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 case LIST:
4701 if (load_list(self) < 0)
4702 break;
4703 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 case EMPTY_DICT:
4706 if (load_empty_dict(self) < 0)
4707 break;
4708 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 case DICT:
4711 if (load_dict(self) < 0)
4712 break;
4713 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 case OBJ:
4716 if (load_obj(self) < 0)
4717 break;
4718 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case INST:
4721 if (load_inst(self) < 0)
4722 break;
4723 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Tim Peterseab7db32003-02-13 18:24:14 +00004725 case NEWOBJ:
4726 if (load_newobj(self) < 0)
4727 break;
4728 continue;
4729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 case GLOBAL:
4731 if (load_global(self) < 0)
4732 break;
4733 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 case APPEND:
4736 if (load_append(self) < 0)
4737 break;
4738 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004740 case APPENDS:
4741 if (load_appends(self) < 0)
4742 break;
4743 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 case BUILD:
4746 if (load_build(self) < 0)
4747 break;
4748 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 case DUP:
4751 if (load_dup(self) < 0)
4752 break;
4753 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 case BINGET:
4756 if (load_binget(self) < 0)
4757 break;
4758 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 case LONG_BINGET:
4761 if (load_long_binget(self) < 0)
4762 break;
4763 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 case GET:
4766 if (load_get(self) < 0)
4767 break;
4768 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004769
Tim Peters2d629652003-02-04 05:06:17 +00004770 case EXT1:
4771 if (load_extension(self, 1) < 0)
4772 break;
4773 continue;
4774
4775 case EXT2:
4776 if (load_extension(self, 2) < 0)
4777 break;
4778 continue;
4779
4780 case EXT4:
4781 if (load_extension(self, 4) < 0)
4782 break;
4783 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case MARK:
4785 if (load_mark(self) < 0)
4786 break;
4787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case BINPUT:
4790 if (load_binput(self) < 0)
4791 break;
4792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 case LONG_BINPUT:
4795 if (load_long_binput(self) < 0)
4796 break;
4797 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 case PUT:
4800 if (load_put(self) < 0)
4801 break;
4802 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 case POP:
4805 if (load_pop(self) < 0)
4806 break;
4807 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case POP_MARK:
4810 if (load_pop_mark(self) < 0)
4811 break;
4812 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case SETITEM:
4815 if (load_setitem(self) < 0)
4816 break;
4817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case SETITEMS:
4820 if (load_setitems(self) < 0)
4821 break;
4822 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case STOP:
4825 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 case PERSID:
4828 if (load_persid(self) < 0)
4829 break;
4830 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 case BINPERSID:
4833 if (load_binpersid(self) < 0)
4834 break;
4835 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 case REDUCE:
4838 if (load_reduce(self) < 0)
4839 break;
4840 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004841
Tim Peters4190fb82003-02-02 16:09:05 +00004842 case PROTO:
4843 if (load_proto(self) < 0)
4844 break;
4845 continue;
4846
Tim Peters3c67d792003-02-02 17:59:11 +00004847 case NEWTRUE:
4848 if (load_bool(self, Py_True) < 0)
4849 break;
4850 continue;
4851
4852 case NEWFALSE:
4853 if (load_bool(self, Py_False) < 0)
4854 break;
4855 continue;
4856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004857 case '\0':
4858 /* end of file */
4859 PyErr_SetNone(PyExc_EOFError);
4860 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004863 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 "invalid load key, '%s'.",
4865 "c", s[0]);
4866 return NULL;
4867 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 break;
4870 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 if ((err = PyErr_Occurred())) {
4873 if (err == PyExc_EOFError) {
4874 PyErr_SetNone(PyExc_EOFError);
4875 }
4876 return NULL;
4877 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 PDATA_POP(self->stack, val);
4880 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004881}
Tim Peters84e87f32001-03-17 04:50:51 +00004882
Guido van Rossum60456fd1997-04-09 17:36:32 +00004883
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004884/* No-load functions to support noload, which is used to
4885 find persistent references. */
4886
4887static int
Tim Peterscba30e22003-02-01 06:24:36 +00004888noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889{
4890 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 if ((i = marker(self)) < 0) return -1;
4893 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004894}
4895
4896
4897static int
Tim Peterscba30e22003-02-01 06:24:36 +00004898noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004899{
4900 int i;
4901 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903 if ((i = marker(self)) < 0) return -1;
4904 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004905 if (self->readline_func(self, &s) < 0) return -1;
4906 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004907 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004909}
4910
4911static int
Tim Peterseab7db32003-02-13 18:24:14 +00004912noload_newobj(Unpicklerobject *self)
4913{
4914 PyObject *obj;
4915
4916 PDATA_POP(self->stack, obj); /* pop argtuple */
4917 if (obj == NULL) return -1;
4918 Py_DECREF(obj);
4919
4920 PDATA_POP(self->stack, obj); /* pop cls */
4921 if (obj == NULL) return -1;
4922 Py_DECREF(obj);
4923
4924 PDATA_APPEND(self->stack, Py_None, -1);
4925 return 0;
4926}
4927
4928static int
Tim Peterscba30e22003-02-01 06:24:36 +00004929noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930{
4931 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004932
Tim Peters0bc93f52003-02-02 18:29:33 +00004933 if (self->readline_func(self, &s) < 0) return -1;
4934 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 PDATA_APPEND(self->stack, Py_None,-1);
4936 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004937}
4938
4939static int
Tim Peterscba30e22003-02-01 06:24:36 +00004940noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 if (self->stack->length < 2) return stackUnderflow();
4944 Pdata_clear(self->stack, self->stack->length-2);
4945 PDATA_APPEND(self->stack, Py_None,-1);
4946 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004947}
4948
4949static int
4950noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004951
Guido van Rossum053b8df1998-11-25 16:18:00 +00004952 if (self->stack->length < 1) return stackUnderflow();
4953 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004954 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955}
4956
Tim Peters2d629652003-02-04 05:06:17 +00004957static int
4958noload_extension(Unpicklerobject *self, int nbytes)
4959{
4960 char *codebytes;
4961
4962 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4963 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4964 PDATA_APPEND(self->stack, Py_None, -1);
4965 return 0;
4966}
4967
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968
4969static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004970noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971{
4972 PyObject *err = 0, *val = 0;
4973 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975 self->num_marks = 0;
4976 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004979 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004980 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 switch (s[0]) {
4983 case NONE:
4984 if (load_none(self) < 0)
4985 break;
4986 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988 case BININT:
4989 if (load_binint(self) < 0)
4990 break;
4991 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993 case BININT1:
4994 if (load_binint1(self) < 0)
4995 break;
4996 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 case BININT2:
4999 if (load_binint2(self) < 0)
5000 break;
5001 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 case INT:
5004 if (load_int(self) < 0)
5005 break;
5006 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 case LONG:
5009 if (load_long(self) < 0)
5010 break;
5011 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005012
Tim Peters4190fb82003-02-02 16:09:05 +00005013 case LONG1:
5014 if (load_counted_long(self, 1) < 0)
5015 break;
5016 continue;
5017
5018 case LONG4:
5019 if (load_counted_long(self, 4) < 0)
5020 break;
5021 continue;
5022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 case FLOAT:
5024 if (load_float(self) < 0)
5025 break;
5026 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005028 case BINFLOAT:
5029 if (load_binfloat(self) < 0)
5030 break;
5031 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 case BINSTRING:
5034 if (load_binstring(self) < 0)
5035 break;
5036 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 case SHORT_BINSTRING:
5039 if (load_short_binstring(self) < 0)
5040 break;
5041 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005043 case STRING:
5044 if (load_string(self) < 0)
5045 break;
5046 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005047
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005048#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005049 case UNICODE:
5050 if (load_unicode(self) < 0)
5051 break;
5052 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 case BINUNICODE:
5055 if (load_binunicode(self) < 0)
5056 break;
5057 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005058#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005060 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005061 if (load_counted_tuple(self, 0) < 0)
5062 break;
5063 continue;
5064
5065 case TUPLE1:
5066 if (load_counted_tuple(self, 1) < 0)
5067 break;
5068 continue;
5069
5070 case TUPLE2:
5071 if (load_counted_tuple(self, 2) < 0)
5072 break;
5073 continue;
5074
5075 case TUPLE3:
5076 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005077 break;
5078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005080 case TUPLE:
5081 if (load_tuple(self) < 0)
5082 break;
5083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 case EMPTY_LIST:
5086 if (load_empty_list(self) < 0)
5087 break;
5088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005090 case LIST:
5091 if (load_list(self) < 0)
5092 break;
5093 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 case EMPTY_DICT:
5096 if (load_empty_dict(self) < 0)
5097 break;
5098 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 case DICT:
5101 if (load_dict(self) < 0)
5102 break;
5103 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005105 case OBJ:
5106 if (noload_obj(self) < 0)
5107 break;
5108 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005110 case INST:
5111 if (noload_inst(self) < 0)
5112 break;
5113 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005114
Tim Peterseab7db32003-02-13 18:24:14 +00005115 case NEWOBJ:
5116 if (noload_newobj(self) < 0)
5117 break;
5118 continue;
5119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005120 case GLOBAL:
5121 if (noload_global(self) < 0)
5122 break;
5123 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 case APPEND:
5126 if (load_append(self) < 0)
5127 break;
5128 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130 case APPENDS:
5131 if (load_appends(self) < 0)
5132 break;
5133 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 case BUILD:
5136 if (noload_build(self) < 0)
5137 break;
5138 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005140 case DUP:
5141 if (load_dup(self) < 0)
5142 break;
5143 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005145 case BINGET:
5146 if (load_binget(self) < 0)
5147 break;
5148 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005150 case LONG_BINGET:
5151 if (load_long_binget(self) < 0)
5152 break;
5153 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155 case GET:
5156 if (load_get(self) < 0)
5157 break;
5158 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005159
Tim Peters2d629652003-02-04 05:06:17 +00005160 case EXT1:
5161 if (noload_extension(self, 1) < 0)
5162 break;
5163 continue;
5164
5165 case EXT2:
5166 if (noload_extension(self, 2) < 0)
5167 break;
5168 continue;
5169
5170 case EXT4:
5171 if (noload_extension(self, 4) < 0)
5172 break;
5173 continue;
5174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 case MARK:
5176 if (load_mark(self) < 0)
5177 break;
5178 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005180 case BINPUT:
5181 if (load_binput(self) < 0)
5182 break;
5183 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 case LONG_BINPUT:
5186 if (load_long_binput(self) < 0)
5187 break;
5188 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005190 case PUT:
5191 if (load_put(self) < 0)
5192 break;
5193 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 case POP:
5196 if (load_pop(self) < 0)
5197 break;
5198 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 case POP_MARK:
5201 if (load_pop_mark(self) < 0)
5202 break;
5203 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 case SETITEM:
5206 if (load_setitem(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 SETITEMS:
5211 if (load_setitems(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 STOP:
5216 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005218 case PERSID:
5219 if (load_persid(self) < 0)
5220 break;
5221 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005223 case BINPERSID:
5224 if (load_binpersid(self) < 0)
5225 break;
5226 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228 case REDUCE:
5229 if (noload_reduce(self) < 0)
5230 break;
5231 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005232
Tim Peters4190fb82003-02-02 16:09:05 +00005233 case PROTO:
5234 if (load_proto(self) < 0)
5235 break;
5236 continue;
5237
Tim Peters3c67d792003-02-02 17:59:11 +00005238 case NEWTRUE:
5239 if (load_bool(self, Py_True) < 0)
5240 break;
5241 continue;
5242
5243 case NEWFALSE:
5244 if (load_bool(self, Py_False) < 0)
5245 break;
5246 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005247 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005248 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249 "invalid load key, '%s'.",
5250 "c", s[0]);
5251 return NULL;
5252 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 break;
5255 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005257 if ((err = PyErr_Occurred())) {
5258 if (err == PyExc_EOFError) {
5259 PyErr_SetNone(PyExc_EOFError);
5260 }
5261 return NULL;
5262 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005264 PDATA_POP(self->stack, val);
5265 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005266}
Tim Peters84e87f32001-03-17 04:50:51 +00005267
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005268
Guido van Rossum60456fd1997-04-09 17:36:32 +00005269static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005270Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005271{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005272 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005273}
5274
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005275static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005276Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005277{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005278 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005279}
5280
Guido van Rossum60456fd1997-04-09 17:36:32 +00005281
5282static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005283 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005284 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005285 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005286 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005287 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005288 "noload() -- not load a pickle, but go through most of the motions\n"
5289 "\n"
5290 "This function can be used to read past a pickle without instantiating\n"
5291 "any objects or importing any modules. It can also be used to find all\n"
5292 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005293 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005294 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005295 {NULL, NULL} /* sentinel */
5296};
5297
5298
5299static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005300newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301{
5302 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005303
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005304 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005305 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005307 self->file = NULL;
5308 self->arg = NULL;
5309 self->stack = (Pdata*)Pdata_New();
5310 self->pers_func = NULL;
5311 self->last_string = NULL;
5312 self->marks = NULL;
5313 self->num_marks = 0;
5314 self->marks_size = 0;
5315 self->buf_size = 0;
5316 self->read = NULL;
5317 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005318 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005319
Tim Peterscba30e22003-02-01 06:24:36 +00005320 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005321 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005322
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005323 if (!self->stack)
5324 goto err;
5325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 Py_INCREF(f);
5327 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 /* Set read, readline based on type of f */
5330 if (PyFile_Check(f)) {
5331 self->fp = PyFile_AsFile(f);
5332 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005333 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005334 "I/O operation on closed file");
5335 goto err;
5336 }
5337 self->read_func = read_file;
5338 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005339 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005340 else if (PycStringIO_InputCheck(f)) {
5341 self->fp = NULL;
5342 self->read_func = read_cStringIO;
5343 self->readline_func = readline_cStringIO;
5344 }
5345 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005347 self->fp = NULL;
5348 self->read_func = read_other;
5349 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5352 (self->read = PyObject_GetAttr(f, read_str)))) {
5353 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005354 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355 "argument must have 'read' and "
5356 "'readline' attributes" );
5357 goto err;
5358 }
5359 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005360 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005362 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005364 err:
5365 Py_DECREF((PyObject *)self);
5366 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005367}
5368
5369
5370static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005371get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005372{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005374}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005375
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005376
Guido van Rossum60456fd1997-04-09 17:36:32 +00005377static void
Tim Peterscba30e22003-02-01 06:24:36 +00005378Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005380 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005381 Py_XDECREF(self->readline);
5382 Py_XDECREF(self->read);
5383 Py_XDECREF(self->file);
5384 Py_XDECREF(self->memo);
5385 Py_XDECREF(self->stack);
5386 Py_XDECREF(self->pers_func);
5387 Py_XDECREF(self->arg);
5388 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005389 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 if (self->marks) {
5392 free(self->marks);
5393 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395 if (self->buf_size) {
5396 free(self->buf);
5397 }
Tim Peters84e87f32001-03-17 04:50:51 +00005398
Christian Heimese93237d2007-12-19 02:37:44 +00005399 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005400}
5401
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005402static int
5403Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5404{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005405 Py_VISIT(self->readline);
5406 Py_VISIT(self->read);
5407 Py_VISIT(self->file);
5408 Py_VISIT(self->memo);
5409 Py_VISIT(self->stack);
5410 Py_VISIT(self->pers_func);
5411 Py_VISIT(self->arg);
5412 Py_VISIT(self->last_string);
5413 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005414 return 0;
5415}
5416
5417static int
5418Unpickler_clear(Unpicklerobject *self)
5419{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005420 Py_CLEAR(self->readline);
5421 Py_CLEAR(self->read);
5422 Py_CLEAR(self->file);
5423 Py_CLEAR(self->memo);
5424 Py_CLEAR(self->stack);
5425 Py_CLEAR(self->pers_func);
5426 Py_CLEAR(self->arg);
5427 Py_CLEAR(self->last_string);
5428 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005429 return 0;
5430}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005431
5432static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005433Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005434{
5435 if (!strcmp(name, "persistent_load")) {
5436 if (!self->pers_func) {
5437 PyErr_SetString(PyExc_AttributeError, name);
5438 return NULL;
5439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005441 Py_INCREF(self->pers_func);
5442 return self->pers_func;
5443 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005445 if (!strcmp(name, "find_global")) {
5446 if (!self->find_class) {
5447 PyErr_SetString(PyExc_AttributeError, name);
5448 return NULL;
5449 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 Py_INCREF(self->find_class);
5452 return self->find_class;
5453 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005455 if (!strcmp(name, "memo")) {
5456 if (!self->memo) {
5457 PyErr_SetString(PyExc_AttributeError, name);
5458 return NULL;
5459 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 Py_INCREF(self->memo);
5462 return self->memo;
5463 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 if (!strcmp(name, "UnpicklingError")) {
5466 Py_INCREF(UnpicklingError);
5467 return UnpicklingError;
5468 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005471}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005472
Guido van Rossum60456fd1997-04-09 17:36:32 +00005473
5474static int
Tim Peterscba30e22003-02-01 06:24:36 +00005475Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005476{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005478 if (!strcmp(name, "persistent_load")) {
5479 Py_XDECREF(self->pers_func);
5480 self->pers_func = value;
5481 Py_XINCREF(value);
5482 return 0;
5483 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 if (!strcmp(name, "find_global")) {
5486 Py_XDECREF(self->find_class);
5487 self->find_class = value;
5488 Py_XINCREF(value);
5489 return 0;
5490 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005492 if (! value) {
5493 PyErr_SetString(PyExc_TypeError,
5494 "attribute deletion is not supported");
5495 return -1;
5496 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 if (strcmp(name, "memo") == 0) {
5499 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005500 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005501 "memo must be a dictionary");
5502 return -1;
5503 }
5504 Py_XDECREF(self->memo);
5505 self->memo = value;
5506 Py_INCREF(value);
5507 return 0;
5508 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005510 PyErr_SetString(PyExc_AttributeError, name);
5511 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005512}
5513
Tim Peters5bd2a792003-02-01 16:45:06 +00005514/* ---------------------------------------------------------------------------
5515 * Module-level functions.
5516 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005517
Martin v. Löwis544f1192004-07-27 05:22:33 +00005518/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005519static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005520cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005521{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005522 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005523 PyObject *ob, *file, *res = NULL;
5524 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005525 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005526
Martin v. Löwis544f1192004-07-27 05:22:33 +00005527 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5528 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005529 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005530
Tim Peters5bd2a792003-02-01 16:45:06 +00005531 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005532 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 if (dump(pickler, ob) < 0)
5535 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005537 Py_INCREF(Py_None);
5538 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005540 finally:
5541 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005543 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005544}
5545
5546
Martin v. Löwis544f1192004-07-27 05:22:33 +00005547/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005548static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005549cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005550{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005551 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005552 PyObject *ob, *file = 0, *res = NULL;
5553 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005554 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005555
Martin v. Löwis544f1192004-07-27 05:22:33 +00005556 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5557 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005558 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005559
Tim Peterscba30e22003-02-01 06:24:36 +00005560 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005561 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005562
Tim Peters5bd2a792003-02-01 16:45:06 +00005563 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005564 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005566 if (dump(pickler, ob) < 0)
5567 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005569 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005571 finally:
5572 Py_XDECREF(pickler);
5573 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005575 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005576}
5577
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005578
Tim Peters5bd2a792003-02-01 16:45:06 +00005579/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005580static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005581cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005582{
5583 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005584 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005585
Tim Peterscba30e22003-02-01 06:24:36 +00005586 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005587 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005589 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005591 finally:
5592 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005594 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005595}
5596
5597
Tim Peters5bd2a792003-02-01 16:45:06 +00005598/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005599static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005600cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005601{
5602 PyObject *ob, *file = 0, *res = NULL;
5603 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005604
Tim Peterscba30e22003-02-01 06:24:36 +00005605 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005606 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005607
Tim Peterscba30e22003-02-01 06:24:36 +00005608 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005609 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005610
Tim Peterscba30e22003-02-01 06:24:36 +00005611 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005612 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005614 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005616 finally:
5617 Py_XDECREF(file);
5618 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005620 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005621}
5622
5623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005624PyDoc_STRVAR(Unpicklertype__doc__,
5625"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005626
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005627static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005628 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005629 "cPickle.Unpickler", /*tp_name*/
5630 sizeof(Unpicklerobject), /*tp_basicsize*/
5631 0,
5632 (destructor)Unpickler_dealloc, /* tp_dealloc */
5633 0, /* tp_print */
5634 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5635 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5636 0, /* tp_compare */
5637 0, /* tp_repr */
5638 0, /* tp_as_number */
5639 0, /* tp_as_sequence */
5640 0, /* tp_as_mapping */
5641 0, /* tp_hash */
5642 0, /* tp_call */
5643 0, /* tp_str */
5644 0, /* tp_getattro */
5645 0, /* tp_setattro */
5646 0, /* tp_as_buffer */
5647 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5648 Unpicklertype__doc__, /* tp_doc */
5649 (traverseproc)Unpickler_traverse, /* tp_traverse */
5650 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005651};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005652
Guido van Rossum60456fd1997-04-09 17:36:32 +00005653static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005654 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5655 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005656 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005657 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005658 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005659 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005660
Martin v. Löwis544f1192004-07-27 05:22:33 +00005661 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5662 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005663 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005664 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005665 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005666 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005667
Georg Brandl96a8c392006-05-29 21:04:52 +00005668 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005669 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005670
Neal Norwitzb0493252002-03-31 14:44:22 +00005671 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005672 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005673
Martin v. Löwis544f1192004-07-27 05:22:33 +00005674 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5675 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005676 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005677 "This takes a file-like object for writing a pickle data stream.\n"
5678 "The optional proto argument tells the pickler to use the given\n"
5679 "protocol; supported protocols are 0, 1, 2. The default\n"
5680 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5681 "only protocol that can be written to a file opened in text\n"
5682 "mode and read back successfully. When using a protocol higher\n"
5683 "than 0, make sure the file is opened in binary mode, both when\n"
5684 "pickling and unpickling.)\n"
5685 "\n"
5686 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5687 "more efficient than protocol 1.\n"
5688 "\n"
5689 "Specifying a negative protocol version selects the highest\n"
5690 "protocol version supported. The higher the protocol used, the\n"
5691 "more recent the version of Python needed to read the pickle\n"
5692 "produced.\n"
5693 "\n"
5694 "The file parameter must have a write() method that accepts a single\n"
5695 "string argument. It can thus be an open file object, a StringIO\n"
5696 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005697 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005698
Georg Brandl96a8c392006-05-29 21:04:52 +00005699 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005700 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5701
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005702 { NULL, NULL }
5703};
5704
Guido van Rossum60456fd1997-04-09 17:36:32 +00005705static int
Tim Peterscba30e22003-02-01 06:24:36 +00005706init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005707{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005708 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005709
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005710#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005711
Tim Peters3cfe7542003-05-21 21:29:48 +00005712 if (PyType_Ready(&Unpicklertype) < 0)
5713 return -1;
5714 if (PyType_Ready(&Picklertype) < 0)
5715 return -1;
5716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005717 INIT_STR(__class__);
5718 INIT_STR(__getinitargs__);
5719 INIT_STR(__dict__);
5720 INIT_STR(__getstate__);
5721 INIT_STR(__setstate__);
5722 INIT_STR(__name__);
5723 INIT_STR(__main__);
5724 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005725 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005726 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 INIT_STR(append);
5728 INIT_STR(read);
5729 INIT_STR(readline);
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005730 INIT_STR(copyreg);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005732
Georg Brandldffbf5f2008-05-20 07:49:57 +00005733 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005734 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005735
Tim Peters1f1b2d22003-02-01 02:16:37 +00005736 /* This is special because we want to use a different
5737 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005738 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005739 if (!dispatch_table) return -1;
5740
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005741 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005742 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005743 if (!extension_registry) return -1;
5744
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005745 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005746 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005747 if (!inverted_registry) return -1;
5748
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005749 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005750 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005751 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005752
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005753 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005754
Tim Peters731098b2003-02-04 20:56:09 +00005755 if (!(empty_tuple = PyTuple_New(0)))
5756 return -1;
5757
5758 two_tuple = PyTuple_New(2);
5759 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005760 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005761 /* We use this temp container with no regard to refcounts, or to
5762 * keeping containees alive. Exempt from GC, because we don't
5763 * want anything looking at two_tuple() by magic.
5764 */
5765 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005767 /* Ugh */
5768 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5769 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5770 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005772 if (!( t=PyDict_New())) return -1;
5773 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005774 "def __str__(self):\n"
5775 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5776 Py_file_input,
5777 module_dict, t) )) return -1;
5778 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005780 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005781 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005782 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005784 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005785
Tim Peterscba30e22003-02-01 06:24:36 +00005786 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005787 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005788 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005789 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005791 if (!( t=PyDict_New())) return -1;
5792 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005793 "def __str__(self):\n"
5794 " a=self.args\n"
5795 " a=a and type(a[0]) or '(what)'\n"
5796 " return 'Cannot pickle %s objects' % a\n"
5797 , Py_file_input,
5798 module_dict, t) )) return -1;
5799 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005801 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005802 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005803 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005805 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005807 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005808 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005809 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005810
Martin v. Löwis658009a2002-09-16 17:26:24 +00005811 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5812 UnpicklingError, NULL)))
5813 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005815 if (PyDict_SetItemString(module_dict, "PickleError",
5816 PickleError) < 0)
5817 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005819 if (PyDict_SetItemString(module_dict, "PicklingError",
5820 PicklingError) < 0)
5821 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005823 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5824 UnpicklingError) < 0)
5825 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005827 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5828 UnpickleableError) < 0)
5829 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005831 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5832 BadPickleGet) < 0)
5833 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005835 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005837 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005838}
5839
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005840#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5841#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005842#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005843PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005844initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005845{
5846 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005847 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005848 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005849 PyObject *format_version;
5850 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005851
Alexandre Vassalotti3c4971c2008-05-16 19:14:31 +00005852 /* XXX: Should mention that the pickle module will include the C
5853 XXX: optimized implementation automatically. */
5854 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5855 "Python 3.0", 2) < 0)
5856 return;
5857
Christian Heimese93237d2007-12-19 02:37:44 +00005858 Py_TYPE(&Picklertype) = &PyType_Type;
5859 Py_TYPE(&Unpicklertype) = &PyType_Type;
5860 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005862 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005863 * so we're forced to use a temporary dictionary. :(
5864 */
5865 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005866 if (!di) return;
5867 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005869 /* Create the module and add the functions */
5870 m = Py_InitModule4("cPickle", cPickle_methods,
5871 cPickle_module_documentation,
5872 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005873 if (m == NULL)
5874 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005876 /* Add some symbolic constants to the module */
5877 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005878 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005879 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005880 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005882 /* Copy data from di. Waaa. */
5883 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5884 if (PyObject_SetItem(d, k, v) < 0) {
5885 Py_DECREF(di);
5886 return;
5887 }
5888 }
5889 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005890
Tim Peters8587b3c2003-02-13 15:44:41 +00005891 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5892 if (i < 0)
5893 return;
5894
Tim Peters5b7da392003-02-04 00:21:07 +00005895 /* These are purely informational; no code uses them. */
5896 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005897 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00005898 /* Format versions we can read. */
5899 compatible_formats = Py_BuildValue("[sssss]",
5900 "1.0", /* Original protocol 0 */
5901 "1.1", /* Protocol 0 + INST */
5902 "1.2", /* Original protocol 1 */
5903 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005904 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005905 PyDict_SetItemString(d, "format_version", format_version);
5906 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5907 Py_XDECREF(format_version);
5908 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005909}