blob: 486e86fc125484227b9d24fa9e8895424c1d3591 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
Martin v. Löwis9ac49272009-01-02 20:40:14 +000021 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
22 * all headers have already been included here, we can safely redefine it.
23 */
24#ifdef UNICODE
25# undef UNICODE
26#endif
27
28/*
Tim Peters797ec242003-02-01 06:22:36 +000029 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
30 * docs are in pickletools.py.
31 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000032#define MARK '('
33#define STOP '.'
34#define POP '0'
35#define POP_MARK '1'
36#define DUP '2'
37#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000038#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000039#define INT 'I'
40#define BININT 'J'
41#define BININT1 'K'
42#define LONG 'L'
43#define BININT2 'M'
44#define NONE 'N'
45#define PERSID 'P'
46#define BINPERSID 'Q'
47#define REDUCE 'R'
48#define STRING 'S'
49#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000050#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000051#define UNICODE 'V'
52#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000053#define APPEND 'a'
54#define BUILD 'b'
55#define GLOBAL 'c'
56#define DICT 'd'
57#define EMPTY_DICT '}'
58#define APPENDS 'e'
59#define GET 'g'
60#define BINGET 'h'
61#define INST 'i'
62#define LONG_BINGET 'j'
63#define LIST 'l'
64#define EMPTY_LIST ']'
65#define OBJ 'o'
66#define PUT 'p'
67#define BINPUT 'q'
68#define LONG_BINPUT 'r'
69#define SETITEM 's'
70#define TUPLE 't'
71#define EMPTY_TUPLE ')'
72#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000073
74/* Protocol 2. */
75#define PROTO '\x80' /* identify pickle protocol */
76#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
77#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
78#define EXT2 '\x83' /* ditto, but 2-byte index */
79#define EXT4 '\x84' /* ditto, but 4-byte index */
80#define TUPLE1 '\x85' /* build 1-tuple from stack top */
81#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
82#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
83#define NEWTRUE '\x88' /* push True */
84#define NEWFALSE '\x89' /* push False */
85#define LONG1 '\x8a' /* push long from < 256 bytes */
86#define LONG4 '\x8b' /* push really big long */
87
88/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
89 * so that unpicklers written before bools were introduced unpickle them
90 * as ints, but unpicklers after can recognize that bools were intended.
91 * Note that protocol 2 added direct ways to pickle bools.
92 */
Jack Jansen3a967022002-06-26 20:40:42 +000093#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000094#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000095#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000096#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000097
Tim Peters1092d642003-02-11 21:06:20 +000098/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000099 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
100 * break if this gets out of synch with pickle.py, but it's unclear that
101 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +0000102 */
103#define BATCHSIZE 1000
104
Guido van Rossum60456fd1997-04-09 17:36:32 +0000105static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000106
Guido van Rossumc03158b1999-06-09 15:23:31 +0000107static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000108static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000109static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000110static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111static PyObject *BadPickleGet;
112
Tim Peters5b7da392003-02-04 00:21:07 +0000113/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000114static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000115
Georg Brandldffbf5f2008-05-20 07:49:57 +0000116/* copy_reg.dispatch_table, {type_object: pickling_function} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *dispatch_table;
118
119/* For EXT[124] opcodes. */
Georg Brandldffbf5f2008-05-20 07:49:57 +0000120/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000121static PyObject *extension_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000122/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000123static PyObject *inverted_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000124/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000125static PyObject *extension_cache;
126
Georg Brandldffbf5f2008-05-20 07:49:57 +0000127/* For looking up name pairs in copy_reg._extension_registry. */
Tim Peters731098b2003-02-04 20:56:09 +0000128static PyObject *two_tuple;
129
Guido van Rossum60456fd1997-04-09 17:36:32 +0000130static PyObject *__class___str, *__getinitargs___str, *__dict___str,
131 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000132 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000133 *write_str, *append_str,
Neal Norwitzb183a252006-04-10 01:03:32 +0000134 *read_str, *readline_str, *__main___str,
Alexandre 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;
Eric Smith068f0652009-04-25 21:40:15 +00001169 _PyOS_double_to_string(c_str + 1, sizeof(c_str) - 2, x, 'g',
1170 17, 0, NULL);
Georg Brandlde9b6242006-04-30 11:13:56 +00001171 /* Extend the formatted string with a newline character */
1172 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Tim Peters0bc93f52003-02-02 18:29:33 +00001174 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 return -1;
1176 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179}
1180
1181
1182static int
Tim Peterscba30e22003-02-01 06:24:36 +00001183save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184{
1185 int size, len;
1186 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001188 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 if (!self->bin) {
1192 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peterscba30e22003-02-01 06:24:36 +00001196 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001199 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001201 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Tim Peters0bc93f52003-02-02 18:29:33 +00001203 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Tim Peters0bc93f52003-02-02 18:29:33 +00001206 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Tim Peters0bc93f52003-02-02 18:29:33 +00001209 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 Py_XDECREF(repr);
1213 }
1214 else {
1215 int i;
1216 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001218 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (size < 256) {
1222 c_str[0] = SHORT_BINSTRING;
1223 c_str[1] = size;
1224 len = 2;
1225 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001226 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 c_str[0] = BINSTRING;
1228 for (i = 1; i < 5; i++)
1229 c_str[i] = (int)(size >> ((i - 1) * 8));
1230 len = 5;
1231 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001232 else
1233 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Tim Peters0bc93f52003-02-02 18:29:33 +00001235 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 if (size > 128 && Pdata_Check(self->file)) {
1239 if (write_other(self, NULL, 0) < 0) return -1;
1240 PDATA_APPEND(self->file, args, -1);
1241 }
1242 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001243 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001244 PyString_AS_STRING(
1245 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001246 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 return -1;
1248 }
1249 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 if (doput)
1252 if (put(self, args) < 0)
1253 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 err:
1258 Py_XDECREF(repr);
1259 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260}
1261
1262
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001264/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1265 backslash and newline characters to \uXXXX escapes. */
1266static PyObject *
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001267modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268{
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001269 PyObject *repr;
1270 char *p;
1271 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001272
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001273 static const char *hexdigit = "0123456789abcdef";
1274#ifdef Py_UNICODE_WIDE
1275 const Py_ssize_t expandsize = 10;
1276#else
1277 const Py_ssize_t expandsize = 6;
1278#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001279
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001280 if (size > PY_SSIZE_T_MAX / expandsize)
1281 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001283 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1284 if (repr == NULL)
1285 return NULL;
1286 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001287 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001289 p = q = PyString_AS_STRING(repr);
1290 while (size-- > 0) {
1291 Py_UNICODE ch = *s++;
1292#ifdef Py_UNICODE_WIDE
1293 /* Map 32-bit characters to '\Uxxxxxxxx' */
1294 if (ch >= 0x10000) {
1295 *p++ = '\\';
1296 *p++ = 'U';
1297 *p++ = hexdigit[(ch >> 28) & 0xf];
1298 *p++ = hexdigit[(ch >> 24) & 0xf];
1299 *p++ = hexdigit[(ch >> 20) & 0xf];
1300 *p++ = hexdigit[(ch >> 16) & 0xf];
1301 *p++ = hexdigit[(ch >> 12) & 0xf];
1302 *p++ = hexdigit[(ch >> 8) & 0xf];
1303 *p++ = hexdigit[(ch >> 4) & 0xf];
1304 *p++ = hexdigit[ch & 15];
1305 }
1306 else
1307#else
1308 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1309 if (ch >= 0xD800 && ch < 0xDC00) {
1310 Py_UNICODE ch2;
1311 Py_UCS4 ucs;
1312
1313 ch2 = *s++;
1314 size--;
1315 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1316 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1317 *p++ = '\\';
1318 *p++ = 'U';
1319 *p++ = hexdigit[(ucs >> 28) & 0xf];
1320 *p++ = hexdigit[(ucs >> 24) & 0xf];
1321 *p++ = hexdigit[(ucs >> 20) & 0xf];
1322 *p++ = hexdigit[(ucs >> 16) & 0xf];
1323 *p++ = hexdigit[(ucs >> 12) & 0xf];
1324 *p++ = hexdigit[(ucs >> 8) & 0xf];
1325 *p++ = hexdigit[(ucs >> 4) & 0xf];
1326 *p++ = hexdigit[ucs & 0xf];
1327 continue;
1328 }
1329 /* Fall through: isolated surrogates are copied as-is */
1330 s--;
1331 size++;
1332 }
1333#endif
1334 /* Map 16-bit characters to '\uxxxx' */
1335 if (ch >= 256 || ch == '\\' || ch == '\n') {
1336 *p++ = '\\';
1337 *p++ = 'u';
1338 *p++ = hexdigit[(ch >> 12) & 0xf];
1339 *p++ = hexdigit[(ch >> 8) & 0xf];
1340 *p++ = hexdigit[(ch >> 4) & 0xf];
1341 *p++ = hexdigit[ch & 15];
1342 }
1343 /* Copy everything else as-is */
1344 else
1345 *p++ = (char) ch;
1346 }
1347 *p = '\0';
1348 _PyString_Resize(&repr, p - q);
1349 return repr;
1350}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001351
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352static int
Tim Peterscba30e22003-02-01 06:24:36 +00001353save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001354{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001355 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if (!PyUnicode_Check(args))
1359 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if (!self->bin) {
1362 char *repr_str;
1363 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 repr = modified_EncodeRawUnicodeEscape(
1366 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001367 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001370 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001372 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Tim Peters0bc93f52003-02-02 18:29:33 +00001374 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Tim Peters0bc93f52003-02-02 18:29:33 +00001377 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001379
Tim Peters0bc93f52003-02-02 18:29:33 +00001380 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 Py_XDECREF(repr);
1384 }
1385 else {
1386 int i;
1387 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001388
Tim Peterscba30e22003-02-01 06:24:36 +00001389 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001391
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001392 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001394 if (size > INT_MAX)
1395 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 c_str[0] = BINUNICODE;
1398 for (i = 1; i < 5; i++)
1399 c_str[i] = (int)(size >> ((i - 1) * 8));
1400 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001401
Tim Peters0bc93f52003-02-02 18:29:33 +00001402 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 if (size > 128 && Pdata_Check(self->file)) {
1406 if (write_other(self, NULL, 0) < 0)
1407 goto err;
1408 PDATA_APPEND(self->file, repr, -1);
1409 }
1410 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001411 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001412 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 goto err;
1414 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 Py_DECREF(repr);
1417 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if (doput)
1420 if (put(self, args) < 0)
1421 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 err:
1426 Py_XDECREF(repr);
1427 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001429#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001430
Tim Peters1d63c9f2003-02-02 20:29:39 +00001431/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1432static int
Tim Peters67920142003-02-05 03:46:17 +00001433store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001434{
1435 int i;
1436 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001437
Tim Peters1d63c9f2003-02-02 20:29:39 +00001438 assert(PyTuple_Size(t) == len);
1439
1440 for (i = 0; i < len; i++) {
1441 PyObject *element = PyTuple_GET_ITEM(t, i);
1442
1443 if (element == NULL)
1444 goto finally;
1445 if (save(self, element, 0) < 0)
1446 goto finally;
1447 }
1448 res = 0;
1449
1450 finally:
1451 return res;
1452}
1453
1454/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1455 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001456 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 * (a tuple can be reached from itself), and that requires some subtle
1458 * magic so that it works in all cases. IOW, this is a long routine.
1459 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001460static int
Tim Peterscba30e22003-02-01 06:24:36 +00001461save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001463 PyObject *py_tuple_id = NULL;
1464 int len, i;
1465 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001468 static char pop = POP;
1469 static char pop_mark = POP_MARK;
1470 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if ((len = PyTuple_Size(args)) < 0)
1473 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001474
Tim Peters1d63c9f2003-02-02 20:29:39 +00001475 if (len == 0) {
1476 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001477
Tim Peters1d63c9f2003-02-02 20:29:39 +00001478 if (self->proto) {
1479 c_str[0] = EMPTY_TUPLE;
1480 len = 1;
1481 }
1482 else {
1483 c_str[0] = MARK;
1484 c_str[1] = TUPLE;
1485 len = 2;
1486 }
1487 if (self->write_func(self, c_str, len) >= 0)
1488 res = 0;
1489 /* Don't memoize an empty tuple. */
1490 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Tim Peters1d63c9f2003-02-02 20:29:39 +00001493 /* A non-empty tuple. */
1494
1495 /* id(tuple) isn't in the memo now. If it shows up there after
1496 * saving the tuple elements, the tuple must be recursive, in
1497 * which case we'll pop everything we put on the stack, and fetch
1498 * its value from the memo.
1499 */
1500 py_tuple_id = PyLong_FromVoidPtr(args);
1501 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503
Tim Peters1d63c9f2003-02-02 20:29:39 +00001504 if (len <= 3 && self->proto >= 2) {
1505 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001506 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001507 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001509 /* pop the len elements */
1510 for (i = 0; i < len; ++i)
1511 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001514 if (get(self, py_tuple_id) < 0)
1515 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 res = 0;
1517 goto finally;
1518 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001519 /* Not recursive. */
1520 if (self->write_func(self, len2opcode + len, 1) < 0)
1521 goto finally;
1522 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001524
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1526 * Generate MARK elt1 elt2 ... TUPLE
1527 */
1528 if (self->write_func(self, &MARKv, 1) < 0)
1529 goto finally;
1530
Tim Peters67920142003-02-05 03:46:17 +00001531 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001532 goto finally;
1533
1534 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1535 /* pop the stack stuff we pushed */
1536 if (self->bin) {
1537 if (self->write_func(self, &pop_mark, 1) < 0)
1538 goto finally;
1539 }
1540 else {
1541 /* Note that we pop one more than len, to remove
1542 * the MARK too.
1543 */
1544 for (i = 0; i <= len; i++)
1545 if (self->write_func(self, &pop, 1) < 0)
1546 goto finally;
1547 }
1548 /* fetch from memo */
1549 if (get(self, py_tuple_id) >= 0)
1550 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001551 goto finally;
1552 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001553
Tim Peters1d63c9f2003-02-02 20:29:39 +00001554 /* Not recursive. */
1555 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001557
Tim Peters1d63c9f2003-02-02 20:29:39 +00001558 memoize:
1559 if (put(self, args) >= 0)
1560 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 finally:
1563 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001565}
1566
Tim Peters1092d642003-02-11 21:06:20 +00001567/* iter is an iterator giving items, and we batch up chunks of
1568 * MARK item item ... item APPENDS
1569 * opcode sequences. Calling code should have arranged to first create an
1570 * empty list, or list-like object, for the APPENDS to operate on.
1571 * Returns 0 on success, <0 on error.
1572 */
1573static int
1574batch_list(Picklerobject *self, PyObject *iter)
1575{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001576 PyObject *obj = NULL;
1577 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001578 int i, n;
1579
1580 static char append = APPEND;
1581 static char appends = APPENDS;
1582
1583 assert(iter != NULL);
1584
1585 if (self->proto == 0) {
1586 /* APPENDS isn't available; do one at a time. */
1587 for (;;) {
1588 obj = PyIter_Next(iter);
1589 if (obj == NULL) {
1590 if (PyErr_Occurred())
1591 return -1;
1592 break;
1593 }
1594 i = save(self, obj, 0);
1595 Py_DECREF(obj);
1596 if (i < 0)
1597 return -1;
1598 if (self->write_func(self, &append, 1) < 0)
1599 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001600 }
1601 return 0;
1602 }
1603
1604 /* proto > 0: write in batches of BATCHSIZE. */
1605 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001606 /* Get first item */
1607 firstitem = PyIter_Next(iter);
1608 if (firstitem == NULL) {
1609 if (PyErr_Occurred())
1610 goto BatchFailed;
1611
1612 /* nothing more to add */
1613 break;
1614 }
1615
1616 /* Try to get a second item */
1617 obj = PyIter_Next(iter);
1618 if (obj == NULL) {
1619 if (PyErr_Occurred())
1620 goto BatchFailed;
1621
1622 /* Only one item to write */
1623 if (save(self, firstitem, 0) < 0)
1624 goto BatchFailed;
1625 if (self->write_func(self, &append, 1) < 0)
1626 goto BatchFailed;
1627 Py_CLEAR(firstitem);
1628 break;
1629 }
1630
1631 /* More than one item to write */
1632
1633 /* Pump out MARK, items, APPENDS. */
1634 if (self->write_func(self, &MARKv, 1) < 0)
1635 goto BatchFailed;
1636
1637 if (save(self, firstitem, 0) < 0)
1638 goto BatchFailed;
1639 Py_CLEAR(firstitem);
1640 n = 1;
1641
1642 /* Fetch and save up to BATCHSIZE items */
1643 while (obj) {
1644 if (save(self, obj, 0) < 0)
1645 goto BatchFailed;
1646 Py_CLEAR(obj);
1647 n += 1;
1648
1649 if (n == BATCHSIZE)
1650 break;
1651
Tim Peters1092d642003-02-11 21:06:20 +00001652 obj = PyIter_Next(iter);
1653 if (obj == NULL) {
1654 if (PyErr_Occurred())
1655 goto BatchFailed;
1656 break;
1657 }
Tim Peters1092d642003-02-11 21:06:20 +00001658 }
1659
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001660 if (self->write_func(self, &appends, 1) < 0)
1661 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001662
Tim Peters90975f12003-02-12 05:28:58 +00001663 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001664 return 0;
1665
1666BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001667 Py_XDECREF(firstitem);
1668 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001669 return -1;
1670}
1671
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672static int
Tim Peterscba30e22003-02-01 06:24:36 +00001673save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674{
Tim Peters1092d642003-02-11 21:06:20 +00001675 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001677 int len;
1678 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 if (self->fast && !fast_save_enter(self, args))
1681 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001682
Tim Peters1092d642003-02-11 21:06:20 +00001683 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001684 if (self->bin) {
1685 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001686 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 }
1688 else {
1689 s[0] = MARK;
1690 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001691 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Tim Peters1092d642003-02-11 21:06:20 +00001694 if (self->write_func(self, s, len) < 0)
1695 goto finally;
1696
1697 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if ((len = PyList_Size(args)) < 0)
1699 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001700
Tim Peters1092d642003-02-11 21:06:20 +00001701 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001703 if (put(self, args) >= 0)
1704 res = 0;
1705 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 }
Tim Peters90975f12003-02-12 05:28:58 +00001707 if (put2(self, args) < 0)
1708 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Tim Peters1092d642003-02-11 21:06:20 +00001710 /* Materialize the list elements. */
1711 iter = PyObject_GetIter(args);
1712 if (iter == NULL)
1713 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001714
1715 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1716 {
1717 res = batch_list(self, iter);
1718 Py_LeaveRecursiveCall();
1719 }
Tim Peters1092d642003-02-11 21:06:20 +00001720 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 finally:
1723 if (self->fast && !fast_save_leave(self, args))
1724 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727}
1728
1729
Tim Peters42f08ac2003-02-11 22:43:24 +00001730/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1731 * MARK key value ... key value SETITEMS
1732 * opcode sequences. Calling code should have arranged to first create an
1733 * empty dict, or dict-like object, for the SETITEMS to operate on.
1734 * Returns 0 on success, <0 on error.
1735 *
1736 * This is very much like batch_list(). The difference between saving
1737 * elements directly, and picking apart two-tuples, is so long-winded at
1738 * the C level, though, that attempts to combine these routines were too
1739 * ugly to bear.
1740 */
1741static int
1742batch_dict(Picklerobject *self, PyObject *iter)
1743{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001744 PyObject *p = NULL;
1745 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001746 int i, n;
1747
1748 static char setitem = SETITEM;
1749 static char setitems = SETITEMS;
1750
1751 assert(iter != NULL);
1752
1753 if (self->proto == 0) {
1754 /* SETITEMS isn't available; do one at a time. */
1755 for (;;) {
1756 p = PyIter_Next(iter);
1757 if (p == NULL) {
1758 if (PyErr_Occurred())
1759 return -1;
1760 break;
1761 }
1762 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1763 PyErr_SetString(PyExc_TypeError, "dict items "
1764 "iterator must return 2-tuples");
1765 return -1;
1766 }
1767 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1768 if (i >= 0)
1769 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1770 Py_DECREF(p);
1771 if (i < 0)
1772 return -1;
1773 if (self->write_func(self, &setitem, 1) < 0)
1774 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001775 }
1776 return 0;
1777 }
1778
1779 /* proto > 0: write in batches of BATCHSIZE. */
1780 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001781 /* Get first item */
1782 firstitem = PyIter_Next(iter);
1783 if (firstitem == NULL) {
1784 if (PyErr_Occurred())
1785 goto BatchFailed;
1786
1787 /* nothing more to add */
1788 break;
1789 }
1790 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1791 PyErr_SetString(PyExc_TypeError, "dict items "
1792 "iterator must return 2-tuples");
1793 goto BatchFailed;
1794 }
1795
1796 /* Try to get a second item */
1797 p = PyIter_Next(iter);
1798 if (p == NULL) {
1799 if (PyErr_Occurred())
1800 goto BatchFailed;
1801
1802 /* Only one item to write */
1803 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1804 goto BatchFailed;
1805 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1806 goto BatchFailed;
1807 if (self->write_func(self, &setitem, 1) < 0)
1808 goto BatchFailed;
1809 Py_CLEAR(firstitem);
1810 break;
1811 }
1812
1813 /* More than one item to write */
1814
1815 /* Pump out MARK, items, SETITEMS. */
1816 if (self->write_func(self, &MARKv, 1) < 0)
1817 goto BatchFailed;
1818
1819 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1820 goto BatchFailed;
1821 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1822 goto BatchFailed;
1823 Py_CLEAR(firstitem);
1824 n = 1;
1825
1826 /* Fetch and save up to BATCHSIZE items */
1827 while (p) {
1828 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1829 PyErr_SetString(PyExc_TypeError, "dict items "
1830 "iterator must return 2-tuples");
1831 goto BatchFailed;
1832 }
1833 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1834 goto BatchFailed;
1835 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1836 goto BatchFailed;
1837 Py_CLEAR(p);
1838 n += 1;
1839
1840 if (n == BATCHSIZE)
1841 break;
1842
Tim Peters42f08ac2003-02-11 22:43:24 +00001843 p = PyIter_Next(iter);
1844 if (p == NULL) {
1845 if (PyErr_Occurred())
1846 goto BatchFailed;
1847 break;
1848 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001849 }
1850
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001851 if (self->write_func(self, &setitems, 1) < 0)
1852 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001853
Tim Peters90975f12003-02-12 05:28:58 +00001854 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001855 return 0;
1856
1857BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001858 Py_XDECREF(firstitem);
1859 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001860 return -1;
1861}
1862
Collin Winter179bf212009-05-25 04:34:39 +00001863/* This is a variant of batch_dict() above that specializes for dicts, with no
1864 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1865 * MARK key value ... key value SETITEMS
1866 * opcode sequences. Calling code should have arranged to first create an
1867 * empty dict, or dict-like object, for the SETITEMS to operate on.
1868 * Returns 0 on success, -1 on error.
1869 *
1870 * Note that this currently doesn't work for protocol 0.
1871 */
1872static int
1873batch_dict_exact(Picklerobject *self, PyObject *obj)
1874{
1875 PyObject *key = NULL, *value = NULL;
1876 int i;
1877 Py_ssize_t dict_size, ppos = 0;
1878
1879 static char setitem = SETITEM;
1880 static char setitems = SETITEMS;
1881
1882 assert(obj != NULL);
1883 assert(self->proto > 0);
1884
1885 dict_size = PyDict_Size(obj);
1886
1887 /* Special-case len(d) == 1 to save space. */
1888 if (dict_size == 1) {
1889 PyDict_Next(obj, &ppos, &key, &value);
1890 if (save(self, key, 0) < 0)
1891 return -1;
1892 if (save(self, value, 0) < 0)
1893 return -1;
1894 if (self->write_func(self, &setitem, 1) < 0)
1895 return -1;
1896 return 0;
1897 }
1898
1899 /* Write in batches of BATCHSIZE. */
1900 do {
1901 i = 0;
1902 if (self->write_func(self, &MARKv, 1) < 0)
1903 return -1;
1904 while (PyDict_Next(obj, &ppos, &key, &value)) {
1905 if (save(self, key, 0) < 0)
1906 return -1;
1907 if (save(self, value, 0) < 0)
1908 return -1;
1909 if (++i == BATCHSIZE)
1910 break;
1911 }
1912 if (self->write_func(self, &setitems, 1) < 0)
1913 return -1;
1914 if (PyDict_Size(obj) != dict_size) {
1915 PyErr_Format(
1916 PyExc_RuntimeError,
1917 "dictionary changed size during iteration");
1918 return -1;
1919 }
1920
1921 } while (i == BATCHSIZE);
1922 return 0;
1923}
1924
Guido van Rossum60456fd1997-04-09 17:36:32 +00001925static int
Tim Peterscba30e22003-02-01 06:24:36 +00001926save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927{
Tim Peters42f08ac2003-02-11 22:43:24 +00001928 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001930 int len;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 if (self->fast && !fast_save_enter(self, args))
1933 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001934
Tim Peters42f08ac2003-02-11 22:43:24 +00001935 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if (self->bin) {
1937 s[0] = EMPTY_DICT;
1938 len = 1;
1939 }
1940 else {
1941 s[0] = MARK;
1942 s[1] = DICT;
1943 len = 2;
1944 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Tim Peters0bc93f52003-02-02 18:29:33 +00001946 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Tim Peters42f08ac2003-02-11 22:43:24 +00001949 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if ((len = PyDict_Size(args)) < 0)
1951 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001954 if (put(self, args) >= 0)
1955 res = 0;
1956 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 }
Tim Peters90975f12003-02-12 05:28:58 +00001958 if (put2(self, args) < 0)
1959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001960
Tim Peters42f08ac2003-02-11 22:43:24 +00001961 /* Materialize the dict items. */
Collin Winter179bf212009-05-25 04:34:39 +00001962 if (PyDict_CheckExact(args) && self->proto > 0) {
1963 /* We can take certain shortcuts if we know this is a dict and
1964 not a dict subclass. */
1965 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1966 res = batch_dict_exact(self, args);
1967 Py_LeaveRecursiveCall();
1968 }
1969 } else {
1970 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
1971 if (iter == NULL)
1972 goto finally;
1973 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1974 res = batch_dict(self, iter);
1975 Py_LeaveRecursiveCall();
1976 }
1977 Py_DECREF(iter);
Facundo Batista763d3092008-06-30 01:10:55 +00001978 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 finally:
1981 if (self->fast && !fast_save_leave(self, args))
1982 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001985}
1986
1987
Tim Peters84e87f32001-03-17 04:50:51 +00001988static int
Tim Peterscba30e22003-02-01 06:24:36 +00001989save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990{
1991 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1992 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1993 char *module_str, *name_str;
1994 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (self->fast && !fast_save_enter(self, args))
1999 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002000
Tim Peters0bc93f52003-02-02 18:29:33 +00002001 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Tim Peterscba30e22003-02-01 06:24:36 +00002004 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 if (self->bin) {
2008 if (save(self, class, 0) < 0)
2009 goto finally;
2010 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2013 PyObject *element = 0;
2014 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00002017 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if ((len = PyObject_Size(class_args)) < 0)
2021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00002024 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (save(self, element, 0) < 0) {
2028 Py_DECREF(element);
2029 goto finally;
2030 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 Py_DECREF(element);
2033 }
2034 }
2035 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002036 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2037 PyErr_Clear();
2038 else
2039 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 if (!self->bin) {
2043 if (!( name = ((PyClassObject *)class)->cl_name )) {
2044 PyErr_SetString(PicklingError, "class has no name");
2045 goto finally;
2046 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Tim Peterscba30e22003-02-01 06:24:36 +00002048 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002050
Tim Peters84e87f32001-03-17 04:50:51 +00002051
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002052 if ((module_size = PyString_Size(module)) < 0 ||
2053 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002055
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002056 module_str = PyString_AS_STRING((PyStringObject *)module);
2057 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058
Tim Peters0bc93f52003-02-02 18:29:33 +00002059 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Tim Peters0bc93f52003-02-02 18:29:33 +00002062 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002064
Tim Peters0bc93f52003-02-02 18:29:33 +00002065 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002067
Tim Peters0bc93f52003-02-02 18:29:33 +00002068 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002070
Tim Peters0bc93f52003-02-02 18:29:33 +00002071 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 goto finally;
2073 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002074 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 goto finally;
2076 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2079 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002080 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 goto finally;
2082 }
2083 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002084 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2085 PyErr_Clear();
2086 else
2087 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002090 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2091 PyErr_Clear();
2092 else
2093 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 res = 0;
2095 goto finally;
2096 }
2097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (!PyDict_Check(state)) {
2100 if (put2(self, args) < 0)
2101 goto finally;
2102 }
2103 else {
2104 if (put(self, args) < 0)
2105 goto finally;
2106 }
Tim Peters84e87f32001-03-17 04:50:51 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 if (save(self, state, 0) < 0)
2109 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Tim Peters0bc93f52003-02-02 18:29:33 +00002111 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 finally:
2117 if (self->fast && !fast_save_leave(self, args))
2118 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 Py_XDECREF(module);
2121 Py_XDECREF(class);
2122 Py_XDECREF(state);
2123 Py_XDECREF(getinitargs_func);
2124 Py_XDECREF(getstate_func);
2125 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128}
2129
2130
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131static int
Tim Peterscba30e22003-02-01 06:24:36 +00002132save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002134 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 char *name_str, *module_str;
2136 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (name) {
2141 global_name = name;
2142 Py_INCREF(global_name);
2143 }
2144 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002145 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 goto finally;
2147 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002148
Tim Peterscba30e22003-02-01 06:24:36 +00002149 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002150 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002152 if ((module_size = PyString_Size(module)) < 0 ||
2153 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002155
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002156 module_str = PyString_AS_STRING((PyStringObject *)module);
2157 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002158
Guido van Rossum75bfd052002-12-24 18:10:07 +00002159 /* XXX This can be doing a relative import. Clearly it shouldn't,
2160 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 mod = PyImport_ImportModule(module_str);
2162 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002164 "Can't pickle %s: import of module %s "
2165 "failed",
2166 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 goto finally;
2168 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002169 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 if (klass == NULL) {
2171 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002172 "Can't pickle %s: attribute lookup %s.%s "
2173 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 "OSS", args, module, global_name);
2175 goto finally;
2176 }
2177 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002178 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002180 "Can't pickle %s: it's not the same object "
2181 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 "OSS", args, module, global_name);
2183 goto finally;
2184 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002185 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002186
Tim Peters731098b2003-02-04 20:56:09 +00002187 if (self->proto >= 2) {
2188 /* See whether this is in the extension registry, and if
2189 * so generate an EXT opcode.
2190 */
2191 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002192 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002193 char c_str[5];
2194 int n;
2195
2196 PyTuple_SET_ITEM(two_tuple, 0, module);
2197 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2198 py_code = PyDict_GetItem(extension_registry, two_tuple);
2199 if (py_code == NULL)
2200 goto gen_global; /* not registered */
2201
2202 /* Verify py_code has the right type and value. */
2203 if (!PyInt_Check(py_code)) {
2204 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002205 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002206 "OO", args, py_code);
2207 goto finally;
2208 }
2209 code = PyInt_AS_LONG(py_code);
2210 if (code <= 0 || code > 0x7fffffffL) {
2211 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2212 "extension code %ld is out of range",
2213 "Ol", args, code);
2214 goto finally;
2215 }
2216
2217 /* Generate an EXT opcode. */
2218 if (code <= 0xff) {
2219 c_str[0] = EXT1;
2220 c_str[1] = (char)code;
2221 n = 2;
2222 }
2223 else if (code <= 0xffff) {
2224 c_str[0] = EXT2;
2225 c_str[1] = (char)(code & 0xff);
2226 c_str[2] = (char)((code >> 8) & 0xff);
2227 n = 3;
2228 }
2229 else {
2230 c_str[0] = EXT4;
2231 c_str[1] = (char)(code & 0xff);
2232 c_str[2] = (char)((code >> 8) & 0xff);
2233 c_str[3] = (char)((code >> 16) & 0xff);
2234 c_str[4] = (char)((code >> 24) & 0xff);
2235 n = 5;
2236 }
2237
2238 if (self->write_func(self, c_str, n) >= 0)
2239 res = 0;
2240 goto finally; /* and don't memoize */
2241 }
2242
2243 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002244 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002246
Tim Peters0bc93f52003-02-02 18:29:33 +00002247 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002249
Tim Peters0bc93f52003-02-02 18:29:33 +00002250 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002252
Tim Peters0bc93f52003-02-02 18:29:33 +00002253 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002255
Tim Peters0bc93f52003-02-02 18:29:33 +00002256 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002259 if (put(self, args) < 0)
2260 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002262 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 finally:
2265 Py_XDECREF(module);
2266 Py_XDECREF(global_name);
2267 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002270}
2271
Guido van Rossum60456fd1997-04-09 17:36:32 +00002272static int
Tim Peterscba30e22003-02-01 06:24:36 +00002273save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274{
2275 PyObject *pid = 0;
2276 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 Py_INCREF(args);
2281 ARG_TUP(self, args);
2282 if (self->arg) {
2283 pid = PyObject_Call(f, self->arg, NULL);
2284 FREE_ARG_TUP(self);
2285 }
2286 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (pid != Py_None) {
2289 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002290 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 PyErr_SetString(PicklingError,
2292 "persistent id must be string");
2293 goto finally;
2294 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002295
Tim Peters0bc93f52003-02-02 18:29:33 +00002296 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002298
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002299 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002301
Tim Peters0bc93f52003-02-02 18:29:33 +00002302 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002303 PyString_AS_STRING(
2304 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002305 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Tim Peters0bc93f52003-02-02 18:29:33 +00002308 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 res = 1;
2312 goto finally;
2313 }
2314 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002315 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002316 res = -1;
2317 else
2318 res = 1;
2319 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 goto finally;
2322 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 finally:
2327 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Tim Peters71fcda52003-02-14 23:05:28 +00002332/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2333 * appropriate __reduce__ method for ob.
2334 */
Tim Peters84e87f32001-03-17 04:50:51 +00002335static int
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002336save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337{
Tim Peters71fcda52003-02-14 23:05:28 +00002338 PyObject *callable;
2339 PyObject *argtup;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002340 PyObject *state = NULL;
2341 PyObject *listitems = Py_None;
2342 PyObject *dictitems = Py_None;
2343 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002344
Tim Peters71fcda52003-02-14 23:05:28 +00002345 int use_newobj = self->proto >= 2;
2346
2347 static char reduce = REDUCE;
2348 static char build = BUILD;
2349 static char newobj = NEWOBJ;
2350
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002351 size = PyTuple_Size(args);
2352 if (size < 2 || size > 5) {
2353 cPickle_ErrFormat(PicklingError, "tuple returned by "
2354 "%s must contain 2 through 5 elements",
2355 "O", fn);
2356 return -1;
2357 }
2358
Tim Peters71fcda52003-02-14 23:05:28 +00002359 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2360 &callable,
2361 &argtup,
2362 &state,
2363 &listitems,
2364 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002365 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002367 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002368 cPickle_ErrFormat(PicklingError, "Second element of "
2369 "tuple returned by %s must be a tuple",
2370 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002371 return -1;
2372 }
2373
Tim Peters71fcda52003-02-14 23:05:28 +00002374 if (state == Py_None)
2375 state = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002376
Tim Peters71fcda52003-02-14 23:05:28 +00002377 if (listitems == Py_None)
2378 listitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002379 else if (!PyIter_Check(listitems)) {
2380 cPickle_ErrFormat(PicklingError, "Fourth element of "
2381 "tuple returned by %s must be an iterator, not %s",
2382 "Os", fn, Py_TYPE(listitems)->tp_name);
2383 return -1;
2384 }
2385
Tim Peters71fcda52003-02-14 23:05:28 +00002386 if (dictitems == Py_None)
2387 dictitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002388 else if (!PyIter_Check(dictitems)) {
2389 cPickle_ErrFormat(PicklingError, "Fifth element of "
2390 "tuple returned by %s must be an iterator, not %s",
2391 "Os", fn, Py_TYPE(dictitems)->tp_name);
2392 return -1;
2393 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002394
Tim Peters71fcda52003-02-14 23:05:28 +00002395 /* Protocol 2 special case: if callable's name is __newobj__, use
2396 * NEWOBJ. This consumes a lot of code.
2397 */
2398 if (use_newobj) {
2399 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002400
Tim Peters71fcda52003-02-14 23:05:28 +00002401 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002402 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2403 PyErr_Clear();
2404 else
2405 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002406 use_newobj = 0;
2407 }
2408 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002409 use_newobj = PyString_Check(temp) &&
2410 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002411 "__newobj__") == 0;
2412 Py_DECREF(temp);
2413 }
2414 }
2415 if (use_newobj) {
2416 PyObject *cls;
2417 PyObject *newargtup;
2418 int n, i;
2419
2420 /* Sanity checks. */
2421 n = PyTuple_Size(argtup);
2422 if (n < 1) {
2423 PyErr_SetString(PicklingError, "__newobj__ arglist "
2424 "is empty");
2425 return -1;
2426 }
2427
2428 cls = PyTuple_GET_ITEM(argtup, 0);
2429 if (! PyObject_HasAttrString(cls, "__new__")) {
2430 PyErr_SetString(PicklingError, "args[0] from "
2431 "__newobj__ args has no __new__");
2432 return -1;
2433 }
2434
2435 /* XXX How could ob be NULL? */
2436 if (ob != NULL) {
2437 PyObject *ob_dot_class;
2438
2439 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002440 if (ob_dot_class == NULL) {
2441 if (PyErr_ExceptionMatches(
2442 PyExc_AttributeError))
2443 PyErr_Clear();
2444 else
2445 return -1;
2446 }
Tim Peters71fcda52003-02-14 23:05:28 +00002447 i = ob_dot_class != cls; /* true iff a problem */
2448 Py_XDECREF(ob_dot_class);
2449 if (i) {
2450 PyErr_SetString(PicklingError, "args[0] from "
2451 "__newobj__ args has the wrong class");
2452 return -1;
2453 }
2454 }
2455
2456 /* Save the class and its __new__ arguments. */
2457 if (save(self, cls, 0) < 0)
2458 return -1;
2459
2460 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2461 if (newargtup == NULL)
2462 return -1;
2463 for (i = 1; i < n; ++i) {
2464 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2465 Py_INCREF(temp);
2466 PyTuple_SET_ITEM(newargtup, i-1, temp);
2467 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002468 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002469 Py_DECREF(newargtup);
2470 if (i < 0)
2471 return -1;
2472
2473 /* Add NEWOBJ opcode. */
2474 if (self->write_func(self, &newobj, 1) < 0)
2475 return -1;
2476 }
2477 else {
2478 /* Not using NEWOBJ. */
2479 if (save(self, callable, 0) < 0 ||
2480 save(self, argtup, 0) < 0 ||
2481 self->write_func(self, &reduce, 1) < 0)
2482 return -1;
2483 }
2484
2485 /* Memoize. */
2486 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (ob != NULL) {
2488 if (state && !PyDict_Check(state)) {
2489 if (put2(self, ob) < 0)
2490 return -1;
2491 }
Tim Peters71fcda52003-02-14 23:05:28 +00002492 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 }
Tim Peters84e87f32001-03-17 04:50:51 +00002495
Guido van Rossum60456fd1997-04-09 17:36:32 +00002496
Tim Peters71fcda52003-02-14 23:05:28 +00002497 if (listitems && batch_list(self, listitems) < 0)
2498 return -1;
2499
2500 if (dictitems && batch_dict(self, dictitems) < 0)
2501 return -1;
2502
2503 if (state) {
2504 if (save(self, state, 0) < 0 ||
2505 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 return -1;
2507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002510}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002511
Guido van Rossum60456fd1997-04-09 17:36:32 +00002512static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002513save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002514{
2515 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002516 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002517 int res = -1;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002518 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519
Facundo Batista763d3092008-06-30 01:10:55 +00002520 if (Py_EnterRecursiveCall(" while pickling an object"))
2521 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 if (!pers_save && self->pers_func) {
2524 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2525 res = tmp;
2526 goto finally;
2527 }
2528 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 if (args == Py_None) {
2531 res = save_none(self, args);
2532 goto finally;
2533 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002534
Christian Heimese93237d2007-12-19 02:37:44 +00002535 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002538 case 'b':
2539 if (args == Py_False || args == Py_True) {
2540 res = save_bool(self, args);
2541 goto finally;
2542 }
2543 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002544 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 if (type == &PyInt_Type) {
2546 res = save_int(self, args);
2547 goto finally;
2548 }
2549 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552 if (type == &PyLong_Type) {
2553 res = save_long(self, args);
2554 goto finally;
2555 }
2556 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002557
Guido van Rossum60456fd1997-04-09 17:36:32 +00002558 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002559 if (type == &PyFloat_Type) {
2560 res = save_float(self, args);
2561 goto finally;
2562 }
2563 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564
Guido van Rossum60456fd1997-04-09 17:36:32 +00002565 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002566 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2567 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568 goto finally;
2569 }
2570 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002571
Guido van Rossum60456fd1997-04-09 17:36:32 +00002572 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002573 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002574 res = save_string(self, args, 0);
2575 goto finally;
2576 }
Facundo Batista14618862008-06-22 15:27:10 +00002577 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002578
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002579#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002580 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002581 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 res = save_unicode(self, args, 0);
2583 goto finally;
2584 }
Facundo Batista14618862008-06-22 15:27:10 +00002585 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002586#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002588
Christian Heimese93237d2007-12-19 02:37:44 +00002589 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002590 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 if (PyDict_GetItem(self->memo, py_ob_id)) {
2594 if (get(self, py_ob_id) < 0)
2595 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597 res = 0;
2598 goto finally;
2599 }
2600 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002604 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605 res = save_string(self, args, 1);
2606 goto finally;
2607 }
2608 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002609
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002610#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002611 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612 if (type == &PyUnicode_Type) {
2613 res = save_unicode(self, args, 1);
2614 goto finally;
2615 }
2616 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002617#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002618
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 if (type == &PyTuple_Type) {
2621 res = save_tuple(self, args);
2622 goto finally;
2623 }
2624 if (type == &PyType_Type) {
2625 res = save_global(self, args, NULL);
2626 goto finally;
2627 }
2628 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002629
Guido van Rossum60456fd1997-04-09 17:36:32 +00002630 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 if (type == &PyList_Type) {
2632 res = save_list(self, args);
2633 goto finally;
2634 }
2635 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636
2637 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002638 if (type == &PyDict_Type) {
2639 res = save_dict(self, args);
2640 goto finally;
2641 }
2642 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
2644 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 if (type == &PyInstance_Type) {
2646 res = save_inst(self, args);
2647 goto finally;
2648 }
2649 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650
2651 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 if (type == &PyClass_Type) {
2653 res = save_global(self, args, NULL);
2654 goto finally;
2655 }
2656 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002657
2658 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 if (type == &PyFunction_Type) {
2660 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002661 if (res && PyErr_ExceptionMatches(PickleError)) {
2662 /* fall back to reduce */
2663 PyErr_Clear();
2664 break;
2665 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 goto finally;
2667 }
2668 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002669
2670 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 if (type == &PyCFunction_Type) {
2672 res = save_global(self, args, NULL);
2673 goto finally;
2674 }
2675 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 if (!pers_save && self->inst_pers_func) {
2678 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2679 res = tmp;
2680 goto finally;
2681 }
2682 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
Jeremy Hylton39c61162002-07-16 19:47:43 +00002684 if (PyType_IsSubtype(type, &PyType_Type)) {
2685 res = save_global(self, args, NULL);
2686 goto finally;
2687 }
2688
Guido van Rossumb289b872003-02-19 01:45:13 +00002689 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002690 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002691 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002692 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002693 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2694 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002696 Py_INCREF(args);
2697 ARG_TUP(self, args);
2698 if (self->arg) {
2699 t = PyObject_Call(__reduce__, self->arg, NULL);
2700 FREE_ARG_TUP(self);
2701 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 }
2703 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002704 /* Check for a __reduce_ex__ method. */
2705 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2706 if (__reduce__ != NULL) {
2707 t = PyInt_FromLong(self->proto);
2708 if (t != NULL) {
2709 ARG_TUP(self, t);
2710 t = NULL;
2711 if (self->arg) {
2712 t = PyObject_Call(__reduce__,
2713 self->arg, NULL);
2714 FREE_ARG_TUP(self);
2715 }
2716 }
2717 }
2718 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002719 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2720 PyErr_Clear();
2721 else
2722 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002723 /* Check for a __reduce__ method. */
2724 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2725 if (__reduce__ != NULL) {
2726 t = PyObject_Call(__reduce__,
2727 empty_tuple, NULL);
2728 }
2729 else {
2730 PyErr_SetObject(UnpickleableError, args);
2731 goto finally;
2732 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Tim Peters71fcda52003-02-14 23:05:28 +00002736 if (t == NULL)
2737 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002738
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002739 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002740 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741 goto finally;
2742 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002743
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002744 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002745 cPickle_ErrFormat(PicklingError, "Value returned by "
2746 "%s must be string or tuple",
2747 "O", __reduce__);
2748 goto finally;
2749 }
2750
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002751 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002754 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 Py_XDECREF(py_ob_id);
2756 Py_XDECREF(__reduce__);
2757 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760}
2761
2762
2763static int
Tim Peterscba30e22003-02-01 06:24:36 +00002764dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765{
2766 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767
Tim Peters4190fb82003-02-02 16:09:05 +00002768 if (self->proto >= 2) {
2769 char bytes[2];
2770
2771 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002772 assert(self->proto >= 0 && self->proto < 256);
2773 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002774 if (self->write_func(self, bytes, 2) < 0)
2775 return -1;
2776 }
2777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 if (save(self, args, 0) < 0)
2779 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Tim Peters4190fb82003-02-02 16:09:05 +00002781 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Tim Peters4190fb82003-02-02 16:09:05 +00002784 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788}
2789
2790static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002791Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792{
Tim Peterscba30e22003-02-01 06:24:36 +00002793 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 PyDict_Clear(self->memo);
2795 Py_INCREF(Py_None);
2796 return Py_None;
2797}
2798
2799static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002800Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801{
2802 int l, i, rsize, ssize, clear=1, lm;
2803 long ik;
2804 PyObject *k, *r;
2805 char *s, *p, *have_get;
2806 Pdata *data;
2807
2808 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002809 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 return NULL;
2811
2812 /* Check to make sure we are based on a list */
2813 if (! Pdata_Check(self->file)) {
2814 PyErr_SetString(PicklingError,
2815 "Attempt to getvalue() a non-list-based pickler");
2816 return NULL;
2817 }
2818
2819 /* flush write buffer */
2820 if (write_other(self, NULL, 0) < 0) return NULL;
2821
2822 data=(Pdata*)self->file;
2823 l=data->length;
2824
2825 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002826 lm = PyDict_Size(self->memo);
2827 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002829 have_get = malloc(lm);
2830 if (have_get == NULL) return PyErr_NoMemory();
2831 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832
2833 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002834 for (rsize = 0, i = l; --i >= 0; ) {
2835 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002837 if (PyString_Check(k))
2838 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839
2840 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002841 ik = PyInt_AS_LONG((PyIntObject*)k);
2842 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 PyErr_SetString(PicklingError,
2844 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002845 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 }
Tim Petersac5687a2003-02-02 18:08:34 +00002847 if (have_get[ik]) /* with matching get */
2848 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 }
2850
2851 else if (! (PyTuple_Check(k) &&
2852 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002853 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 ) {
2855 PyErr_SetString(PicklingError,
2856 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002857 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 }
2859
2860 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002861 ik = PyInt_AS_LONG((PyIntObject *)k);
2862 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 PyErr_SetString(PicklingError,
2864 "Invalid get data");
2865 return NULL;
2866 }
Tim Petersac5687a2003-02-02 18:08:34 +00002867 have_get[ik] = 1;
2868 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 }
2871
2872 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002873 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002874 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002875 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002876
Tim Petersac5687a2003-02-02 18:08:34 +00002877 for (i = 0; i < l; i++) {
2878 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002880 if (PyString_Check(k)) {
2881 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002883 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002884 while (--ssize >= 0)
2885 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 }
2887 }
2888
2889 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002890 ik = PyInt_AS_LONG((PyIntObject *)
2891 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 if (ik < 256) {
2893 *s++ = BINGET;
2894 *s++ = (int)(ik & 0xff);
2895 }
2896 else {
2897 *s++ = LONG_BINGET;
2898 *s++ = (int)(ik & 0xff);
2899 *s++ = (int)((ik >> 8) & 0xff);
2900 *s++ = (int)((ik >> 16) & 0xff);
2901 *s++ = (int)((ik >> 24) & 0xff);
2902 }
2903 }
2904
2905 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002906 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907
2908 if (have_get[ik]) { /* with matching get */
2909 if (ik < 256) {
2910 *s++ = BINPUT;
2911 *s++ = (int)(ik & 0xff);
2912 }
2913 else {
2914 *s++ = LONG_BINPUT;
2915 *s++ = (int)(ik & 0xff);
2916 *s++ = (int)((ik >> 8) & 0xff);
2917 *s++ = (int)((ik >> 16) & 0xff);
2918 *s++ = (int)((ik >> 24) & 0xff);
2919 }
2920 }
2921 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 }
2923
2924 if (clear) {
2925 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002926 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927 }
2928
2929 free(have_get);
2930 return r;
2931 err:
2932 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002933 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002934}
2935
2936static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002937Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938{
2939 PyObject *ob;
2940 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002941
Tim Peterscba30e22003-02-01 06:24:36 +00002942 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if (dump(self, ob) < 0)
2946 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 /* XXX Why does dump() return self? */
2951 Py_INCREF(self);
2952 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002953}
2954
2955
Tim Peterscba30e22003-02-01 06:24:36 +00002956static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957{
Neal Norwitzb0493252002-03-31 14:44:22 +00002958 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002959 PyDoc_STR("dump(object) -- "
2960 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002961 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002962 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002963 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002964 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002966};
2967
2968
2969static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002970newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971{
2972 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002973
Tim Peters5bd2a792003-02-01 16:45:06 +00002974 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002975 proto = HIGHEST_PROTOCOL;
2976 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002977 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2978 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002979 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002981 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002982
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002983 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002984 if (self == NULL)
2985 return NULL;
2986 self->proto = proto;
2987 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 self->fp = NULL;
2989 self->write = NULL;
2990 self->memo = NULL;
2991 self->arg = NULL;
2992 self->pers_func = NULL;
2993 self->inst_pers_func = NULL;
2994 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 self->fast = 0;
2996 self->fast_container = 0;
2997 self->fast_memo = NULL;
2998 self->buf_size = 0;
2999 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003000
Tim Peters5bd2a792003-02-01 16:45:06 +00003001 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 if (file)
3003 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00003004 else {
3005 file = Pdata_New();
3006 if (file == NULL)
3007 goto err;
3008 }
3009 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003010
Tim Peterscba30e22003-02-01 06:24:36 +00003011 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (PyFile_Check(file)) {
3015 self->fp = PyFile_AsFile(file);
3016 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00003017 PyErr_SetString(PyExc_ValueError,
3018 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 goto err;
3020 }
3021 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00003022 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 else if (PycStringIO_OutputCheck(file)) {
3024 self->write_func = write_cStringIO;
3025 }
3026 else if (file == Py_None) {
3027 self->write_func = write_none;
3028 }
3029 else {
3030 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 if (! Pdata_Check(file)) {
3033 self->write = PyObject_GetAttr(file, write_str);
3034 if (!self->write) {
3035 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003036 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 "argument must have 'write' "
3038 "attribute");
3039 goto err;
3040 }
3041 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003042
Tim Peters5bd2a792003-02-01 16:45:06 +00003043 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3044 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 PyErr_NoMemory();
3046 goto err;
3047 }
3048 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050 if (PyEval_GetRestricted()) {
3051 /* Restricted execution, get private tables */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00003052 PyObject *m = PyImport_Import(copyreg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003053
Tim Peters5b7da392003-02-04 00:21:07 +00003054 if (m == NULL)
3055 goto err;
3056 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00003058 if (self->dispatch_table == NULL)
3059 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 }
3061 else {
Tim Peters5b7da392003-02-04 00:21:07 +00003062 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 Py_INCREF(dispatch_table);
3064 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003065 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003070 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003072}
3073
3074
3075static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003076get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003078 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003080 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003081
Tim Peters92c8bb32003-02-13 23:00:26 +00003082 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003083 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003084 * accepts Pickler() and Pickler(integer) too. The meaning then
3085 * is clear as mud, undocumented, and not supported by pickle.py.
3086 * I'm told Zope uses this, but I haven't traced into this code
3087 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003088 */
3089 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003091 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003092 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3093 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 return NULL;
3095 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003096 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003097}
3098
3099
3100static void
Tim Peterscba30e22003-02-01 06:24:36 +00003101Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003103 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 Py_XDECREF(self->write);
3105 Py_XDECREF(self->memo);
3106 Py_XDECREF(self->fast_memo);
3107 Py_XDECREF(self->arg);
3108 Py_XDECREF(self->file);
3109 Py_XDECREF(self->pers_func);
3110 Py_XDECREF(self->inst_pers_func);
3111 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003112 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003113 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003114}
3115
3116static int
3117Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3118{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003119 Py_VISIT(self->write);
3120 Py_VISIT(self->memo);
3121 Py_VISIT(self->fast_memo);
3122 Py_VISIT(self->arg);
3123 Py_VISIT(self->file);
3124 Py_VISIT(self->pers_func);
3125 Py_VISIT(self->inst_pers_func);
3126 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003127 return 0;
3128}
3129
3130static int
3131Pickler_clear(Picklerobject *self)
3132{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003133 Py_CLEAR(self->write);
3134 Py_CLEAR(self->memo);
3135 Py_CLEAR(self->fast_memo);
3136 Py_CLEAR(self->arg);
3137 Py_CLEAR(self->file);
3138 Py_CLEAR(self->pers_func);
3139 Py_CLEAR(self->inst_pers_func);
3140 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003141 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003142}
3143
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003144static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003145Pickler_get_pers_func(Picklerobject *p)
3146{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 if (p->pers_func == NULL)
3148 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3149 else
3150 Py_INCREF(p->pers_func);
3151 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003152}
3153
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003154static int
3155Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3156{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 if (v == NULL) {
3158 PyErr_SetString(PyExc_TypeError,
3159 "attribute deletion is not supported");
3160 return -1;
3161 }
3162 Py_XDECREF(p->pers_func);
3163 Py_INCREF(v);
3164 p->pers_func = v;
3165 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003166}
3167
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003168static int
3169Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3170{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 if (v == NULL) {
3172 PyErr_SetString(PyExc_TypeError,
3173 "attribute deletion is not supported");
3174 return -1;
3175 }
3176 Py_XDECREF(p->inst_pers_func);
3177 Py_INCREF(v);
3178 p->inst_pers_func = v;
3179 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003180}
3181
3182static PyObject *
3183Pickler_get_memo(Picklerobject *p)
3184{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if (p->memo == NULL)
3186 PyErr_SetString(PyExc_AttributeError, "memo");
3187 else
3188 Py_INCREF(p->memo);
3189 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003190}
3191
3192static int
3193Pickler_set_memo(Picklerobject *p, PyObject *v)
3194{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (v == NULL) {
3196 PyErr_SetString(PyExc_TypeError,
3197 "attribute deletion is not supported");
3198 return -1;
3199 }
3200 if (!PyDict_Check(v)) {
3201 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3202 return -1;
3203 }
3204 Py_XDECREF(p->memo);
3205 Py_INCREF(v);
3206 p->memo = v;
3207 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003208}
3209
3210static PyObject *
3211Pickler_get_error(Picklerobject *p)
3212{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 /* why is this an attribute on the Pickler? */
3214 Py_INCREF(PicklingError);
3215 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003216}
3217
3218static PyMemberDef Pickler_members[] = {
3219 {"binary", T_INT, offsetof(Picklerobject, bin)},
3220 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003221 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003222};
3223
3224static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003225 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003226 (setter)Pickler_set_pers_func},
3227 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3228 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003229 {"PicklingError", (getter)Pickler_get_error, NULL},
3230 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003231};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003233PyDoc_STRVAR(Picklertype__doc__,
3234"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003235
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003236static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003237 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003238 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003239 sizeof(Picklerobject), /*tp_basicsize*/
3240 0,
3241 (destructor)Pickler_dealloc, /* tp_dealloc */
3242 0, /* tp_print */
3243 0, /* tp_getattr */
3244 0, /* tp_setattr */
3245 0, /* tp_compare */
3246 0, /* tp_repr */
3247 0, /* tp_as_number */
3248 0, /* tp_as_sequence */
3249 0, /* tp_as_mapping */
3250 0, /* tp_hash */
3251 0, /* tp_call */
3252 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003253 PyObject_GenericGetAttr, /* tp_getattro */
3254 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003255 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003256 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003257 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003258 (traverseproc)Pickler_traverse, /* tp_traverse */
3259 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003260 0, /* tp_richcompare */
3261 0, /* tp_weaklistoffset */
3262 0, /* tp_iter */
3263 0, /* tp_iternext */
3264 Pickler_methods, /* tp_methods */
3265 Pickler_members, /* tp_members */
3266 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003267};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003268
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003269static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003270find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271{
3272 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 if (fc) {
3275 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003276 PyErr_SetString(UnpicklingError, "Global and instance "
3277 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 return NULL;
3279 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003280 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3281 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 module = PySys_GetObject("modules");
3285 if (module == NULL)
3286 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 module = PyDict_GetItem(module, py_module_name);
3289 if (module == NULL) {
3290 module = PyImport_Import(py_module_name);
3291 if (!module)
3292 return NULL;
3293 global = PyObject_GetAttr(module, py_global_name);
3294 Py_DECREF(module);
3295 }
3296 else
3297 global = PyObject_GetAttr(module, py_global_name);
3298 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003299}
3300
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003301static int
Tim Peterscba30e22003-02-01 06:24:36 +00003302marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303{
3304 if (self->num_marks < 1) {
3305 PyErr_SetString(UnpicklingError, "could not find MARK");
3306 return -1;
3307 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310}
3311
Tim Peters84e87f32001-03-17 04:50:51 +00003312
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313static int
Tim Peterscba30e22003-02-01 06:24:36 +00003314load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315{
3316 PDATA_APPEND(self->stack, Py_None, -1);
3317 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318}
3319
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003320static int
Tim Peterscba30e22003-02-01 06:24:36 +00003321bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322{
3323 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3324 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003325}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326
3327static int
Tim Peterscba30e22003-02-01 06:24:36 +00003328load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329{
3330 PyObject *py_int = 0;
3331 char *endptr, *s;
3332 int len, res = -1;
3333 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Tim Peters0bc93f52003-02-02 18:29:33 +00003335 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 if (len < 2) return bad_readline();
3337 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 errno = 0;
3340 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3343 /* Hm, maybe we've got something long. Let's try reading
3344 it as a Python long object. */
3345 errno = 0;
3346 py_int = PyLong_FromString(s, NULL, 0);
3347 if (py_int == NULL) {
3348 PyErr_SetString(PyExc_ValueError,
3349 "could not convert string to int");
3350 goto finally;
3351 }
3352 }
3353 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003354 if (len == 3 && (l == 0 || l == 1)) {
3355 if (!( py_int = PyBool_FromLong(l))) goto finally;
3356 }
3357 else {
3358 if (!( py_int = PyInt_FromLong(l))) goto finally;
3359 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 free(s);
3363 PDATA_PUSH(self->stack, py_int, -1);
3364 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 finally:
3367 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370}
3371
Tim Peters3c67d792003-02-02 17:59:11 +00003372static int
3373load_bool(Unpicklerobject *self, PyObject *boolean)
3374{
3375 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003376 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003377 return 0;
3378}
3379
Tim Petersee1a53c2003-02-02 02:57:53 +00003380/* s contains x bytes of a little-endian integer. Return its value as a
3381 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3382 * int, but when x is 4 it's a signed one. This is an historical source
3383 * of x-platform bugs.
3384 */
Tim Peters84e87f32001-03-17 04:50:51 +00003385static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003386calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387{
3388 unsigned char c;
3389 int i;
3390 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392 for (i = 0, l = 0L; i < x; i++) {
3393 c = (unsigned char)s[i];
3394 l |= (long)c << (i * 8);
3395 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003396#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3398 * is signed, so on a box with longs bigger than 4 bytes we need
3399 * to extend a BININT's sign bit to the full width.
3400 */
3401 if (x == 4 && l & (1L << 31))
3402 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003403#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405}
3406
3407
3408static int
Tim Peterscba30e22003-02-01 06:24:36 +00003409load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410{
3411 PyObject *py_int = 0;
3412 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Tim Peterscba30e22003-02-01 06:24:36 +00003416 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 PDATA_PUSH(self->stack, py_int, -1);
3420 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421}
3422
3423
3424static int
Tim Peterscba30e22003-02-01 06:24:36 +00003425load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426{
3427 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Tim Peters0bc93f52003-02-02 18:29:33 +00003429 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433}
3434
3435
3436static int
Tim Peterscba30e22003-02-01 06:24:36 +00003437load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438{
3439 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Tim Peters0bc93f52003-02-02 18:29:33 +00003441 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445}
3446
3447
3448static int
Tim Peterscba30e22003-02-01 06:24:36 +00003449load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450{
3451 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Tim Peters0bc93f52003-02-02 18:29:33 +00003453 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457}
Tim Peters84e87f32001-03-17 04:50:51 +00003458
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459static int
Tim Peterscba30e22003-02-01 06:24:36 +00003460load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461{
3462 PyObject *l = 0;
3463 char *end, *s;
3464 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
Tim Peters0bc93f52003-02-02 18:29:33 +00003466 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 if (len < 2) return bad_readline();
3468 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003469
Tim Peterscba30e22003-02-01 06:24:36 +00003470 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 free(s);
3474 PDATA_PUSH(self->stack, l, -1);
3475 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 finally:
3478 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
3482
Tim Petersee1a53c2003-02-02 02:57:53 +00003483/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3484 * data following.
3485 */
3486static int
3487load_counted_long(Unpicklerobject *self, int size)
3488{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003489 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003490 char *nbytes;
3491 unsigned char *pdata;
3492 PyObject *along;
3493
3494 assert(size == 1 || size == 4);
3495 i = self->read_func(self, &nbytes, size);
3496 if (i < 0) return -1;
3497
3498 size = calc_binint(nbytes, size);
3499 if (size < 0) {
3500 /* Corrupt or hostile pickle -- we never write one like
3501 * this.
3502 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003503 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003504 "byte count");
3505 return -1;
3506 }
3507
3508 if (size == 0)
3509 along = PyLong_FromLong(0L);
3510 else {
3511 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003512 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003513 if (i < 0) return -1;
3514 along = _PyLong_FromByteArray(pdata, (size_t)size,
3515 1 /* little endian */, 1 /* signed */);
3516 }
3517 if (along == NULL)
3518 return -1;
3519 PDATA_PUSH(self->stack, along, -1);
3520 return 0;
3521}
Tim Peters84e87f32001-03-17 04:50:51 +00003522
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523static int
Tim Peterscba30e22003-02-01 06:24:36 +00003524load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525{
3526 PyObject *py_float = 0;
3527 char *endptr, *s;
3528 int len, res = -1;
3529 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Tim Peters0bc93f52003-02-02 18:29:33 +00003531 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 if (len < 2) return bad_readline();
3533 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003536 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Mark Dickinsona3ecd2c2009-01-24 16:40:29 +00003538 if ((errno == ERANGE && !(fabs(d) <= 1.0)) ||
3539 (endptr[0] != '\n') || (endptr[1] != '\0')) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 PyErr_SetString(PyExc_ValueError,
3541 "could not convert string to float");
3542 goto finally;
3543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Tim Peterscba30e22003-02-01 06:24:36 +00003545 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 free(s);
3549 PDATA_PUSH(self->stack, py_float, -1);
3550 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 finally:
3553 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556}
3557
Guido van Rossum60456fd1997-04-09 17:36:32 +00003558static int
Tim Peterscba30e22003-02-01 06:24:36 +00003559load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560{
Tim Peters9905b942003-03-20 20:53:32 +00003561 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003562 double x;
3563 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Tim Peters0bc93f52003-02-02 18:29:33 +00003565 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Tim Peters9905b942003-03-20 20:53:32 +00003568 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3569 if (x == -1.0 && PyErr_Occurred())
3570 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571
Tim Peters9905b942003-03-20 20:53:32 +00003572 py_float = PyFloat_FromDouble(x);
3573 if (py_float == NULL)
3574 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_float, -1);
3577 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003579
3580static int
Tim Peterscba30e22003-02-01 06:24:36 +00003581load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582{
3583 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003584 int len, res = -1;
3585 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586
Tim Peters0bc93f52003-02-02 18:29:33 +00003587 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 if (len < 2) return bad_readline();
3589 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003591
3592 /* Strip outermost quotes */
3593 while (s[len-1] <= ' ')
3594 len--;
3595 if(s[0]=='"' && s[len-1]=='"'){
3596 s[len-1] = '\0';
3597 p = s + 1 ;
3598 len -= 2;
3599 } else if(s[0]=='\'' && s[len-1]=='\''){
3600 s[len-1] = '\0';
3601 p = s + 1 ;
3602 len -= 2;
3603 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 goto insecure;
3605 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003606
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003607 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003608 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003609 if (str) {
3610 PDATA_PUSH(self->stack, str, -1);
3611 res = 0;
3612 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 insecure:
3616 free(s);
3617 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3618 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003619}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003620
3621
3622static int
Tim Peterscba30e22003-02-01 06:24:36 +00003623load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003624{
3625 PyObject *py_string = 0;
3626 long l;
3627 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628
Tim Peters0bc93f52003-02-02 18:29:33 +00003629 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003632 if (l < 0) {
3633 /* Corrupt or hostile pickle -- we never write one like
3634 * this.
3635 */
3636 PyErr_SetString(UnpicklingError,
3637 "BINSTRING pickle has negative byte count");
3638 return -1;
3639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640
Tim Peters0bc93f52003-02-02 18:29:33 +00003641 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003642 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003644 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003647 PDATA_PUSH(self->stack, py_string, -1);
3648 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003649}
3650
3651
3652static int
Tim Peterscba30e22003-02-01 06:24:36 +00003653load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003654{
3655 PyObject *py_string = 0;
3656 unsigned char l;
3657 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003658
Tim Peters0bc93f52003-02-02 18:29:33 +00003659 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Tim Peters0bc93f52003-02-02 18:29:33 +00003664 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003666 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003668 PDATA_PUSH(self->stack, py_string, -1);
3669 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003670}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
3672
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003673#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *str = 0;
3678 int len, res = -1;
3679 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003680
Tim Peters0bc93f52003-02-02 18:29:33 +00003681 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003683
Tim Peterscba30e22003-02-01 06:24:36 +00003684 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 PDATA_PUSH(self->stack, str, -1);
3688 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 finally:
3691 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003692}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003693#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003694
3695
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003696#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003697static int
Tim Peterscba30e22003-02-01 06:24:36 +00003698load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699{
3700 PyObject *unicode;
3701 long l;
3702 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003703
Tim Peters0bc93f52003-02-02 18:29:33 +00003704 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003707 if (l < 0) {
3708 /* Corrupt or hostile pickle -- we never write one like
3709 * this.
3710 */
3711 PyErr_SetString(UnpicklingError,
3712 "BINUNICODE pickle has negative byte count");
3713 return -1;
3714 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003715
Tim Peters0bc93f52003-02-02 18:29:33 +00003716 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003718
Tim Peterscba30e22003-02-01 06:24:36 +00003719 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 PDATA_PUSH(self->stack, unicode, -1);
3723 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003724}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003725#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003726
3727
3728static int
Tim Peterscba30e22003-02-01 06:24:36 +00003729load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730{
3731 PyObject *tup;
3732 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734 if ((i = marker(self)) < 0) return -1;
3735 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3736 PDATA_PUSH(self->stack, tup, -1);
3737 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738}
3739
3740static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003741load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003743 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Tim Peters1d63c9f2003-02-02 20:29:39 +00003745 if (tup == NULL)
3746 return -1;
3747
3748 while (--len >= 0) {
3749 PyObject *element;
3750
3751 PDATA_POP(self->stack, element);
3752 if (element == NULL)
3753 return -1;
3754 PyTuple_SET_ITEM(tup, len, element);
3755 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 PDATA_PUSH(self->stack, tup, -1);
3757 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758}
3759
3760static int
Tim Peterscba30e22003-02-01 06:24:36 +00003761load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762{
3763 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 if (!( list=PyList_New(0))) return -1;
3766 PDATA_PUSH(self->stack, list, -1);
3767 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768}
3769
3770static int
Tim Peterscba30e22003-02-01 06:24:36 +00003771load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772{
3773 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 if (!( dict=PyDict_New())) return -1;
3776 PDATA_PUSH(self->stack, dict, -1);
3777 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778}
3779
3780
3781static int
Tim Peterscba30e22003-02-01 06:24:36 +00003782load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783{
3784 PyObject *list = 0;
3785 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if ((i = marker(self)) < 0) return -1;
3788 if (!( list=Pdata_popList(self->stack, i))) return -1;
3789 PDATA_PUSH(self->stack, list, -1);
3790 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791}
3792
3793static int
Tim Peterscba30e22003-02-01 06:24:36 +00003794load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795{
3796 PyObject *dict, *key, *value;
3797 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 if ((i = marker(self)) < 0) return -1;
3800 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 for (k = i+1; k < j; k += 2) {
3805 key =self->stack->data[k-1];
3806 value=self->stack->data[k ];
3807 if (PyDict_SetItem(dict, key, value) < 0) {
3808 Py_DECREF(dict);
3809 return -1;
3810 }
3811 }
3812 Pdata_clear(self->stack, i);
3813 PDATA_PUSH(self->stack, dict, -1);
3814 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815}
3816
3817static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003818Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003820 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 if (PyClass_Check(cls)) {
3823 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 if ((l=PyObject_Size(args)) < 0) goto err;
3826 if (!( l )) {
3827 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003828
Tim Peterscba30e22003-02-01 06:24:36 +00003829 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003830 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003832 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003833 so bypass usual construction */
3834 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003837 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 goto err;
3839 return inst;
3840 }
3841 Py_DECREF(__getinitargs__);
3842 }
Tim Peters84e87f32001-03-17 04:50:51 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 if ((r=PyInstance_New(cls, args, NULL))) return r;
3845 else goto err;
3846 }
Tim Peters84e87f32001-03-17 04:50:51 +00003847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003848 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 err:
3851 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003852 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003855 tmp_value = v;
3856 /* NULL occurs when there was a KeyboardInterrupt */
3857 if (tmp_value == NULL)
3858 tmp_value = Py_None;
3859 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 Py_XDECREF(v);
3861 v=r;
3862 }
3863 PyErr_Restore(tp,v,tb);
3864 }
3865 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866}
Tim Peters84e87f32001-03-17 04:50:51 +00003867
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
3869static int
Tim Peterscba30e22003-02-01 06:24:36 +00003870load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871{
3872 PyObject *class, *tup, *obj=0;
3873 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 if ((i = marker(self)) < 0) return -1;
3876 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3877 PDATA_POP(self->stack, class);
3878 if (class) {
3879 obj = Instance_New(class, tup);
3880 Py_DECREF(class);
3881 }
3882 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 if (! obj) return -1;
3885 PDATA_PUSH(self->stack, obj, -1);
3886 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003887}
3888
3889
3890static int
Tim Peterscba30e22003-02-01 06:24:36 +00003891load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892{
3893 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3894 int i, len;
3895 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003898
Tim Peters0bc93f52003-02-02 18:29:33 +00003899 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003901 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003903
Tim Peters0bc93f52003-02-02 18:29:33 +00003904 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003906 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003907 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908 self->find_class);
3909 Py_DECREF(class_name);
3910 }
3911 }
3912 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 if ((tup=Pdata_popTuple(self->stack, i))) {
3917 obj = Instance_New(class, tup);
3918 Py_DECREF(tup);
3919 }
3920 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 PDATA_PUSH(self->stack, obj, -1);
3925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926}
3927
Tim Peterseab7db32003-02-13 18:24:14 +00003928static int
3929load_newobj(Unpicklerobject *self)
3930{
3931 PyObject *args = NULL;
3932 PyObject *clsraw = NULL;
3933 PyTypeObject *cls; /* clsraw cast to its true type */
3934 PyObject *obj;
3935
3936 /* Stack is ... cls argtuple, and we want to call
3937 * cls.__new__(cls, *argtuple).
3938 */
3939 PDATA_POP(self->stack, args);
3940 if (args == NULL) goto Fail;
3941 if (! PyTuple_Check(args)) {
3942 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3943 "tuple.");
3944 goto Fail;
3945 }
3946
3947 PDATA_POP(self->stack, clsraw);
3948 cls = (PyTypeObject *)clsraw;
3949 if (cls == NULL) goto Fail;
3950 if (! PyType_Check(cls)) {
3951 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3952 "isn't a type object");
3953 goto Fail;
3954 }
3955 if (cls->tp_new == NULL) {
3956 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3957 "has NULL tp_new");
3958 goto Fail;
3959 }
3960
3961 /* Call __new__. */
3962 obj = cls->tp_new(cls, args, NULL);
3963 if (obj == NULL) goto Fail;
3964
3965 Py_DECREF(args);
3966 Py_DECREF(clsraw);
3967 PDATA_PUSH(self->stack, obj, -1);
3968 return 0;
3969
3970 Fail:
3971 Py_XDECREF(args);
3972 Py_XDECREF(clsraw);
3973 return -1;
3974}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
3976static int
Tim Peterscba30e22003-02-01 06:24:36 +00003977load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003978{
3979 PyObject *class = 0, *module_name = 0, *class_name = 0;
3980 int len;
3981 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982
Tim Peters0bc93f52003-02-02 18:29:33 +00003983 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003985 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987
Tim Peters0bc93f52003-02-02 18:29:33 +00003988 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003989 if (len < 2) {
3990 Py_DECREF(module_name);
3991 return bad_readline();
3992 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003993 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003994 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 self->find_class);
3996 Py_DECREF(class_name);
3997 }
3998 }
3999 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 if (! class) return -1;
4002 PDATA_PUSH(self->stack, class, -1);
4003 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004004}
4005
4006
4007static int
Tim Peterscba30e22003-02-01 06:24:36 +00004008load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009{
4010 PyObject *pid = 0;
4011 int len;
4012 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004015 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016 if (len < 2) return bad_readline();
4017
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004018 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 if (!pid) return -1;
4020
4021 if (PyList_Check(self->pers_func)) {
4022 if (PyList_Append(self->pers_func, pid) < 0) {
4023 Py_DECREF(pid);
4024 return -1;
4025 }
4026 }
4027 else {
4028 ARG_TUP(self, pid);
4029 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004030 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 NULL);
4032 FREE_ARG_TUP(self);
4033 }
4034 }
4035
4036 if (! pid) return -1;
4037
4038 PDATA_PUSH(self->stack, pid, -1);
4039 return 0;
4040 }
4041 else {
4042 PyErr_SetString(UnpicklingError,
4043 "A load persistent id instruction was encountered,\n"
4044 "but no persistent_load function was specified.");
4045 return -1;
4046 }
4047}
4048
4049static int
Tim Peterscba30e22003-02-01 06:24:36 +00004050load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051{
4052 PyObject *pid = 0;
4053
4054 if (self->pers_func) {
4055 PDATA_POP(self->stack, pid);
4056 if (! pid) return -1;
4057
4058 if (PyList_Check(self->pers_func)) {
4059 if (PyList_Append(self->pers_func, pid) < 0) {
4060 Py_DECREF(pid);
4061 return -1;
4062 }
4063 }
4064 else {
4065 ARG_TUP(self, pid);
4066 if (self->arg) {
4067 pid = PyObject_Call(self->pers_func, self->arg,
4068 NULL);
4069 FREE_ARG_TUP(self);
4070 }
4071 if (! pid) return -1;
4072 }
4073
4074 PDATA_PUSH(self->stack, pid, -1);
4075 return 0;
4076 }
4077 else {
4078 PyErr_SetString(UnpicklingError,
4079 "A load persistent id instruction was encountered,\n"
4080 "but no persistent_load function was specified.");
4081 return -1;
4082 }
4083}
4084
4085
4086static int
Tim Peterscba30e22003-02-01 06:24:36 +00004087load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088{
Collin Winter57bef682009-05-26 04:12:39 +00004089 int len = self->stack->length;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090
4091 /* Note that we split the (pickle.py) stack into two stacks,
4092 an object stack and a mark stack. We have to be clever and
4093 pop the right one. We do this by looking at the top of the
Collin Winter57bef682009-05-26 04:12:39 +00004094 mark stack first, and only signalling a stack underflow if
4095 the object stack is empty and the mark stack doesn't match
4096 our expectations.
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 */
Collin Winter57bef682009-05-26 04:12:39 +00004098 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 self->num_marks--;
Collin Winter57bef682009-05-26 04:12:39 +00004100 } else if (len >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101 len--;
4102 Py_DECREF(self->stack->data[len]);
Collin Winter57bef682009-05-26 04:12:39 +00004103 self->stack->length = len;
4104 } else {
4105 return stackUnderflow();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 return 0;
4108}
4109
4110
4111static int
Tim Peterscba30e22003-02-01 06:24:36 +00004112load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113{
4114 int i;
4115
4116 if ((i = marker(self)) < 0)
4117 return -1;
4118
4119 Pdata_clear(self->stack, i);
4120
4121 return 0;
4122}
4123
4124
4125static int
Tim Peterscba30e22003-02-01 06:24:36 +00004126load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127{
4128 PyObject *last;
4129 int len;
4130
4131 if ((len = self->stack->length) <= 0) return stackUnderflow();
4132 last=self->stack->data[len-1];
4133 Py_INCREF(last);
4134 PDATA_PUSH(self->stack, last, -1);
4135 return 0;
4136}
4137
4138
4139static int
Tim Peterscba30e22003-02-01 06:24:36 +00004140load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141{
4142 PyObject *py_str = 0, *value = 0;
4143 int len;
4144 char *s;
4145 int rc;
4146
Tim Peters0bc93f52003-02-02 18:29:33 +00004147 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004148 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004149
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004150 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 value = PyDict_GetItem(self->memo, py_str);
4153 if (! value) {
4154 PyErr_SetObject(BadPickleGet, py_str);
4155 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004156 }
4157 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 PDATA_APPEND(self->stack, value, -1);
4159 rc = 0;
4160 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 Py_DECREF(py_str);
4163 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004164}
4165
4166
4167static int
Tim Peterscba30e22003-02-01 06:24:36 +00004168load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169{
4170 PyObject *py_key = 0, *value = 0;
4171 unsigned char key;
4172 char *s;
4173 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004174
Tim Peters0bc93f52003-02-02 18:29:33 +00004175 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 key = (unsigned char)s[0];
4178 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 value = PyDict_GetItem(self->memo, py_key);
4181 if (! value) {
4182 PyErr_SetObject(BadPickleGet, py_key);
4183 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004184 }
4185 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186 PDATA_APPEND(self->stack, value, -1);
4187 rc = 0;
4188 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 Py_DECREF(py_key);
4191 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004192}
4193
4194
4195static int
Tim Peterscba30e22003-02-01 06:24:36 +00004196load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197{
4198 PyObject *py_key = 0, *value = 0;
4199 unsigned char c;
4200 char *s;
4201 long key;
4202 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Tim Peters0bc93f52003-02-02 18:29:33 +00004204 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 c = (unsigned char)s[0];
4207 key = (long)c;
4208 c = (unsigned char)s[1];
4209 key |= (long)c << 8;
4210 c = (unsigned char)s[2];
4211 key |= (long)c << 16;
4212 c = (unsigned char)s[3];
4213 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4216
4217 value = PyDict_GetItem(self->memo, py_key);
4218 if (! value) {
4219 PyErr_SetObject(BadPickleGet, py_key);
4220 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004221 }
4222 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 PDATA_APPEND(self->stack, value, -1);
4224 rc = 0;
4225 }
4226
4227 Py_DECREF(py_key);
4228 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229}
4230
Tim Peters2d629652003-02-04 05:06:17 +00004231/* Push an object from the extension registry (EXT[124]). nbytes is
4232 * the number of bytes following the opcode, holding the index (code) value.
4233 */
4234static int
4235load_extension(Unpicklerobject *self, int nbytes)
4236{
4237 char *codebytes; /* the nbytes bytes after the opcode */
4238 long code; /* calc_binint returns long */
4239 PyObject *py_code; /* code as a Python int */
4240 PyObject *obj; /* the object to push */
4241 PyObject *pair; /* (module_name, class_name) */
4242 PyObject *module_name, *class_name;
4243
4244 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4245 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4246 code = calc_binint(codebytes, nbytes);
4247 if (code <= 0) { /* note that 0 is forbidden */
4248 /* Corrupt or hostile pickle. */
4249 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4250 return -1;
4251 }
4252
4253 /* Look for the code in the cache. */
4254 py_code = PyInt_FromLong(code);
4255 if (py_code == NULL) return -1;
4256 obj = PyDict_GetItem(extension_cache, py_code);
4257 if (obj != NULL) {
4258 /* Bingo. */
4259 Py_DECREF(py_code);
4260 PDATA_APPEND(self->stack, obj, -1);
4261 return 0;
4262 }
4263
4264 /* Look up the (module_name, class_name) pair. */
4265 pair = PyDict_GetItem(inverted_registry, py_code);
4266 if (pair == NULL) {
4267 Py_DECREF(py_code);
4268 PyErr_Format(PyExc_ValueError, "unregistered extension "
4269 "code %ld", code);
4270 return -1;
4271 }
4272 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004273 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004274 */
4275 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004276 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4277 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004278 Py_DECREF(py_code);
4279 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4280 "isn't a 2-tuple of strings", code);
4281 return -1;
4282 }
4283 /* Load the object. */
4284 obj = find_class(module_name, class_name, self->find_class);
4285 if (obj == NULL) {
4286 Py_DECREF(py_code);
4287 return -1;
4288 }
4289 /* Cache code -> obj. */
4290 code = PyDict_SetItem(extension_cache, py_code, obj);
4291 Py_DECREF(py_code);
4292 if (code < 0) {
4293 Py_DECREF(obj);
4294 return -1;
4295 }
4296 PDATA_PUSH(self->stack, obj, -1);
4297 return 0;
4298}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299
4300static int
Tim Peterscba30e22003-02-01 06:24:36 +00004301load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004302{
4303 PyObject *py_str = 0, *value = 0;
4304 int len, l;
4305 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004306
Tim Peters0bc93f52003-02-02 18:29:33 +00004307 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308 if (l < 2) return bad_readline();
4309 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004310 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 value=self->stack->data[len-1];
4312 l=PyDict_SetItem(self->memo, py_str, value);
4313 Py_DECREF(py_str);
4314 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315}
4316
4317
4318static int
Tim Peterscba30e22003-02-01 06:24:36 +00004319load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320{
4321 PyObject *py_key = 0, *value = 0;
4322 unsigned char key;
4323 char *s;
4324 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004325
Tim Peters0bc93f52003-02-02 18:29:33 +00004326 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004329 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4332 value=self->stack->data[len-1];
4333 len=PyDict_SetItem(self->memo, py_key, value);
4334 Py_DECREF(py_key);
4335 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336}
4337
4338
4339static int
Tim Peterscba30e22003-02-01 06:24:36 +00004340load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341{
4342 PyObject *py_key = 0, *value = 0;
4343 long key;
4344 unsigned char c;
4345 char *s;
4346 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004347
Tim Peters0bc93f52003-02-02 18:29:33 +00004348 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004349 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 c = (unsigned char)s[0];
4352 key = (long)c;
4353 c = (unsigned char)s[1];
4354 key |= (long)c << 8;
4355 c = (unsigned char)s[2];
4356 key |= (long)c << 16;
4357 c = (unsigned char)s[3];
4358 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 if (!( py_key = PyInt_FromLong(key))) return -1;
4361 value=self->stack->data[len-1];
4362 len=PyDict_SetItem(self->memo, py_key, value);
4363 Py_DECREF(py_key);
4364 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365}
4366
4367
4368static int
Tim Peterscba30e22003-02-01 06:24:36 +00004369do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370{
4371 PyObject *value = 0, *list = 0, *append_method = 0;
4372 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 len=self->stack->length;
4375 if (!( len >= x && x > 0 )) return stackUnderflow();
4376 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004377 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 if (PyList_Check(list)) {
4382 PyObject *slice;
4383 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004386 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 list_len = PyList_GET_SIZE(list);
4388 i=PyList_SetSlice(list, list_len, list_len, slice);
4389 Py_DECREF(slice);
4390 return i;
4391 }
4392 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004393
Tim Peterscba30e22003-02-01 06:24:36 +00004394 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 return -1;
4396
4397 for (i = x; i < len; i++) {
4398 PyObject *junk;
4399
4400 value=self->stack->data[i];
4401 junk=0;
4402 ARG_TUP(self, value);
4403 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004404 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 NULL);
4406 FREE_ARG_TUP(self);
4407 }
4408 if (! junk) {
4409 Pdata_clear(self->stack, i+1);
4410 self->stack->length=x;
4411 Py_DECREF(append_method);
4412 return -1;
4413 }
4414 Py_DECREF(junk);
4415 }
4416 self->stack->length=x;
4417 Py_DECREF(append_method);
4418 }
4419
4420 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004421}
4422
4423
4424static int
Tim Peterscba30e22003-02-01 06:24:36 +00004425load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426{
4427 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428}
4429
4430
4431static int
Tim Peterscba30e22003-02-01 06:24:36 +00004432load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433{
4434 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004435}
4436
4437
4438static int
Tim Peterscba30e22003-02-01 06:24:36 +00004439do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440{
4441 PyObject *value = 0, *key = 0, *dict = 0;
4442 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 if (!( (len=self->stack->length) >= x
4445 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 for (i = x+1; i < len; i += 2) {
4450 key =self->stack->data[i-1];
4451 value=self->stack->data[i ];
4452 if (PyObject_SetItem(dict, key, value) < 0) {
4453 r=-1;
4454 break;
4455 }
4456 }
4457
4458 Pdata_clear(self->stack, x);
4459
4460 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004461}
4462
4463
Tim Peters84e87f32001-03-17 04:50:51 +00004464static int
Tim Peterscba30e22003-02-01 06:24:36 +00004465load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466{
4467 return do_setitems(self, self->stack->length - 2);
4468}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470static int
Tim Peterscba30e22003-02-01 06:24:36 +00004471load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472{
4473 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474}
4475
Tim Peters84e87f32001-03-17 04:50:51 +00004476
Guido van Rossum60456fd1997-04-09 17:36:32 +00004477static int
Tim Peterscba30e22003-02-01 06:24:36 +00004478load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479{
Tim Peters080c88b2003-02-15 03:01:11 +00004480 PyObject *state, *inst, *slotstate;
4481 PyObject *__setstate__;
4482 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004483 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004484 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485
Tim Peters080c88b2003-02-15 03:01:11 +00004486 /* Stack is ... instance, state. We want to leave instance at
4487 * the stack top, possibly mutated via instance.__setstate__(state).
4488 */
4489 if (self->stack->length < 2)
4490 return stackUnderflow();
4491 PDATA_POP(self->stack, state);
4492 if (state == NULL)
4493 return -1;
4494 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495
Tim Peters080c88b2003-02-15 03:01:11 +00004496 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4497 if (__setstate__ != NULL) {
4498 PyObject *junk = NULL;
4499
4500 /* The explicit __setstate__ is responsible for everything. */
4501 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 if (self->arg) {
4503 junk = PyObject_Call(__setstate__, self->arg, NULL);
4504 FREE_ARG_TUP(self);
4505 }
4506 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004507 if (junk == NULL)
4508 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004509 Py_DECREF(junk);
4510 return 0;
4511 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004512 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4513 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004515
4516 /* A default __setstate__. First see whether state embeds a
4517 * slot state dict too (a proto 2 addition).
4518 */
4519 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4520 PyObject *temp = state;
4521 state = PyTuple_GET_ITEM(temp, 0);
4522 slotstate = PyTuple_GET_ITEM(temp, 1);
4523 Py_INCREF(state);
4524 Py_INCREF(slotstate);
4525 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 }
Tim Peters080c88b2003-02-15 03:01:11 +00004527 else
4528 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529
Tim Peters080c88b2003-02-15 03:01:11 +00004530 /* Set inst.__dict__ from the state dict (if any). */
4531 if (state != Py_None) {
4532 PyObject *dict;
4533 if (! PyDict_Check(state)) {
4534 PyErr_SetString(UnpicklingError, "state is not a "
4535 "dictionary");
4536 goto finally;
4537 }
4538 dict = PyObject_GetAttr(inst, __dict___str);
4539 if (dict == NULL)
4540 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541
Tim Peters080c88b2003-02-15 03:01:11 +00004542 i = 0;
4543 while (PyDict_Next(state, &i, &d_key, &d_value)) {
Antoine Pitrou74309892009-05-02 21:13:23 +00004544 /* normally the keys for instance attributes are
4545 interned. we should try to do that here. */
4546 Py_INCREF(d_key);
4547 if (PyString_CheckExact(d_key))
4548 PyString_InternInPlace(&d_key);
4549 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4550 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004551 goto finally;
Antoine Pitrou74309892009-05-02 21:13:23 +00004552 }
4553 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004554 }
4555 Py_DECREF(dict);
4556 }
4557
4558 /* Also set instance attributes from the slotstate dict (if any). */
4559 if (slotstate != NULL) {
4560 if (! PyDict_Check(slotstate)) {
4561 PyErr_SetString(UnpicklingError, "slot state is not "
4562 "a dictionary");
4563 goto finally;
4564 }
4565 i = 0;
4566 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4567 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4568 goto finally;
4569 }
4570 }
4571 res = 0;
4572
4573 finally:
4574 Py_DECREF(state);
4575 Py_XDECREF(slotstate);
4576 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004577}
4578
4579
4580static int
Tim Peterscba30e22003-02-01 06:24:36 +00004581load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582{
4583 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004585 /* Note that we split the (pickle.py) stack into two stacks, an
4586 object stack and a mark stack. Here we push a mark onto the
4587 mark stack.
4588 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004591 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 s=self->marks_size+20;
4593 if (s <= self->num_marks) s=self->num_marks + 1;
4594 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004595 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004597 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004599 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 PyErr_NoMemory();
4601 return -1;
4602 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004603 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 self->marks_size = s;
4605 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004610}
4611
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612static int
Tim Peterscba30e22003-02-01 06:24:36 +00004613load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614{
4615 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617 PDATA_POP(self->stack, arg_tup);
4618 if (! arg_tup) return -1;
4619 PDATA_POP(self->stack, callable);
4620 if (callable) {
4621 ob = Instance_New(callable, arg_tup);
4622 Py_DECREF(callable);
4623 }
4624 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 PDATA_PUSH(self->stack, ob, -1);
4629 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630}
Tim Peters84e87f32001-03-17 04:50:51 +00004631
Tim Peters4190fb82003-02-02 16:09:05 +00004632/* Just raises an error if we don't know the protocol specified. PROTO
4633 * is the first opcode for protocols >= 2.
4634 */
4635static int
4636load_proto(Unpicklerobject *self)
4637{
4638 int i;
4639 char *protobyte;
4640
4641 i = self->read_func(self, &protobyte, 1);
4642 if (i < 0)
4643 return -1;
4644
4645 i = calc_binint(protobyte, 1);
4646 /* No point checking for < 0, since calc_binint returns an unsigned
4647 * int when chewing on 1 byte.
4648 */
4649 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004650 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004651 return 0;
4652
4653 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4654 return -1;
4655}
4656
Guido van Rossum60456fd1997-04-09 17:36:32 +00004657static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004658load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659{
4660 PyObject *err = 0, *val = 0;
4661 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663 self->num_marks = 0;
4664 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004667 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 switch (s[0]) {
4671 case NONE:
4672 if (load_none(self) < 0)
4673 break;
4674 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 case BININT:
4677 if (load_binint(self) < 0)
4678 break;
4679 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 case BININT1:
4682 if (load_binint1(self) < 0)
4683 break;
4684 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 case BININT2:
4687 if (load_binint2(self) < 0)
4688 break;
4689 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 case INT:
4692 if (load_int(self) < 0)
4693 break;
4694 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 case LONG:
4697 if (load_long(self) < 0)
4698 break;
4699 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Tim Petersee1a53c2003-02-02 02:57:53 +00004701 case LONG1:
4702 if (load_counted_long(self, 1) < 0)
4703 break;
4704 continue;
4705
4706 case LONG4:
4707 if (load_counted_long(self, 4) < 0)
4708 break;
4709 continue;
4710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case FLOAT:
4712 if (load_float(self) < 0)
4713 break;
4714 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case BINFLOAT:
4717 if (load_binfloat(self) < 0)
4718 break;
4719 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 case BINSTRING:
4722 if (load_binstring(self) < 0)
4723 break;
4724 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 case SHORT_BINSTRING:
4727 if (load_short_binstring(self) < 0)
4728 break;
4729 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 case STRING:
4732 if (load_string(self) < 0)
4733 break;
4734 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004735
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004736#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case UNICODE:
4738 if (load_unicode(self) < 0)
4739 break;
4740 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 case BINUNICODE:
4743 if (load_binunicode(self) < 0)
4744 break;
4745 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004746#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004748 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004749 if (load_counted_tuple(self, 0) < 0)
4750 break;
4751 continue;
4752
4753 case TUPLE1:
4754 if (load_counted_tuple(self, 1) < 0)
4755 break;
4756 continue;
4757
4758 case TUPLE2:
4759 if (load_counted_tuple(self, 2) < 0)
4760 break;
4761 continue;
4762
4763 case TUPLE3:
4764 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 break;
4766 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 case TUPLE:
4769 if (load_tuple(self) < 0)
4770 break;
4771 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 case EMPTY_LIST:
4774 if (load_empty_list(self) < 0)
4775 break;
4776 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 case LIST:
4779 if (load_list(self) < 0)
4780 break;
4781 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 case EMPTY_DICT:
4784 if (load_empty_dict(self) < 0)
4785 break;
4786 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 case DICT:
4789 if (load_dict(self) < 0)
4790 break;
4791 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 case OBJ:
4794 if (load_obj(self) < 0)
4795 break;
4796 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 case INST:
4799 if (load_inst(self) < 0)
4800 break;
4801 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004802
Tim Peterseab7db32003-02-13 18:24:14 +00004803 case NEWOBJ:
4804 if (load_newobj(self) < 0)
4805 break;
4806 continue;
4807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 case GLOBAL:
4809 if (load_global(self) < 0)
4810 break;
4811 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 case APPEND:
4814 if (load_append(self) < 0)
4815 break;
4816 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 case APPENDS:
4819 if (load_appends(self) < 0)
4820 break;
4821 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 case BUILD:
4824 if (load_build(self) < 0)
4825 break;
4826 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 case DUP:
4829 if (load_dup(self) < 0)
4830 break;
4831 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 case BINGET:
4834 if (load_binget(self) < 0)
4835 break;
4836 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 case LONG_BINGET:
4839 if (load_long_binget(self) < 0)
4840 break;
4841 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004843 case GET:
4844 if (load_get(self) < 0)
4845 break;
4846 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004847
Tim Peters2d629652003-02-04 05:06:17 +00004848 case EXT1:
4849 if (load_extension(self, 1) < 0)
4850 break;
4851 continue;
4852
4853 case EXT2:
4854 if (load_extension(self, 2) < 0)
4855 break;
4856 continue;
4857
4858 case EXT4:
4859 if (load_extension(self, 4) < 0)
4860 break;
4861 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case MARK:
4863 if (load_mark(self) < 0)
4864 break;
4865 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case BINPUT:
4868 if (load_binput(self) < 0)
4869 break;
4870 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 case LONG_BINPUT:
4873 if (load_long_binput(self) < 0)
4874 break;
4875 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004877 case PUT:
4878 if (load_put(self) < 0)
4879 break;
4880 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 case POP:
4883 if (load_pop(self) < 0)
4884 break;
4885 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 case POP_MARK:
4888 if (load_pop_mark(self) < 0)
4889 break;
4890 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case SETITEM:
4893 if (load_setitem(self) < 0)
4894 break;
4895 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 case SETITEMS:
4898 if (load_setitems(self) < 0)
4899 break;
4900 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case STOP:
4903 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004905 case PERSID:
4906 if (load_persid(self) < 0)
4907 break;
4908 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 case BINPERSID:
4911 if (load_binpersid(self) < 0)
4912 break;
4913 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 case REDUCE:
4916 if (load_reduce(self) < 0)
4917 break;
4918 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004919
Tim Peters4190fb82003-02-02 16:09:05 +00004920 case PROTO:
4921 if (load_proto(self) < 0)
4922 break;
4923 continue;
4924
Tim Peters3c67d792003-02-02 17:59:11 +00004925 case NEWTRUE:
4926 if (load_bool(self, Py_True) < 0)
4927 break;
4928 continue;
4929
4930 case NEWFALSE:
4931 if (load_bool(self, Py_False) < 0)
4932 break;
4933 continue;
4934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 case '\0':
4936 /* end of file */
4937 PyErr_SetNone(PyExc_EOFError);
4938 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004940 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004941 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004942 "invalid load key, '%s'.",
4943 "c", s[0]);
4944 return NULL;
4945 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 break;
4948 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004950 if ((err = PyErr_Occurred())) {
4951 if (err == PyExc_EOFError) {
4952 PyErr_SetNone(PyExc_EOFError);
4953 }
4954 return NULL;
4955 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004957 PDATA_POP(self->stack, val);
4958 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004959}
Tim Peters84e87f32001-03-17 04:50:51 +00004960
Guido van Rossum60456fd1997-04-09 17:36:32 +00004961
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962/* No-load functions to support noload, which is used to
4963 find persistent references. */
4964
4965static int
Tim Peterscba30e22003-02-01 06:24:36 +00004966noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967{
4968 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 if ((i = marker(self)) < 0) return -1;
4971 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004972}
4973
4974
4975static int
Tim Peterscba30e22003-02-01 06:24:36 +00004976noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977{
4978 int i;
4979 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 if ((i = marker(self)) < 0) return -1;
4982 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004983 if (self->readline_func(self, &s) < 0) return -1;
4984 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004985 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004987}
4988
4989static int
Tim Peterseab7db32003-02-13 18:24:14 +00004990noload_newobj(Unpicklerobject *self)
4991{
4992 PyObject *obj;
4993
4994 PDATA_POP(self->stack, obj); /* pop argtuple */
4995 if (obj == NULL) return -1;
4996 Py_DECREF(obj);
4997
4998 PDATA_POP(self->stack, obj); /* pop cls */
4999 if (obj == NULL) return -1;
5000 Py_DECREF(obj);
5001
5002 PDATA_APPEND(self->stack, Py_None, -1);
5003 return 0;
5004}
5005
5006static int
Tim Peterscba30e22003-02-01 06:24:36 +00005007noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008{
5009 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005010
Tim Peters0bc93f52003-02-02 18:29:33 +00005011 if (self->readline_func(self, &s) < 0) return -1;
5012 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 PDATA_APPEND(self->stack, Py_None,-1);
5014 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005015}
5016
5017static int
Tim Peterscba30e22003-02-01 06:24:36 +00005018noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 if (self->stack->length < 2) return stackUnderflow();
5022 Pdata_clear(self->stack, self->stack->length-2);
5023 PDATA_APPEND(self->stack, Py_None,-1);
5024 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005025}
5026
5027static int
5028noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005029
Guido van Rossum053b8df1998-11-25 16:18:00 +00005030 if (self->stack->length < 1) return stackUnderflow();
5031 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00005032 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005033}
5034
Tim Peters2d629652003-02-04 05:06:17 +00005035static int
5036noload_extension(Unpicklerobject *self, int nbytes)
5037{
5038 char *codebytes;
5039
5040 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5041 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5042 PDATA_APPEND(self->stack, Py_None, -1);
5043 return 0;
5044}
5045
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005046
5047static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005048noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005049{
5050 PyObject *err = 0, *val = 0;
5051 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053 self->num_marks = 0;
5054 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00005057 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005059
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005060 switch (s[0]) {
5061 case NONE:
5062 if (load_none(self) < 0)
5063 break;
5064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 case BININT:
5067 if (load_binint(self) < 0)
5068 break;
5069 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 case BININT1:
5072 if (load_binint1(self) < 0)
5073 break;
5074 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 case BININT2:
5077 if (load_binint2(self) < 0)
5078 break;
5079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 case INT:
5082 if (load_int(self) < 0)
5083 break;
5084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 case LONG:
5087 if (load_long(self) < 0)
5088 break;
5089 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005090
Tim Peters4190fb82003-02-02 16:09:05 +00005091 case LONG1:
5092 if (load_counted_long(self, 1) < 0)
5093 break;
5094 continue;
5095
5096 case LONG4:
5097 if (load_counted_long(self, 4) < 0)
5098 break;
5099 continue;
5100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005101 case FLOAT:
5102 if (load_float(self) < 0)
5103 break;
5104 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 case BINFLOAT:
5107 if (load_binfloat(self) < 0)
5108 break;
5109 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 case BINSTRING:
5112 if (load_binstring(self) < 0)
5113 break;
5114 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 case SHORT_BINSTRING:
5117 if (load_short_binstring(self) < 0)
5118 break;
5119 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121 case STRING:
5122 if (load_string(self) < 0)
5123 break;
5124 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005125
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005126#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005127 case UNICODE:
5128 if (load_unicode(self) < 0)
5129 break;
5130 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 case BINUNICODE:
5133 if (load_binunicode(self) < 0)
5134 break;
5135 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005136#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005139 if (load_counted_tuple(self, 0) < 0)
5140 break;
5141 continue;
5142
5143 case TUPLE1:
5144 if (load_counted_tuple(self, 1) < 0)
5145 break;
5146 continue;
5147
5148 case TUPLE2:
5149 if (load_counted_tuple(self, 2) < 0)
5150 break;
5151 continue;
5152
5153 case TUPLE3:
5154 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155 break;
5156 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158 case TUPLE:
5159 if (load_tuple(self) < 0)
5160 break;
5161 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163 case EMPTY_LIST:
5164 if (load_empty_list(self) < 0)
5165 break;
5166 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 case LIST:
5169 if (load_list(self) < 0)
5170 break;
5171 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005173 case EMPTY_DICT:
5174 if (load_empty_dict(self) < 0)
5175 break;
5176 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005178 case DICT:
5179 if (load_dict(self) < 0)
5180 break;
5181 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005183 case OBJ:
5184 if (noload_obj(self) < 0)
5185 break;
5186 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005188 case INST:
5189 if (noload_inst(self) < 0)
5190 break;
5191 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005192
Tim Peterseab7db32003-02-13 18:24:14 +00005193 case NEWOBJ:
5194 if (noload_newobj(self) < 0)
5195 break;
5196 continue;
5197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005198 case GLOBAL:
5199 if (noload_global(self) < 0)
5200 break;
5201 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005203 case APPEND:
5204 if (load_append(self) < 0)
5205 break;
5206 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 case APPENDS:
5209 if (load_appends(self) < 0)
5210 break;
5211 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005213 case BUILD:
5214 if (noload_build(self) < 0)
5215 break;
5216 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005218 case DUP:
5219 if (load_dup(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 BINGET:
5224 if (load_binget(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 LONG_BINGET:
5229 if (load_long_binget(self) < 0)
5230 break;
5231 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005233 case GET:
5234 if (load_get(self) < 0)
5235 break;
5236 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005237
Tim Peters2d629652003-02-04 05:06:17 +00005238 case EXT1:
5239 if (noload_extension(self, 1) < 0)
5240 break;
5241 continue;
5242
5243 case EXT2:
5244 if (noload_extension(self, 2) < 0)
5245 break;
5246 continue;
5247
5248 case EXT4:
5249 if (noload_extension(self, 4) < 0)
5250 break;
5251 continue;
5252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 case MARK:
5254 if (load_mark(self) < 0)
5255 break;
5256 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 case BINPUT:
5259 if (load_binput(self) < 0)
5260 break;
5261 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005263 case LONG_BINPUT:
5264 if (load_long_binput(self) < 0)
5265 break;
5266 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005268 case PUT:
5269 if (load_put(self) < 0)
5270 break;
5271 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005273 case POP:
5274 if (load_pop(self) < 0)
5275 break;
5276 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005278 case POP_MARK:
5279 if (load_pop_mark(self) < 0)
5280 break;
5281 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005283 case SETITEM:
5284 if (load_setitem(self) < 0)
5285 break;
5286 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005288 case SETITEMS:
5289 if (load_setitems(self) < 0)
5290 break;
5291 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005293 case STOP:
5294 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005296 case PERSID:
5297 if (load_persid(self) < 0)
5298 break;
5299 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301 case BINPERSID:
5302 if (load_binpersid(self) < 0)
5303 break;
5304 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 case REDUCE:
5307 if (noload_reduce(self) < 0)
5308 break;
5309 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005310
Tim Peters4190fb82003-02-02 16:09:05 +00005311 case PROTO:
5312 if (load_proto(self) < 0)
5313 break;
5314 continue;
5315
Tim Peters3c67d792003-02-02 17:59:11 +00005316 case NEWTRUE:
5317 if (load_bool(self, Py_True) < 0)
5318 break;
5319 continue;
5320
5321 case NEWFALSE:
5322 if (load_bool(self, Py_False) < 0)
5323 break;
5324 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005325 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005326 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005327 "invalid load key, '%s'.",
5328 "c", s[0]);
5329 return NULL;
5330 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005332 break;
5333 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 if ((err = PyErr_Occurred())) {
5336 if (err == PyExc_EOFError) {
5337 PyErr_SetNone(PyExc_EOFError);
5338 }
5339 return NULL;
5340 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005342 PDATA_POP(self->stack, val);
5343 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005344}
Tim Peters84e87f32001-03-17 04:50:51 +00005345
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005346
Guido van Rossum60456fd1997-04-09 17:36:32 +00005347static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005348Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005350 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005351}
5352
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005353static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005354Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005356 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005357}
5358
Guido van Rossum60456fd1997-04-09 17:36:32 +00005359
5360static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005361 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005362 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005363 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005364 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005365 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005366 "noload() -- not load a pickle, but go through most of the motions\n"
5367 "\n"
5368 "This function can be used to read past a pickle without instantiating\n"
5369 "any objects or importing any modules. It can also be used to find all\n"
5370 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005371 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005372 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005373 {NULL, NULL} /* sentinel */
5374};
5375
5376
5377static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005378newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379{
5380 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005381
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005382 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005383 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385 self->file = NULL;
5386 self->arg = NULL;
5387 self->stack = (Pdata*)Pdata_New();
5388 self->pers_func = NULL;
5389 self->last_string = NULL;
5390 self->marks = NULL;
5391 self->num_marks = 0;
5392 self->marks_size = 0;
5393 self->buf_size = 0;
5394 self->read = NULL;
5395 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005397
Tim Peterscba30e22003-02-01 06:24:36 +00005398 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005399 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005400
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005401 if (!self->stack)
5402 goto err;
5403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005404 Py_INCREF(f);
5405 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005407 /* Set read, readline based on type of f */
5408 if (PyFile_Check(f)) {
5409 self->fp = PyFile_AsFile(f);
5410 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005411 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005412 "I/O operation on closed file");
5413 goto err;
5414 }
5415 self->read_func = read_file;
5416 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005417 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 else if (PycStringIO_InputCheck(f)) {
5419 self->fp = NULL;
5420 self->read_func = read_cStringIO;
5421 self->readline_func = readline_cStringIO;
5422 }
5423 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005425 self->fp = NULL;
5426 self->read_func = read_other;
5427 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005429 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5430 (self->read = PyObject_GetAttr(f, read_str)))) {
5431 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005432 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005433 "argument must have 'read' and "
5434 "'readline' attributes" );
5435 goto err;
5436 }
5437 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005438 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005440 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005442 err:
5443 Py_DECREF((PyObject *)self);
5444 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005445}
5446
5447
5448static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005449get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005452}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005453
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005454
Guido van Rossum60456fd1997-04-09 17:36:32 +00005455static void
Tim Peterscba30e22003-02-01 06:24:36 +00005456Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005457{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005458 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 Py_XDECREF(self->readline);
5460 Py_XDECREF(self->read);
5461 Py_XDECREF(self->file);
5462 Py_XDECREF(self->memo);
5463 Py_XDECREF(self->stack);
5464 Py_XDECREF(self->pers_func);
5465 Py_XDECREF(self->arg);
5466 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005467 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005469 if (self->marks) {
5470 free(self->marks);
5471 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 if (self->buf_size) {
5474 free(self->buf);
5475 }
Tim Peters84e87f32001-03-17 04:50:51 +00005476
Christian Heimese93237d2007-12-19 02:37:44 +00005477 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005478}
5479
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005480static int
5481Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5482{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005483 Py_VISIT(self->readline);
5484 Py_VISIT(self->read);
5485 Py_VISIT(self->file);
5486 Py_VISIT(self->memo);
5487 Py_VISIT(self->stack);
5488 Py_VISIT(self->pers_func);
5489 Py_VISIT(self->arg);
5490 Py_VISIT(self->last_string);
5491 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005492 return 0;
5493}
5494
5495static int
5496Unpickler_clear(Unpicklerobject *self)
5497{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005498 Py_CLEAR(self->readline);
5499 Py_CLEAR(self->read);
5500 Py_CLEAR(self->file);
5501 Py_CLEAR(self->memo);
5502 Py_CLEAR(self->stack);
5503 Py_CLEAR(self->pers_func);
5504 Py_CLEAR(self->arg);
5505 Py_CLEAR(self->last_string);
5506 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005507 return 0;
5508}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005509
5510static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005511Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005512{
5513 if (!strcmp(name, "persistent_load")) {
5514 if (!self->pers_func) {
5515 PyErr_SetString(PyExc_AttributeError, name);
5516 return NULL;
5517 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005519 Py_INCREF(self->pers_func);
5520 return self->pers_func;
5521 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005523 if (!strcmp(name, "find_global")) {
5524 if (!self->find_class) {
5525 PyErr_SetString(PyExc_AttributeError, name);
5526 return NULL;
5527 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005529 Py_INCREF(self->find_class);
5530 return self->find_class;
5531 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005533 if (!strcmp(name, "memo")) {
5534 if (!self->memo) {
5535 PyErr_SetString(PyExc_AttributeError, name);
5536 return NULL;
5537 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005539 Py_INCREF(self->memo);
5540 return self->memo;
5541 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005543 if (!strcmp(name, "UnpicklingError")) {
5544 Py_INCREF(UnpicklingError);
5545 return UnpicklingError;
5546 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005549}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005550
Guido van Rossum60456fd1997-04-09 17:36:32 +00005551
5552static int
Tim Peterscba30e22003-02-01 06:24:36 +00005553Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005554{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005556 if (!strcmp(name, "persistent_load")) {
5557 Py_XDECREF(self->pers_func);
5558 self->pers_func = value;
5559 Py_XINCREF(value);
5560 return 0;
5561 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005563 if (!strcmp(name, "find_global")) {
5564 Py_XDECREF(self->find_class);
5565 self->find_class = value;
5566 Py_XINCREF(value);
5567 return 0;
5568 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005570 if (! value) {
5571 PyErr_SetString(PyExc_TypeError,
5572 "attribute deletion is not supported");
5573 return -1;
5574 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005576 if (strcmp(name, "memo") == 0) {
5577 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005578 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005579 "memo must be a dictionary");
5580 return -1;
5581 }
5582 Py_XDECREF(self->memo);
5583 self->memo = value;
5584 Py_INCREF(value);
5585 return 0;
5586 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005588 PyErr_SetString(PyExc_AttributeError, name);
5589 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005590}
5591
Tim Peters5bd2a792003-02-01 16:45:06 +00005592/* ---------------------------------------------------------------------------
5593 * Module-level functions.
5594 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005595
Martin v. Löwis544f1192004-07-27 05:22:33 +00005596/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005597static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005598cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005599{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005600 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005601 PyObject *ob, *file, *res = NULL;
5602 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005603 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005604
Martin v. Löwis544f1192004-07-27 05:22:33 +00005605 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5606 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005607 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005608
Tim Peters5bd2a792003-02-01 16:45:06 +00005609 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005610 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005612 if (dump(pickler, ob) < 0)
5613 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005615 Py_INCREF(Py_None);
5616 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005618 finally:
5619 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005621 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005622}
5623
5624
Martin v. Löwis544f1192004-07-27 05:22:33 +00005625/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005626static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005627cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005628{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005629 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005630 PyObject *ob, *file = 0, *res = NULL;
5631 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005632 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005633
Martin v. Löwis544f1192004-07-27 05:22:33 +00005634 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5635 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005636 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005637
Tim Peterscba30e22003-02-01 06:24:36 +00005638 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005639 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005640
Tim Peters5bd2a792003-02-01 16:45:06 +00005641 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005642 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005644 if (dump(pickler, ob) < 0)
5645 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005647 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005649 finally:
5650 Py_XDECREF(pickler);
5651 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005653 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005654}
5655
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005656
Tim Peters5bd2a792003-02-01 16:45:06 +00005657/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005658static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005659cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005660{
5661 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005662 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005663
Tim Peterscba30e22003-02-01 06:24:36 +00005664 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005665 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005667 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005669 finally:
5670 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005672 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005673}
5674
5675
Tim Peters5bd2a792003-02-01 16:45:06 +00005676/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005677static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005678cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005679{
5680 PyObject *ob, *file = 0, *res = NULL;
5681 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005682
Tim Peterscba30e22003-02-01 06:24:36 +00005683 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005684 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005685
Tim Peterscba30e22003-02-01 06:24:36 +00005686 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005687 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005688
Tim Peterscba30e22003-02-01 06:24:36 +00005689 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005690 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005692 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005694 finally:
5695 Py_XDECREF(file);
5696 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005698 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005699}
5700
5701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005702PyDoc_STRVAR(Unpicklertype__doc__,
5703"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005704
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005705static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005706 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005707 "cPickle.Unpickler", /*tp_name*/
5708 sizeof(Unpicklerobject), /*tp_basicsize*/
5709 0,
5710 (destructor)Unpickler_dealloc, /* tp_dealloc */
5711 0, /* tp_print */
5712 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5713 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5714 0, /* tp_compare */
5715 0, /* tp_repr */
5716 0, /* tp_as_number */
5717 0, /* tp_as_sequence */
5718 0, /* tp_as_mapping */
5719 0, /* tp_hash */
5720 0, /* tp_call */
5721 0, /* tp_str */
5722 0, /* tp_getattro */
5723 0, /* tp_setattro */
5724 0, /* tp_as_buffer */
5725 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5726 Unpicklertype__doc__, /* tp_doc */
5727 (traverseproc)Unpickler_traverse, /* tp_traverse */
5728 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005729};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005730
Guido van Rossum60456fd1997-04-09 17:36:32 +00005731static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005732 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5733 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005734 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005735 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005736 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005737 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005738
Martin v. Löwis544f1192004-07-27 05:22:33 +00005739 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5740 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005741 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005742 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005743 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005744 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005745
Georg Brandl96a8c392006-05-29 21:04:52 +00005746 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005747 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005748
Neal Norwitzb0493252002-03-31 14:44:22 +00005749 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005750 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005751
Martin v. Löwis544f1192004-07-27 05:22:33 +00005752 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5753 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005754 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005755 "This takes a file-like object for writing a pickle data stream.\n"
5756 "The optional proto argument tells the pickler to use the given\n"
5757 "protocol; supported protocols are 0, 1, 2. The default\n"
5758 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5759 "only protocol that can be written to a file opened in text\n"
5760 "mode and read back successfully. When using a protocol higher\n"
5761 "than 0, make sure the file is opened in binary mode, both when\n"
5762 "pickling and unpickling.)\n"
5763 "\n"
5764 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5765 "more efficient than protocol 1.\n"
5766 "\n"
5767 "Specifying a negative protocol version selects the highest\n"
5768 "protocol version supported. The higher the protocol used, the\n"
5769 "more recent the version of Python needed to read the pickle\n"
5770 "produced.\n"
5771 "\n"
5772 "The file parameter must have a write() method that accepts a single\n"
5773 "string argument. It can thus be an open file object, a StringIO\n"
5774 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005775 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005776
Georg Brandl96a8c392006-05-29 21:04:52 +00005777 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005778 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5779
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005780 { NULL, NULL }
5781};
5782
Guido van Rossum60456fd1997-04-09 17:36:32 +00005783static int
Tim Peterscba30e22003-02-01 06:24:36 +00005784init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005785{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005786 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005787
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005788#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005789
Tim Peters3cfe7542003-05-21 21:29:48 +00005790 if (PyType_Ready(&Unpicklertype) < 0)
5791 return -1;
5792 if (PyType_Ready(&Picklertype) < 0)
5793 return -1;
5794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005795 INIT_STR(__class__);
5796 INIT_STR(__getinitargs__);
5797 INIT_STR(__dict__);
5798 INIT_STR(__getstate__);
5799 INIT_STR(__setstate__);
5800 INIT_STR(__name__);
5801 INIT_STR(__main__);
5802 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005803 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005804 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005805 INIT_STR(append);
5806 INIT_STR(read);
5807 INIT_STR(readline);
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005808 INIT_STR(copyreg);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005809 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005810
Georg Brandldffbf5f2008-05-20 07:49:57 +00005811 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005812 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005813
Tim Peters1f1b2d22003-02-01 02:16:37 +00005814 /* This is special because we want to use a different
5815 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005816 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005817 if (!dispatch_table) return -1;
5818
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005819 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005820 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005821 if (!extension_registry) return -1;
5822
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005823 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005824 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005825 if (!inverted_registry) return -1;
5826
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005827 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005828 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005829 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005830
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005831 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005832
Tim Peters731098b2003-02-04 20:56:09 +00005833 if (!(empty_tuple = PyTuple_New(0)))
5834 return -1;
5835
5836 two_tuple = PyTuple_New(2);
5837 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005838 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005839 /* We use this temp container with no regard to refcounts, or to
5840 * keeping containees alive. Exempt from GC, because we don't
5841 * want anything looking at two_tuple() by magic.
5842 */
5843 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005845 /* Ugh */
5846 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5847 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5848 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005850 if (!( t=PyDict_New())) return -1;
5851 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005852 "def __str__(self):\n"
5853 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5854 Py_file_input,
5855 module_dict, t) )) return -1;
5856 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005858 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005859 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005860 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005862 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005863
Tim Peterscba30e22003-02-01 06:24:36 +00005864 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005865 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005866 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005867 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005869 if (!( t=PyDict_New())) return -1;
5870 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005871 "def __str__(self):\n"
5872 " a=self.args\n"
5873 " a=a and type(a[0]) or '(what)'\n"
5874 " return 'Cannot pickle %s objects' % a\n"
5875 , Py_file_input,
5876 module_dict, t) )) return -1;
5877 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005879 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005880 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005881 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005883 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005885 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005886 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005887 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005888
Martin v. Löwis658009a2002-09-16 17:26:24 +00005889 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5890 UnpicklingError, NULL)))
5891 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005893 if (PyDict_SetItemString(module_dict, "PickleError",
5894 PickleError) < 0)
5895 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005897 if (PyDict_SetItemString(module_dict, "PicklingError",
5898 PicklingError) < 0)
5899 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005901 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5902 UnpicklingError) < 0)
5903 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005905 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5906 UnpickleableError) < 0)
5907 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005909 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5910 BadPickleGet) < 0)
5911 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005913 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005915 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005916}
5917
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005918#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5919#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005920#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005921PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005922initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005923{
5924 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005925 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005926 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005927 PyObject *format_version;
5928 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005929
Alexandre Vassalotti3c4971c2008-05-16 19:14:31 +00005930 /* XXX: Should mention that the pickle module will include the C
5931 XXX: optimized implementation automatically. */
5932 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5933 "Python 3.0", 2) < 0)
5934 return;
5935
Christian Heimese93237d2007-12-19 02:37:44 +00005936 Py_TYPE(&Picklertype) = &PyType_Type;
5937 Py_TYPE(&Unpicklertype) = &PyType_Type;
5938 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005940 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005941 * so we're forced to use a temporary dictionary. :(
5942 */
5943 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005944 if (!di) return;
5945 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005947 /* Create the module and add the functions */
5948 m = Py_InitModule4("cPickle", cPickle_methods,
5949 cPickle_module_documentation,
5950 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005951 if (m == NULL)
5952 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005954 /* Add some symbolic constants to the module */
5955 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005956 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005957 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005958 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005960 /* Copy data from di. Waaa. */
5961 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5962 if (PyObject_SetItem(d, k, v) < 0) {
5963 Py_DECREF(di);
5964 return;
5965 }
5966 }
5967 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005968
Tim Peters8587b3c2003-02-13 15:44:41 +00005969 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5970 if (i < 0)
5971 return;
5972
Tim Peters5b7da392003-02-04 00:21:07 +00005973 /* These are purely informational; no code uses them. */
5974 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005975 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00005976 /* Format versions we can read. */
5977 compatible_formats = Py_BuildValue("[sssss]",
5978 "1.0", /* Original protocol 0 */
5979 "1.1", /* Protocol 0 + INST */
5980 "1.2", /* Original protocol 1 */
5981 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005982 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005983 PyDict_SetItemString(d, "format_version", format_version);
5984 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5985 Py_XDECREF(format_version);
5986 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005987}