blob: a84942403bc7055f8d5c242e2315874cfd60c886 [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;
Amaury Forgeot d'Arc74b30162009-07-23 19:26:02 +0000666
667 if (PyString_GET_SIZE(str) != n) {
668 PyErr_SetNone(PyExc_EOFError);
669 return -1;
670 }
671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000673}
674
675
Martin v. Löwis18e16552006-02-15 17:27:45 +0000676static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000677readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678{
679 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000680 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000682 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
683 return -1;
684 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000686 if ((str_size = PyString_Size(str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 Py_XDECREF(self->last_string);
690 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000692 if (! (*s = PyString_AsString(str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000695 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000696}
697
Tim Petersee1a53c2003-02-02 02:57:53 +0000698/* Copy the first n bytes from s into newly malloc'ed memory, plus a
699 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
700 * The caller is responsible for free()'ing the return value.
701 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000702static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000703pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704{
Tim Petersee1a53c2003-02-02 02:57:53 +0000705 char *r = (char *)malloc(n+1);
706 if (r == NULL)
707 return (char*)PyErr_NoMemory();
708 memcpy(r, s, n);
709 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000711}
712
713
714static int
Tim Peterscba30e22003-02-01 06:24:36 +0000715get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716{
717 PyObject *value, *mv;
718 long c_value;
719 char s[30];
720 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 if (!( mv = PyDict_GetItem(self->memo, id))) {
723 PyErr_SetObject(PyExc_KeyError, id);
724 return -1;
725 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Tim Peterscba30e22003-02-01 06:24:36 +0000727 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 if (!( PyInt_Check(value))) {
731 PyErr_SetString(PicklingError, "no int where int expected in memo");
732 return -1;
733 }
734 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 if (!self->bin) {
737 s[0] = GET;
738 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
739 len = strlen(s);
740 }
741 else if (Pdata_Check(self->file)) {
742 if (write_other(self, NULL, 0) < 0) return -1;
743 PDATA_APPEND(self->file, mv, -1);
744 return 0;
745 }
746 else {
747 if (c_value < 256) {
748 s[0] = BINGET;
749 s[1] = (int)(c_value & 0xff);
750 len = 2;
751 }
752 else {
753 s[0] = LONG_BINGET;
754 s[1] = (int)(c_value & 0xff);
755 s[2] = (int)((c_value >> 8) & 0xff);
756 s[3] = (int)((c_value >> 16) & 0xff);
757 s[4] = (int)((c_value >> 24) & 0xff);
758 len = 5;
759 }
760 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000761
Tim Peters0bc93f52003-02-02 18:29:33 +0000762 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000764
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000765 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000766}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000767
Guido van Rossum60456fd1997-04-09 17:36:32 +0000768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769static int
Tim Peterscba30e22003-02-01 06:24:36 +0000770put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771{
Christian Heimese93237d2007-12-19 02:37:44 +0000772 if (Py_REFCNT(ob) < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775 return put2(self, ob);
776}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000777
Guido van Rossum053b8df1998-11-25 16:18:00 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779static int
Tim Peterscba30e22003-02-01 06:24:36 +0000780put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000781{
782 char c_str[30];
783 int p;
784 size_t len;
785 int res = -1;
786 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 if (self->fast)
789 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 if ((p = PyDict_Size(self->memo)) < 0)
792 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000795 /* XXX Why?
796 * XXX And does "positive" really mean non-negative?
797 * XXX pickle.py starts with PUT index 0, not 1. This makes for
798 * XXX gratuitous differences between the pickling modules.
799 */
Tim Peterscba30e22003-02-01 06:24:36 +0000800 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000801
Tim Peterscba30e22003-02-01 06:24:36 +0000802 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000804
Tim Peterscba30e22003-02-01 06:24:36 +0000805 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000806 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000807
Tim Peterscba30e22003-02-01 06:24:36 +0000808 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000809 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000811 PyTuple_SET_ITEM(t, 0, memo_len);
812 Py_INCREF(memo_len);
813 PyTuple_SET_ITEM(t, 1, ob);
814 Py_INCREF(ob);
815
816 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
817 goto finally;
818
819 if (!self->bin) {
820 c_str[0] = PUT;
821 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
822 len = strlen(c_str);
823 }
824 else if (Pdata_Check(self->file)) {
825 if (write_other(self, NULL, 0) < 0) return -1;
826 PDATA_APPEND(self->file, memo_len, -1);
827 res=0; /* Job well done ;) */
828 goto finally;
829 }
830 else {
831 if (p >= 256) {
832 c_str[0] = LONG_BINPUT;
833 c_str[1] = (int)(p & 0xff);
834 c_str[2] = (int)((p >> 8) & 0xff);
835 c_str[3] = (int)((p >> 16) & 0xff);
836 c_str[4] = (int)((p >> 24) & 0xff);
837 len = 5;
838 }
839 else {
840 c_str[0] = BINPUT;
841 c_str[1] = p;
842 len = 2;
843 }
844 }
845
Tim Peters0bc93f52003-02-02 18:29:33 +0000846 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847 goto finally;
848
849 res = 0;
850
851 finally:
852 Py_XDECREF(py_ob_id);
853 Py_XDECREF(memo_len);
854 Py_XDECREF(t);
855
856 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000857}
858
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000859static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000860whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000861{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000862 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 PyObject *module = 0, *modules_dict = 0,
864 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000866 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000867 if (module)
868 return module;
869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
870 PyErr_Clear();
871 else
872 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000873
Tim Peterscba30e22003-02-01 06:24:36 +0000874 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 i = 0;
878 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 global_name_attr = PyObject_GetAttr(module, global_name);
883 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000884 if (PyErr_ExceptionMatches(PyExc_AttributeError))
885 PyErr_Clear();
886 else
887 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000888 continue;
889 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000891 if (global_name_attr != global) {
892 Py_DECREF(global_name_attr);
893 continue;
894 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000896 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 break;
899 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 /* The following implements the rule in pickle.py added in 1.5
902 that used __main__ if no module is found. I don't actually
903 like this rule. jlf
904 */
905 if (!j) {
906 j=1;
907 name=__main___str;
908 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000910 Py_INCREF(name);
911 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000912}
913
914
Guido van Rossum60456fd1997-04-09 17:36:32 +0000915static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000916fast_save_enter(Picklerobject *self, PyObject *obj)
917{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 /* if fast_container < 0, we're doing an error exit. */
919 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
920 PyObject *key = NULL;
921 if (self->fast_memo == NULL) {
922 self->fast_memo = PyDict_New();
923 if (self->fast_memo == NULL) {
924 self->fast_container = -1;
925 return 0;
926 }
927 }
928 key = PyLong_FromVoidPtr(obj);
929 if (key == NULL)
930 return 0;
931 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000932 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000934 "fast mode: can't pickle cyclic objects "
935 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000936 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937 self->fast_container = -1;
938 return 0;
939 }
940 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 self->fast_container = -1;
943 return 0;
944 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000945 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000946 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000947 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000948}
949
Tim Peterscba30e22003-02-01 06:24:36 +0000950int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000951fast_save_leave(Picklerobject *self, PyObject *obj)
952{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
954 PyObject *key = PyLong_FromVoidPtr(obj);
955 if (key == NULL)
956 return 0;
957 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000958 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000959 return 0;
960 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000961 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000962 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000964}
965
966static int
Tim Peterscba30e22003-02-01 06:24:36 +0000967save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000968{
969 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000970 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000971 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000974}
975
Guido van Rossum77f6a652002-04-03 22:41:51 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000978{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000979 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000980 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000981 long l = PyInt_AS_LONG((PyIntObject *)args);
982
Tim Peters3c67d792003-02-02 17:59:11 +0000983 if (self->proto >= 2) {
984 char opcode = l ? NEWTRUE : NEWFALSE;
985 if (self->write_func(self, &opcode, 1) < 0)
986 return -1;
987 }
988 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000989 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000990 return 0;
991}
Tim Peters84e87f32001-03-17 04:50:51 +0000992
Guido van Rossum60456fd1997-04-09 17:36:32 +0000993static int
Tim Peterscba30e22003-02-01 06:24:36 +0000994save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995{
996 char c_str[32];
997 long l = PyInt_AS_LONG((PyIntObject *)args);
998 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001000 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001001#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002 || l > 0x7fffffffL
1003 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +00001004#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 ) {
1006 /* Text-mode pickle, or long too big to fit in the 4-byte
1007 * signed BININT format: store as a string.
1008 */
1009 c_str[0] = INT;
1010 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001011 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012 return -1;
1013 }
1014 else {
1015 /* Binary pickle and l fits in a signed 4-byte int. */
1016 c_str[1] = (int)( l & 0xff);
1017 c_str[2] = (int)((l >> 8) & 0xff);
1018 c_str[3] = (int)((l >> 16) & 0xff);
1019 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1022 if (c_str[2] == 0) {
1023 c_str[0] = BININT1;
1024 len = 2;
1025 }
1026 else {
1027 c_str[0] = BININT2;
1028 len = 3;
1029 }
1030 }
1031 else {
1032 c_str[0] = BININT;
1033 len = 5;
1034 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Peters0bc93f52003-02-02 18:29:33 +00001036 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001037 return -1;
1038 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001041}
1042
1043
1044static int
Tim Peterscba30e22003-02-01 06:24:36 +00001045save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001046{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001047 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001048 int res = -1;
1049 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001051 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001052
Tim Petersee1a53c2003-02-02 02:57:53 +00001053 if (self->proto >= 2) {
1054 /* Linear-time pickling. */
1055 size_t nbits;
1056 size_t nbytes;
1057 unsigned char *pdata;
1058 char c_str[5];
1059 int i;
1060 int sign = _PyLong_Sign(args);
1061
1062 if (sign == 0) {
1063 /* It's 0 -- an empty bytestring. */
1064 c_str[0] = LONG1;
1065 c_str[1] = 0;
1066 i = self->write_func(self, c_str, 2);
1067 if (i < 0) goto finally;
1068 res = 0;
1069 goto finally;
1070 }
1071 nbits = _PyLong_NumBits(args);
1072 if (nbits == (size_t)-1 && PyErr_Occurred())
1073 goto finally;
1074 /* How many bytes do we need? There are nbits >> 3 full
1075 * bytes of data, and nbits & 7 leftover bits. If there
1076 * are any leftover bits, then we clearly need another
1077 * byte. Wnat's not so obvious is that we *probably*
1078 * need another byte even if there aren't any leftovers:
1079 * the most-significant bit of the most-significant byte
1080 * acts like a sign bit, and it's usually got a sense
1081 * opposite of the one we need. The exception is longs
1082 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1083 * its own 256's-complement, so has the right sign bit
1084 * even without the extra byte. That's a pain to check
1085 * for in advance, though, so we always grab an extra
1086 * byte at the start, and cut it back later if possible.
1087 */
1088 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001089 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001090 PyErr_SetString(PyExc_OverflowError, "long too large "
1091 "to pickle");
1092 goto finally;
1093 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001094 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001095 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001096 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001097 i = _PyLong_AsByteArray((PyLongObject *)args,
1098 pdata, nbytes,
1099 1 /* little endian */, 1 /* signed */);
1100 if (i < 0) goto finally;
1101 /* If the long is negative, this may be a byte more than
1102 * needed. This is so iff the MSB is all redundant sign
1103 * bits.
1104 */
1105 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1106 (pdata[nbytes - 2] & 0x80) != 0)
1107 --nbytes;
1108
1109 if (nbytes < 256) {
1110 c_str[0] = LONG1;
1111 c_str[1] = (char)nbytes;
1112 size = 2;
1113 }
1114 else {
1115 c_str[0] = LONG4;
1116 size = (int)nbytes;
1117 for (i = 1; i < 5; i++) {
1118 c_str[i] = (char)(size & 0xff);
1119 size >>= 8;
1120 }
1121 size = 5;
1122 }
1123 i = self->write_func(self, c_str, size);
1124 if (i < 0) goto finally;
1125 i = self->write_func(self, (char *)pdata, (int)nbytes);
1126 if (i < 0) goto finally;
1127 res = 0;
1128 goto finally;
1129 }
1130
1131 /* proto < 2: write the repr and newline. This is quadratic-time
1132 * (in the number of digits), in both directions.
1133 */
Tim Peterscba30e22003-02-01 06:24:36 +00001134 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001137 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139
Tim Peters0bc93f52003-02-02 18:29:33 +00001140 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142
Tim Peters0bc93f52003-02-02 18:29:33 +00001143 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001144 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001145 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Tim Peters0bc93f52003-02-02 18:29:33 +00001148 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 finally:
1154 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156}
1157
1158
1159static int
Tim Peterscba30e22003-02-01 06:24:36 +00001160save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161{
1162 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001165 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001166 str[0] = BINFLOAT;
1167 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001169 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001170 return -1;
1171 }
1172 else {
1173 char c_str[250];
1174 c_str[0] = FLOAT;
Eric Smith068f0652009-04-25 21:40:15 +00001175 _PyOS_double_to_string(c_str + 1, sizeof(c_str) - 2, x, 'g',
1176 17, 0, NULL);
Georg Brandlde9b6242006-04-30 11:13:56 +00001177 /* Extend the formatted string with a newline character */
1178 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Tim Peters0bc93f52003-02-02 18:29:33 +00001180 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 return -1;
1182 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001185}
1186
1187
1188static int
Tim Peterscba30e22003-02-01 06:24:36 +00001189save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190{
1191 int size, len;
1192 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001194 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 if (!self->bin) {
1198 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Tim Peterscba30e22003-02-01 06:24:36 +00001202 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001205 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001207 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Tim Peters0bc93f52003-02-02 18:29:33 +00001209 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Tim Peters0bc93f52003-02-02 18:29:33 +00001212 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001213 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Tim Peters0bc93f52003-02-02 18:29:33 +00001215 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001218 Py_XDECREF(repr);
1219 }
1220 else {
1221 int i;
1222 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001223
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001224 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 if (size < 256) {
1228 c_str[0] = SHORT_BINSTRING;
1229 c_str[1] = size;
1230 len = 2;
1231 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001232 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001233 c_str[0] = BINSTRING;
1234 for (i = 1; i < 5; i++)
1235 c_str[i] = (int)(size >> ((i - 1) * 8));
1236 len = 5;
1237 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001238 else
1239 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Tim Peters0bc93f52003-02-02 18:29:33 +00001241 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 if (size > 128 && Pdata_Check(self->file)) {
1245 if (write_other(self, NULL, 0) < 0) return -1;
1246 PDATA_APPEND(self->file, args, -1);
1247 }
1248 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001249 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001250 PyString_AS_STRING(
1251 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001252 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 return -1;
1254 }
1255 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 if (doput)
1258 if (put(self, args) < 0)
1259 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 err:
1264 Py_XDECREF(repr);
1265 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001266}
1267
1268
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001269#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001270/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1271 backslash and newline characters to \uXXXX escapes. */
1272static PyObject *
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001273modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001274{
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001275 PyObject *repr;
1276 char *p;
1277 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001278
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001279 static const char *hexdigit = "0123456789abcdef";
1280#ifdef Py_UNICODE_WIDE
1281 const Py_ssize_t expandsize = 10;
1282#else
1283 const Py_ssize_t expandsize = 6;
1284#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001285
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001286 if (size > PY_SSIZE_T_MAX / expandsize)
1287 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001288
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001289 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1290 if (repr == NULL)
1291 return NULL;
1292 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001293 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001294
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001295 p = q = PyString_AS_STRING(repr);
1296 while (size-- > 0) {
1297 Py_UNICODE ch = *s++;
1298#ifdef Py_UNICODE_WIDE
1299 /* Map 32-bit characters to '\Uxxxxxxxx' */
1300 if (ch >= 0x10000) {
1301 *p++ = '\\';
1302 *p++ = 'U';
1303 *p++ = hexdigit[(ch >> 28) & 0xf];
1304 *p++ = hexdigit[(ch >> 24) & 0xf];
1305 *p++ = hexdigit[(ch >> 20) & 0xf];
1306 *p++ = hexdigit[(ch >> 16) & 0xf];
1307 *p++ = hexdigit[(ch >> 12) & 0xf];
1308 *p++ = hexdigit[(ch >> 8) & 0xf];
1309 *p++ = hexdigit[(ch >> 4) & 0xf];
1310 *p++ = hexdigit[ch & 15];
1311 }
1312 else
1313#else
1314 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1315 if (ch >= 0xD800 && ch < 0xDC00) {
1316 Py_UNICODE ch2;
1317 Py_UCS4 ucs;
1318
1319 ch2 = *s++;
1320 size--;
1321 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1322 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1323 *p++ = '\\';
1324 *p++ = 'U';
1325 *p++ = hexdigit[(ucs >> 28) & 0xf];
1326 *p++ = hexdigit[(ucs >> 24) & 0xf];
1327 *p++ = hexdigit[(ucs >> 20) & 0xf];
1328 *p++ = hexdigit[(ucs >> 16) & 0xf];
1329 *p++ = hexdigit[(ucs >> 12) & 0xf];
1330 *p++ = hexdigit[(ucs >> 8) & 0xf];
1331 *p++ = hexdigit[(ucs >> 4) & 0xf];
1332 *p++ = hexdigit[ucs & 0xf];
1333 continue;
1334 }
1335 /* Fall through: isolated surrogates are copied as-is */
1336 s--;
1337 size++;
1338 }
1339#endif
1340 /* Map 16-bit characters to '\uxxxx' */
1341 if (ch >= 256 || ch == '\\' || ch == '\n') {
1342 *p++ = '\\';
1343 *p++ = 'u';
1344 *p++ = hexdigit[(ch >> 12) & 0xf];
1345 *p++ = hexdigit[(ch >> 8) & 0xf];
1346 *p++ = hexdigit[(ch >> 4) & 0xf];
1347 *p++ = hexdigit[ch & 15];
1348 }
1349 /* Copy everything else as-is */
1350 else
1351 *p++ = (char) ch;
1352 }
1353 *p = '\0';
1354 _PyString_Resize(&repr, p - q);
1355 return repr;
1356}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001357
Guido van Rossum60456fd1997-04-09 17:36:32 +00001358static int
Tim Peterscba30e22003-02-01 06:24:36 +00001359save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001361 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 if (!PyUnicode_Check(args))
1365 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 if (!self->bin) {
1368 char *repr_str;
1369 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 repr = modified_EncodeRawUnicodeEscape(
1372 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001373 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001376 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001378 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001379
Tim Peters0bc93f52003-02-02 18:29:33 +00001380 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001382
Tim Peters0bc93f52003-02-02 18:29:33 +00001383 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001385
Tim Peters0bc93f52003-02-02 18:29:33 +00001386 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001387 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 Py_XDECREF(repr);
1390 }
1391 else {
1392 int i;
1393 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001394
Tim Peterscba30e22003-02-01 06:24:36 +00001395 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001397
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001398 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001400 if (size > INT_MAX)
1401 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 c_str[0] = BINUNICODE;
1404 for (i = 1; i < 5; i++)
1405 c_str[i] = (int)(size >> ((i - 1) * 8));
1406 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001407
Tim Peters0bc93f52003-02-02 18:29:33 +00001408 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 if (size > 128 && Pdata_Check(self->file)) {
1412 if (write_other(self, NULL, 0) < 0)
1413 goto err;
1414 PDATA_APPEND(self->file, repr, -1);
1415 }
1416 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001417 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001418 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 goto err;
1420 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001422 Py_DECREF(repr);
1423 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 if (doput)
1426 if (put(self, args) < 0)
1427 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001431 err:
1432 Py_XDECREF(repr);
1433 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001434}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001435#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001436
Tim Peters1d63c9f2003-02-02 20:29:39 +00001437/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1438static int
Tim Peters67920142003-02-05 03:46:17 +00001439store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001440{
1441 int i;
1442 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001443
Tim Peters1d63c9f2003-02-02 20:29:39 +00001444 assert(PyTuple_Size(t) == len);
1445
1446 for (i = 0; i < len; i++) {
1447 PyObject *element = PyTuple_GET_ITEM(t, i);
1448
1449 if (element == NULL)
1450 goto finally;
1451 if (save(self, element, 0) < 0)
1452 goto finally;
1453 }
1454 res = 0;
1455
1456 finally:
1457 return res;
1458}
1459
1460/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1461 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001462 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001463 * (a tuple can be reached from itself), and that requires some subtle
1464 * magic so that it works in all cases. IOW, this is a long routine.
1465 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001466static int
Tim Peterscba30e22003-02-01 06:24:36 +00001467save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001468{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001469 PyObject *py_tuple_id = NULL;
1470 int len, i;
1471 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001474 static char pop = POP;
1475 static char pop_mark = POP_MARK;
1476 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 if ((len = PyTuple_Size(args)) < 0)
1479 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001480
Tim Peters1d63c9f2003-02-02 20:29:39 +00001481 if (len == 0) {
1482 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001483
Tim Peters1d63c9f2003-02-02 20:29:39 +00001484 if (self->proto) {
1485 c_str[0] = EMPTY_TUPLE;
1486 len = 1;
1487 }
1488 else {
1489 c_str[0] = MARK;
1490 c_str[1] = TUPLE;
1491 len = 2;
1492 }
1493 if (self->write_func(self, c_str, len) >= 0)
1494 res = 0;
1495 /* Don't memoize an empty tuple. */
1496 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001497 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001498
Tim Peters1d63c9f2003-02-02 20:29:39 +00001499 /* A non-empty tuple. */
1500
1501 /* id(tuple) isn't in the memo now. If it shows up there after
1502 * saving the tuple elements, the tuple must be recursive, in
1503 * which case we'll pop everything we put on the stack, and fetch
1504 * its value from the memo.
1505 */
1506 py_tuple_id = PyLong_FromVoidPtr(args);
1507 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509
Tim Peters1d63c9f2003-02-02 20:29:39 +00001510 if (len <= 3 && self->proto >= 2) {
1511 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001512 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001514 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001515 /* pop the len elements */
1516 for (i = 0; i < len; ++i)
1517 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001519 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001520 if (get(self, py_tuple_id) < 0)
1521 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522 res = 0;
1523 goto finally;
1524 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 /* Not recursive. */
1526 if (self->write_func(self, len2opcode + len, 1) < 0)
1527 goto finally;
1528 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001530
Tim Peters1d63c9f2003-02-02 20:29:39 +00001531 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1532 * Generate MARK elt1 elt2 ... TUPLE
1533 */
1534 if (self->write_func(self, &MARKv, 1) < 0)
1535 goto finally;
1536
Tim Peters67920142003-02-05 03:46:17 +00001537 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001538 goto finally;
1539
1540 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1541 /* pop the stack stuff we pushed */
1542 if (self->bin) {
1543 if (self->write_func(self, &pop_mark, 1) < 0)
1544 goto finally;
1545 }
1546 else {
1547 /* Note that we pop one more than len, to remove
1548 * the MARK too.
1549 */
1550 for (i = 0; i <= len; i++)
1551 if (self->write_func(self, &pop, 1) < 0)
1552 goto finally;
1553 }
1554 /* fetch from memo */
1555 if (get(self, py_tuple_id) >= 0)
1556 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001557 goto finally;
1558 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001559
Tim Peters1d63c9f2003-02-02 20:29:39 +00001560 /* Not recursive. */
1561 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001563
Tim Peters1d63c9f2003-02-02 20:29:39 +00001564 memoize:
1565 if (put(self, args) >= 0)
1566 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 finally:
1569 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571}
1572
Tim Peters1092d642003-02-11 21:06:20 +00001573/* iter is an iterator giving items, and we batch up chunks of
1574 * MARK item item ... item APPENDS
1575 * opcode sequences. Calling code should have arranged to first create an
1576 * empty list, or list-like object, for the APPENDS to operate on.
1577 * Returns 0 on success, <0 on error.
1578 */
1579static int
1580batch_list(Picklerobject *self, PyObject *iter)
1581{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001582 PyObject *obj = NULL;
1583 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001584 int i, n;
1585
1586 static char append = APPEND;
1587 static char appends = APPENDS;
1588
1589 assert(iter != NULL);
1590
1591 if (self->proto == 0) {
1592 /* APPENDS isn't available; do one at a time. */
1593 for (;;) {
1594 obj = PyIter_Next(iter);
1595 if (obj == NULL) {
1596 if (PyErr_Occurred())
1597 return -1;
1598 break;
1599 }
1600 i = save(self, obj, 0);
1601 Py_DECREF(obj);
1602 if (i < 0)
1603 return -1;
1604 if (self->write_func(self, &append, 1) < 0)
1605 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001606 }
1607 return 0;
1608 }
1609
1610 /* proto > 0: write in batches of BATCHSIZE. */
1611 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001612 /* Get first item */
1613 firstitem = PyIter_Next(iter);
1614 if (firstitem == NULL) {
1615 if (PyErr_Occurred())
1616 goto BatchFailed;
1617
1618 /* nothing more to add */
1619 break;
1620 }
1621
1622 /* Try to get a second item */
1623 obj = PyIter_Next(iter);
1624 if (obj == NULL) {
1625 if (PyErr_Occurred())
1626 goto BatchFailed;
1627
1628 /* Only one item to write */
1629 if (save(self, firstitem, 0) < 0)
1630 goto BatchFailed;
1631 if (self->write_func(self, &append, 1) < 0)
1632 goto BatchFailed;
1633 Py_CLEAR(firstitem);
1634 break;
1635 }
1636
1637 /* More than one item to write */
1638
1639 /* Pump out MARK, items, APPENDS. */
1640 if (self->write_func(self, &MARKv, 1) < 0)
1641 goto BatchFailed;
1642
1643 if (save(self, firstitem, 0) < 0)
1644 goto BatchFailed;
1645 Py_CLEAR(firstitem);
1646 n = 1;
1647
1648 /* Fetch and save up to BATCHSIZE items */
1649 while (obj) {
1650 if (save(self, obj, 0) < 0)
1651 goto BatchFailed;
1652 Py_CLEAR(obj);
1653 n += 1;
1654
1655 if (n == BATCHSIZE)
1656 break;
1657
Tim Peters1092d642003-02-11 21:06:20 +00001658 obj = PyIter_Next(iter);
1659 if (obj == NULL) {
1660 if (PyErr_Occurred())
1661 goto BatchFailed;
1662 break;
1663 }
Tim Peters1092d642003-02-11 21:06:20 +00001664 }
1665
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001666 if (self->write_func(self, &appends, 1) < 0)
1667 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001668
Tim Peters90975f12003-02-12 05:28:58 +00001669 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001670 return 0;
1671
1672BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001673 Py_XDECREF(firstitem);
1674 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001675 return -1;
1676}
1677
Guido van Rossum60456fd1997-04-09 17:36:32 +00001678static int
Tim Peterscba30e22003-02-01 06:24:36 +00001679save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680{
Tim Peters1092d642003-02-11 21:06:20 +00001681 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001683 int len;
1684 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001686 if (self->fast && !fast_save_enter(self, args))
1687 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001688
Tim Peters1092d642003-02-11 21:06:20 +00001689 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 if (self->bin) {
1691 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001692 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001693 }
1694 else {
1695 s[0] = MARK;
1696 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001697 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001699
Tim Peters1092d642003-02-11 21:06:20 +00001700 if (self->write_func(self, s, len) < 0)
1701 goto finally;
1702
1703 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001704 if ((len = PyList_Size(args)) < 0)
1705 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001706
Tim Peters1092d642003-02-11 21:06:20 +00001707 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001708 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001709 if (put(self, args) >= 0)
1710 res = 0;
1711 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001712 }
Tim Peters90975f12003-02-12 05:28:58 +00001713 if (put2(self, args) < 0)
1714 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Tim Peters1092d642003-02-11 21:06:20 +00001716 /* Materialize the list elements. */
1717 iter = PyObject_GetIter(args);
1718 if (iter == NULL)
1719 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001720
1721 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1722 {
1723 res = batch_list(self, iter);
1724 Py_LeaveRecursiveCall();
1725 }
Tim Peters1092d642003-02-11 21:06:20 +00001726 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001728 finally:
1729 if (self->fast && !fast_save_leave(self, args))
1730 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001733}
1734
1735
Tim Peters42f08ac2003-02-11 22:43:24 +00001736/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1737 * MARK key value ... key value SETITEMS
1738 * opcode sequences. Calling code should have arranged to first create an
1739 * empty dict, or dict-like object, for the SETITEMS to operate on.
1740 * Returns 0 on success, <0 on error.
1741 *
1742 * This is very much like batch_list(). The difference between saving
1743 * elements directly, and picking apart two-tuples, is so long-winded at
1744 * the C level, though, that attempts to combine these routines were too
1745 * ugly to bear.
1746 */
1747static int
1748batch_dict(Picklerobject *self, PyObject *iter)
1749{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001750 PyObject *p = NULL;
1751 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001752 int i, n;
1753
1754 static char setitem = SETITEM;
1755 static char setitems = SETITEMS;
1756
1757 assert(iter != NULL);
1758
1759 if (self->proto == 0) {
1760 /* SETITEMS isn't available; do one at a time. */
1761 for (;;) {
1762 p = PyIter_Next(iter);
1763 if (p == NULL) {
1764 if (PyErr_Occurred())
1765 return -1;
1766 break;
1767 }
1768 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1769 PyErr_SetString(PyExc_TypeError, "dict items "
1770 "iterator must return 2-tuples");
1771 return -1;
1772 }
1773 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1774 if (i >= 0)
1775 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1776 Py_DECREF(p);
1777 if (i < 0)
1778 return -1;
1779 if (self->write_func(self, &setitem, 1) < 0)
1780 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001781 }
1782 return 0;
1783 }
1784
1785 /* proto > 0: write in batches of BATCHSIZE. */
1786 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001787 /* Get first item */
1788 firstitem = PyIter_Next(iter);
1789 if (firstitem == NULL) {
1790 if (PyErr_Occurred())
1791 goto BatchFailed;
1792
1793 /* nothing more to add */
1794 break;
1795 }
1796 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1797 PyErr_SetString(PyExc_TypeError, "dict items "
1798 "iterator must return 2-tuples");
1799 goto BatchFailed;
1800 }
1801
1802 /* Try to get a second item */
1803 p = PyIter_Next(iter);
1804 if (p == NULL) {
1805 if (PyErr_Occurred())
1806 goto BatchFailed;
1807
1808 /* Only one item to write */
1809 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1810 goto BatchFailed;
1811 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1812 goto BatchFailed;
1813 if (self->write_func(self, &setitem, 1) < 0)
1814 goto BatchFailed;
1815 Py_CLEAR(firstitem);
1816 break;
1817 }
1818
1819 /* More than one item to write */
1820
1821 /* Pump out MARK, items, SETITEMS. */
1822 if (self->write_func(self, &MARKv, 1) < 0)
1823 goto BatchFailed;
1824
1825 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1826 goto BatchFailed;
1827 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1828 goto BatchFailed;
1829 Py_CLEAR(firstitem);
1830 n = 1;
1831
1832 /* Fetch and save up to BATCHSIZE items */
1833 while (p) {
1834 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1835 PyErr_SetString(PyExc_TypeError, "dict items "
1836 "iterator must return 2-tuples");
1837 goto BatchFailed;
1838 }
1839 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1840 goto BatchFailed;
1841 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1842 goto BatchFailed;
1843 Py_CLEAR(p);
1844 n += 1;
1845
1846 if (n == BATCHSIZE)
1847 break;
1848
Tim Peters42f08ac2003-02-11 22:43:24 +00001849 p = PyIter_Next(iter);
1850 if (p == NULL) {
1851 if (PyErr_Occurred())
1852 goto BatchFailed;
1853 break;
1854 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001855 }
1856
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001857 if (self->write_func(self, &setitems, 1) < 0)
1858 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001859
Tim Peters90975f12003-02-12 05:28:58 +00001860 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001861 return 0;
1862
1863BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001864 Py_XDECREF(firstitem);
1865 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001866 return -1;
1867}
1868
Collin Winter179bf212009-05-25 04:34:39 +00001869/* This is a variant of batch_dict() above that specializes for dicts, with no
1870 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1871 * MARK key value ... key value SETITEMS
1872 * opcode sequences. Calling code should have arranged to first create an
1873 * empty dict, or dict-like object, for the SETITEMS to operate on.
1874 * Returns 0 on success, -1 on error.
1875 *
1876 * Note that this currently doesn't work for protocol 0.
1877 */
1878static int
1879batch_dict_exact(Picklerobject *self, PyObject *obj)
1880{
1881 PyObject *key = NULL, *value = NULL;
1882 int i;
1883 Py_ssize_t dict_size, ppos = 0;
1884
1885 static char setitem = SETITEM;
1886 static char setitems = SETITEMS;
1887
1888 assert(obj != NULL);
1889 assert(self->proto > 0);
1890
1891 dict_size = PyDict_Size(obj);
1892
1893 /* Special-case len(d) == 1 to save space. */
1894 if (dict_size == 1) {
1895 PyDict_Next(obj, &ppos, &key, &value);
1896 if (save(self, key, 0) < 0)
1897 return -1;
1898 if (save(self, value, 0) < 0)
1899 return -1;
1900 if (self->write_func(self, &setitem, 1) < 0)
1901 return -1;
1902 return 0;
1903 }
1904
1905 /* Write in batches of BATCHSIZE. */
1906 do {
1907 i = 0;
1908 if (self->write_func(self, &MARKv, 1) < 0)
1909 return -1;
1910 while (PyDict_Next(obj, &ppos, &key, &value)) {
1911 if (save(self, key, 0) < 0)
1912 return -1;
1913 if (save(self, value, 0) < 0)
1914 return -1;
1915 if (++i == BATCHSIZE)
1916 break;
1917 }
1918 if (self->write_func(self, &setitems, 1) < 0)
1919 return -1;
1920 if (PyDict_Size(obj) != dict_size) {
1921 PyErr_Format(
1922 PyExc_RuntimeError,
1923 "dictionary changed size during iteration");
1924 return -1;
1925 }
1926
1927 } while (i == BATCHSIZE);
1928 return 0;
1929}
1930
Guido van Rossum60456fd1997-04-09 17:36:32 +00001931static int
Tim Peterscba30e22003-02-01 06:24:36 +00001932save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933{
Tim Peters42f08ac2003-02-11 22:43:24 +00001934 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001936 int len;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 if (self->fast && !fast_save_enter(self, args))
1939 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001940
Tim Peters42f08ac2003-02-11 22:43:24 +00001941 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if (self->bin) {
1943 s[0] = EMPTY_DICT;
1944 len = 1;
1945 }
1946 else {
1947 s[0] = MARK;
1948 s[1] = DICT;
1949 len = 2;
1950 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Tim Peters0bc93f52003-02-02 18:29:33 +00001952 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Tim Peters42f08ac2003-02-11 22:43:24 +00001955 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 if ((len = PyDict_Size(args)) < 0)
1957 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001960 if (put(self, args) >= 0)
1961 res = 0;
1962 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 }
Tim Peters90975f12003-02-12 05:28:58 +00001964 if (put2(self, args) < 0)
1965 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Tim Peters42f08ac2003-02-11 22:43:24 +00001967 /* Materialize the dict items. */
Collin Winter179bf212009-05-25 04:34:39 +00001968 if (PyDict_CheckExact(args) && self->proto > 0) {
1969 /* We can take certain shortcuts if we know this is a dict and
1970 not a dict subclass. */
1971 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1972 res = batch_dict_exact(self, args);
1973 Py_LeaveRecursiveCall();
1974 }
1975 } else {
1976 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
1977 if (iter == NULL)
1978 goto finally;
1979 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1980 res = batch_dict(self, iter);
1981 Py_LeaveRecursiveCall();
1982 }
1983 Py_DECREF(iter);
Facundo Batista763d3092008-06-30 01:10:55 +00001984 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 finally:
1987 if (self->fast && !fast_save_leave(self, args))
1988 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991}
1992
1993
Tim Peters84e87f32001-03-17 04:50:51 +00001994static int
Tim Peterscba30e22003-02-01 06:24:36 +00001995save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996{
1997 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1998 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1999 char *module_str, *name_str;
2000 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 if (self->fast && !fast_save_enter(self, args))
2005 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002006
Tim Peters0bc93f52003-02-02 18:29:33 +00002007 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002008 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002009
Tim Peterscba30e22003-02-01 06:24:36 +00002010 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (self->bin) {
2014 if (save(self, class, 0) < 0)
2015 goto finally;
2016 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2019 PyObject *element = 0;
2020 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002022 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00002023 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002024 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 if ((len = PyObject_Size(class_args)) < 0)
2027 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002029 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00002030 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 if (save(self, element, 0) < 0) {
2034 Py_DECREF(element);
2035 goto finally;
2036 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 Py_DECREF(element);
2039 }
2040 }
2041 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002042 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2043 PyErr_Clear();
2044 else
2045 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002046 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 if (!self->bin) {
2049 if (!( name = ((PyClassObject *)class)->cl_name )) {
2050 PyErr_SetString(PicklingError, "class has no name");
2051 goto finally;
2052 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002053
Tim Peterscba30e22003-02-01 06:24:36 +00002054 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002056
Tim Peters84e87f32001-03-17 04:50:51 +00002057
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002058 if ((module_size = PyString_Size(module)) < 0 ||
2059 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002061
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002062 module_str = PyString_AS_STRING((PyStringObject *)module);
2063 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002064
Tim Peters0bc93f52003-02-02 18:29:33 +00002065 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002067
Tim Peters0bc93f52003-02-02 18:29:33 +00002068 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +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;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002073
Tim Peters0bc93f52003-02-02 18:29:33 +00002074 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002076
Tim Peters0bc93f52003-02-02 18:29:33 +00002077 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 goto finally;
2079 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002080 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 goto finally;
2082 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002084 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2085 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002086 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 goto finally;
2088 }
2089 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002090 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2091 PyErr_Clear();
2092 else
2093 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002095 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002096 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2097 PyErr_Clear();
2098 else
2099 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 res = 0;
2101 goto finally;
2102 }
2103 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (!PyDict_Check(state)) {
2106 if (put2(self, args) < 0)
2107 goto finally;
2108 }
2109 else {
2110 if (put(self, args) < 0)
2111 goto finally;
2112 }
Tim Peters84e87f32001-03-17 04:50:51 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 if (save(self, state, 0) < 0)
2115 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002116
Tim Peters0bc93f52003-02-02 18:29:33 +00002117 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 finally:
2123 if (self->fast && !fast_save_leave(self, args))
2124 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 Py_XDECREF(module);
2127 Py_XDECREF(class);
2128 Py_XDECREF(state);
2129 Py_XDECREF(getinitargs_func);
2130 Py_XDECREF(getstate_func);
2131 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002134}
2135
2136
Guido van Rossum60456fd1997-04-09 17:36:32 +00002137static int
Tim Peterscba30e22003-02-01 06:24:36 +00002138save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002140 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002141 char *name_str, *module_str;
2142 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 if (name) {
2147 global_name = name;
2148 Py_INCREF(global_name);
2149 }
2150 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002151 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 goto finally;
2153 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002154
Tim Peterscba30e22003-02-01 06:24:36 +00002155 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002156 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002157
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002158 if ((module_size = PyString_Size(module)) < 0 ||
2159 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002161
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002162 module_str = PyString_AS_STRING((PyStringObject *)module);
2163 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Guido van Rossum75bfd052002-12-24 18:10:07 +00002165 /* XXX This can be doing a relative import. Clearly it shouldn't,
2166 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 mod = PyImport_ImportModule(module_str);
2168 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002169 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002170 "Can't pickle %s: import of module %s "
2171 "failed",
2172 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 goto finally;
2174 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002175 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002176 if (klass == NULL) {
2177 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002178 "Can't pickle %s: attribute lookup %s.%s "
2179 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002180 "OSS", args, module, global_name);
2181 goto finally;
2182 }
2183 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002184 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002185 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002186 "Can't pickle %s: it's not the same object "
2187 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188 "OSS", args, module, global_name);
2189 goto finally;
2190 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002191 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002192
Tim Peters731098b2003-02-04 20:56:09 +00002193 if (self->proto >= 2) {
2194 /* See whether this is in the extension registry, and if
2195 * so generate an EXT opcode.
2196 */
2197 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002198 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002199 char c_str[5];
2200 int n;
2201
2202 PyTuple_SET_ITEM(two_tuple, 0, module);
2203 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2204 py_code = PyDict_GetItem(extension_registry, two_tuple);
2205 if (py_code == NULL)
2206 goto gen_global; /* not registered */
2207
2208 /* Verify py_code has the right type and value. */
2209 if (!PyInt_Check(py_code)) {
2210 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002211 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002212 "OO", args, py_code);
2213 goto finally;
2214 }
2215 code = PyInt_AS_LONG(py_code);
2216 if (code <= 0 || code > 0x7fffffffL) {
2217 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2218 "extension code %ld is out of range",
2219 "Ol", args, code);
2220 goto finally;
2221 }
2222
2223 /* Generate an EXT opcode. */
2224 if (code <= 0xff) {
2225 c_str[0] = EXT1;
2226 c_str[1] = (char)code;
2227 n = 2;
2228 }
2229 else if (code <= 0xffff) {
2230 c_str[0] = EXT2;
2231 c_str[1] = (char)(code & 0xff);
2232 c_str[2] = (char)((code >> 8) & 0xff);
2233 n = 3;
2234 }
2235 else {
2236 c_str[0] = EXT4;
2237 c_str[1] = (char)(code & 0xff);
2238 c_str[2] = (char)((code >> 8) & 0xff);
2239 c_str[3] = (char)((code >> 16) & 0xff);
2240 c_str[4] = (char)((code >> 24) & 0xff);
2241 n = 5;
2242 }
2243
2244 if (self->write_func(self, c_str, n) >= 0)
2245 res = 0;
2246 goto finally; /* and don't memoize */
2247 }
2248
2249 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002250 if (self->write_func(self, &global, 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, module_str, module_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
Tim Peters0bc93f52003-02-02 18:29:33 +00002259 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002260 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261
Tim Peters0bc93f52003-02-02 18:29:33 +00002262 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002263 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002265 if (put(self, args) < 0)
2266 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002270 finally:
2271 Py_XDECREF(module);
2272 Py_XDECREF(global_name);
2273 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002276}
2277
Guido van Rossum60456fd1997-04-09 17:36:32 +00002278static int
Tim Peterscba30e22003-02-01 06:24:36 +00002279save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280{
2281 PyObject *pid = 0;
2282 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002284 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 Py_INCREF(args);
2287 ARG_TUP(self, args);
2288 if (self->arg) {
2289 pid = PyObject_Call(f, self->arg, NULL);
2290 FREE_ARG_TUP(self);
2291 }
2292 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002294 if (pid != Py_None) {
2295 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002296 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 PyErr_SetString(PicklingError,
2298 "persistent id must be string");
2299 goto finally;
2300 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002301
Tim Peters0bc93f52003-02-02 18:29:33 +00002302 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002304
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002305 if ((size = PyString_Size(pid)) < 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,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002309 PyString_AS_STRING(
2310 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002311 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002312 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002313
Tim Peters0bc93f52003-02-02 18:29:33 +00002314 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 res = 1;
2318 goto finally;
2319 }
2320 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002321 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 res = -1;
2323 else
2324 res = 1;
2325 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002327 goto finally;
2328 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 finally:
2333 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002336}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002337
Tim Peters71fcda52003-02-14 23:05:28 +00002338/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2339 * appropriate __reduce__ method for ob.
2340 */
Tim Peters84e87f32001-03-17 04:50:51 +00002341static int
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002342save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002343{
Tim Peters71fcda52003-02-14 23:05:28 +00002344 PyObject *callable;
2345 PyObject *argtup;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002346 PyObject *state = NULL;
2347 PyObject *listitems = Py_None;
2348 PyObject *dictitems = Py_None;
2349 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002350
Tim Peters71fcda52003-02-14 23:05:28 +00002351 int use_newobj = self->proto >= 2;
2352
2353 static char reduce = REDUCE;
2354 static char build = BUILD;
2355 static char newobj = NEWOBJ;
2356
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002357 size = PyTuple_Size(args);
2358 if (size < 2 || size > 5) {
2359 cPickle_ErrFormat(PicklingError, "tuple returned by "
2360 "%s must contain 2 through 5 elements",
2361 "O", fn);
2362 return -1;
2363 }
2364
Tim Peters71fcda52003-02-14 23:05:28 +00002365 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2366 &callable,
2367 &argtup,
2368 &state,
2369 &listitems,
2370 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002372
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002373 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002374 cPickle_ErrFormat(PicklingError, "Second element of "
2375 "tuple returned by %s must be a tuple",
2376 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002377 return -1;
2378 }
2379
Tim Peters71fcda52003-02-14 23:05:28 +00002380 if (state == Py_None)
2381 state = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002382
Tim Peters71fcda52003-02-14 23:05:28 +00002383 if (listitems == Py_None)
2384 listitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002385 else if (!PyIter_Check(listitems)) {
2386 cPickle_ErrFormat(PicklingError, "Fourth element of "
2387 "tuple returned by %s must be an iterator, not %s",
2388 "Os", fn, Py_TYPE(listitems)->tp_name);
2389 return -1;
2390 }
2391
Tim Peters71fcda52003-02-14 23:05:28 +00002392 if (dictitems == Py_None)
2393 dictitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002394 else if (!PyIter_Check(dictitems)) {
2395 cPickle_ErrFormat(PicklingError, "Fifth element of "
2396 "tuple returned by %s must be an iterator, not %s",
2397 "Os", fn, Py_TYPE(dictitems)->tp_name);
2398 return -1;
2399 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002400
Tim Peters71fcda52003-02-14 23:05:28 +00002401 /* Protocol 2 special case: if callable's name is __newobj__, use
2402 * NEWOBJ. This consumes a lot of code.
2403 */
2404 if (use_newobj) {
2405 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002406
Tim Peters71fcda52003-02-14 23:05:28 +00002407 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002408 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2409 PyErr_Clear();
2410 else
2411 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002412 use_newobj = 0;
2413 }
2414 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002415 use_newobj = PyString_Check(temp) &&
2416 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002417 "__newobj__") == 0;
2418 Py_DECREF(temp);
2419 }
2420 }
2421 if (use_newobj) {
2422 PyObject *cls;
2423 PyObject *newargtup;
2424 int n, i;
2425
2426 /* Sanity checks. */
2427 n = PyTuple_Size(argtup);
2428 if (n < 1) {
2429 PyErr_SetString(PicklingError, "__newobj__ arglist "
2430 "is empty");
2431 return -1;
2432 }
2433
2434 cls = PyTuple_GET_ITEM(argtup, 0);
2435 if (! PyObject_HasAttrString(cls, "__new__")) {
2436 PyErr_SetString(PicklingError, "args[0] from "
2437 "__newobj__ args has no __new__");
2438 return -1;
2439 }
2440
2441 /* XXX How could ob be NULL? */
2442 if (ob != NULL) {
2443 PyObject *ob_dot_class;
2444
2445 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002446 if (ob_dot_class == NULL) {
2447 if (PyErr_ExceptionMatches(
2448 PyExc_AttributeError))
2449 PyErr_Clear();
2450 else
2451 return -1;
2452 }
Tim Peters71fcda52003-02-14 23:05:28 +00002453 i = ob_dot_class != cls; /* true iff a problem */
2454 Py_XDECREF(ob_dot_class);
2455 if (i) {
2456 PyErr_SetString(PicklingError, "args[0] from "
2457 "__newobj__ args has the wrong class");
2458 return -1;
2459 }
2460 }
2461
2462 /* Save the class and its __new__ arguments. */
2463 if (save(self, cls, 0) < 0)
2464 return -1;
2465
2466 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2467 if (newargtup == NULL)
2468 return -1;
2469 for (i = 1; i < n; ++i) {
2470 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2471 Py_INCREF(temp);
2472 PyTuple_SET_ITEM(newargtup, i-1, temp);
2473 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002474 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002475 Py_DECREF(newargtup);
2476 if (i < 0)
2477 return -1;
2478
2479 /* Add NEWOBJ opcode. */
2480 if (self->write_func(self, &newobj, 1) < 0)
2481 return -1;
2482 }
2483 else {
2484 /* Not using NEWOBJ. */
2485 if (save(self, callable, 0) < 0 ||
2486 save(self, argtup, 0) < 0 ||
2487 self->write_func(self, &reduce, 1) < 0)
2488 return -1;
2489 }
2490
2491 /* Memoize. */
2492 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 if (ob != NULL) {
2494 if (state && !PyDict_Check(state)) {
2495 if (put2(self, ob) < 0)
2496 return -1;
2497 }
Tim Peters71fcda52003-02-14 23:05:28 +00002498 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 }
Tim Peters84e87f32001-03-17 04:50:51 +00002501
Guido van Rossum60456fd1997-04-09 17:36:32 +00002502
Tim Peters71fcda52003-02-14 23:05:28 +00002503 if (listitems && batch_list(self, listitems) < 0)
2504 return -1;
2505
2506 if (dictitems && batch_dict(self, dictitems) < 0)
2507 return -1;
2508
2509 if (state) {
2510 if (save(self, state, 0) < 0 ||
2511 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 return -1;
2513 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002515 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002516}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002517
Guido van Rossum60456fd1997-04-09 17:36:32 +00002518static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002519save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520{
2521 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002522 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002523 int res = -1;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002524 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002525
Facundo Batista763d3092008-06-30 01:10:55 +00002526 if (Py_EnterRecursiveCall(" while pickling an object"))
2527 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529 if (!pers_save && self->pers_func) {
2530 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2531 res = tmp;
2532 goto finally;
2533 }
2534 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 if (args == Py_None) {
2537 res = save_none(self, args);
2538 goto finally;
2539 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002540
Christian Heimese93237d2007-12-19 02:37:44 +00002541 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002544 case 'b':
2545 if (args == Py_False || args == Py_True) {
2546 res = save_bool(self, args);
2547 goto finally;
2548 }
2549 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002550 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002551 if (type == &PyInt_Type) {
2552 res = save_int(self, args);
2553 goto finally;
2554 }
2555 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556
Guido van Rossum60456fd1997-04-09 17:36:32 +00002557 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 if (type == &PyLong_Type) {
2559 res = save_long(self, args);
2560 goto finally;
2561 }
2562 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002563
Guido van Rossum60456fd1997-04-09 17:36:32 +00002564 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002565 if (type == &PyFloat_Type) {
2566 res = save_float(self, args);
2567 goto finally;
2568 }
2569 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002570
Guido van Rossum60456fd1997-04-09 17:36:32 +00002571 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002572 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2573 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002574 goto finally;
2575 }
2576 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002577
Guido van Rossum60456fd1997-04-09 17:36:32 +00002578 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002579 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 res = save_string(self, args, 0);
2581 goto finally;
2582 }
Facundo Batista14618862008-06-22 15:27:10 +00002583 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002584
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002585#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002586 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002587 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588 res = save_unicode(self, args, 0);
2589 goto finally;
2590 }
Facundo Batista14618862008-06-22 15:27:10 +00002591 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002592#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002594
Christian Heimese93237d2007-12-19 02:37:44 +00002595 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002596 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599 if (PyDict_GetItem(self->memo, py_ob_id)) {
2600 if (get(self, py_ob_id) < 0)
2601 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 res = 0;
2604 goto finally;
2605 }
2606 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002609 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002610 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 res = save_string(self, args, 1);
2612 goto finally;
2613 }
2614 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002615
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002616#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002617 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002618 if (type == &PyUnicode_Type) {
2619 res = save_unicode(self, args, 1);
2620 goto finally;
2621 }
2622 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002623#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002624
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 if (type == &PyTuple_Type) {
2627 res = save_tuple(self, args);
2628 goto finally;
2629 }
2630 if (type == &PyType_Type) {
2631 res = save_global(self, args, NULL);
2632 goto finally;
2633 }
2634 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002635
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 if (type == &PyList_Type) {
2638 res = save_list(self, args);
2639 goto finally;
2640 }
2641 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002642
2643 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 if (type == &PyDict_Type) {
2645 res = save_dict(self, args);
2646 goto finally;
2647 }
2648 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002649
2650 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 if (type == &PyInstance_Type) {
2652 res = save_inst(self, args);
2653 goto finally;
2654 }
2655 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002656
2657 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 if (type == &PyClass_Type) {
2659 res = save_global(self, args, NULL);
2660 goto finally;
2661 }
2662 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002663
2664 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 if (type == &PyFunction_Type) {
2666 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002667 if (res && PyErr_ExceptionMatches(PickleError)) {
2668 /* fall back to reduce */
2669 PyErr_Clear();
2670 break;
2671 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 goto finally;
2673 }
2674 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002675
2676 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 if (type == &PyCFunction_Type) {
2678 res = save_global(self, args, NULL);
2679 goto finally;
2680 }
2681 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 if (!pers_save && self->inst_pers_func) {
2684 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2685 res = tmp;
2686 goto finally;
2687 }
2688 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002689
Jeremy Hylton39c61162002-07-16 19:47:43 +00002690 if (PyType_IsSubtype(type, &PyType_Type)) {
2691 res = save_global(self, args, NULL);
2692 goto finally;
2693 }
2694
Guido van Rossumb289b872003-02-19 01:45:13 +00002695 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002696 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002697 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002698 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002699 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2700 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002702 Py_INCREF(args);
2703 ARG_TUP(self, args);
2704 if (self->arg) {
2705 t = PyObject_Call(__reduce__, self->arg, NULL);
2706 FREE_ARG_TUP(self);
2707 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 }
2709 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002710 /* Check for a __reduce_ex__ method. */
2711 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2712 if (__reduce__ != NULL) {
2713 t = PyInt_FromLong(self->proto);
2714 if (t != NULL) {
2715 ARG_TUP(self, t);
2716 t = NULL;
2717 if (self->arg) {
2718 t = PyObject_Call(__reduce__,
2719 self->arg, NULL);
2720 FREE_ARG_TUP(self);
2721 }
2722 }
2723 }
2724 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002725 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2726 PyErr_Clear();
2727 else
2728 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002729 /* Check for a __reduce__ method. */
2730 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2731 if (__reduce__ != NULL) {
2732 t = PyObject_Call(__reduce__,
2733 empty_tuple, NULL);
2734 }
2735 else {
2736 PyErr_SetObject(UnpickleableError, args);
2737 goto finally;
2738 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
Tim Peters71fcda52003-02-14 23:05:28 +00002742 if (t == NULL)
2743 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002744
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002745 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002746 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 goto finally;
2748 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002750 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002751 cPickle_ErrFormat(PicklingError, "Value returned by "
2752 "%s must be string or tuple",
2753 "O", __reduce__);
2754 goto finally;
2755 }
2756
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002757 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002760 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 Py_XDECREF(py_ob_id);
2762 Py_XDECREF(__reduce__);
2763 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002766}
2767
2768
2769static int
Tim Peterscba30e22003-02-01 06:24:36 +00002770dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002771{
2772 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002773
Tim Peters4190fb82003-02-02 16:09:05 +00002774 if (self->proto >= 2) {
2775 char bytes[2];
2776
2777 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002778 assert(self->proto >= 0 && self->proto < 256);
2779 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002780 if (self->write_func(self, bytes, 2) < 0)
2781 return -1;
2782 }
2783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 if (save(self, args, 0) < 0)
2785 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Tim Peters4190fb82003-02-02 16:09:05 +00002787 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002789
Tim Peters4190fb82003-02-02 16:09:05 +00002790 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002791 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002794}
2795
2796static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002797Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798{
Tim Peterscba30e22003-02-01 06:24:36 +00002799 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002800 PyDict_Clear(self->memo);
2801 Py_INCREF(Py_None);
2802 return Py_None;
2803}
2804
2805static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002806Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002807{
2808 int l, i, rsize, ssize, clear=1, lm;
2809 long ik;
2810 PyObject *k, *r;
2811 char *s, *p, *have_get;
2812 Pdata *data;
2813
2814 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002815 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 return NULL;
2817
2818 /* Check to make sure we are based on a list */
2819 if (! Pdata_Check(self->file)) {
2820 PyErr_SetString(PicklingError,
2821 "Attempt to getvalue() a non-list-based pickler");
2822 return NULL;
2823 }
2824
2825 /* flush write buffer */
2826 if (write_other(self, NULL, 0) < 0) return NULL;
2827
2828 data=(Pdata*)self->file;
2829 l=data->length;
2830
2831 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002832 lm = PyDict_Size(self->memo);
2833 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002834 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002835 have_get = malloc(lm);
2836 if (have_get == NULL) return PyErr_NoMemory();
2837 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838
2839 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002840 for (rsize = 0, i = l; --i >= 0; ) {
2841 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002843 if (PyString_Check(k))
2844 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845
2846 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002847 ik = PyInt_AS_LONG((PyIntObject*)k);
2848 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 PyErr_SetString(PicklingError,
2850 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002851 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 }
Tim Petersac5687a2003-02-02 18:08:34 +00002853 if (have_get[ik]) /* with matching get */
2854 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 }
2856
2857 else if (! (PyTuple_Check(k) &&
2858 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002859 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 ) {
2861 PyErr_SetString(PicklingError,
2862 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002863 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002864 }
2865
2866 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002867 ik = PyInt_AS_LONG((PyIntObject *)k);
2868 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 PyErr_SetString(PicklingError,
2870 "Invalid get data");
2871 return NULL;
2872 }
Tim Petersac5687a2003-02-02 18:08:34 +00002873 have_get[ik] = 1;
2874 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002876 }
2877
2878 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002879 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002880 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002881 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882
Tim Petersac5687a2003-02-02 18:08:34 +00002883 for (i = 0; i < l; i++) {
2884 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002886 if (PyString_Check(k)) {
2887 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002888 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002889 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002890 while (--ssize >= 0)
2891 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 }
2893 }
2894
2895 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002896 ik = PyInt_AS_LONG((PyIntObject *)
2897 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 if (ik < 256) {
2899 *s++ = BINGET;
2900 *s++ = (int)(ik & 0xff);
2901 }
2902 else {
2903 *s++ = LONG_BINGET;
2904 *s++ = (int)(ik & 0xff);
2905 *s++ = (int)((ik >> 8) & 0xff);
2906 *s++ = (int)((ik >> 16) & 0xff);
2907 *s++ = (int)((ik >> 24) & 0xff);
2908 }
2909 }
2910
2911 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002912 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913
2914 if (have_get[ik]) { /* with matching get */
2915 if (ik < 256) {
2916 *s++ = BINPUT;
2917 *s++ = (int)(ik & 0xff);
2918 }
2919 else {
2920 *s++ = LONG_BINPUT;
2921 *s++ = (int)(ik & 0xff);
2922 *s++ = (int)((ik >> 8) & 0xff);
2923 *s++ = (int)((ik >> 16) & 0xff);
2924 *s++ = (int)((ik >> 24) & 0xff);
2925 }
2926 }
2927 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002928 }
2929
2930 if (clear) {
2931 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002932 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 }
2934
2935 free(have_get);
2936 return r;
2937 err:
2938 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002939 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002940}
2941
2942static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002943Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944{
2945 PyObject *ob;
2946 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002947
Tim Peterscba30e22003-02-01 06:24:36 +00002948 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 if (dump(self, ob) < 0)
2952 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 /* XXX Why does dump() return self? */
2957 Py_INCREF(self);
2958 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002959}
2960
2961
Tim Peterscba30e22003-02-01 06:24:36 +00002962static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963{
Neal Norwitzb0493252002-03-31 14:44:22 +00002964 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002965 PyDoc_STR("dump(object) -- "
2966 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002967 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002968 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002969 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002970 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002972};
2973
2974
2975static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002976newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977{
2978 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002979
Tim Peters5bd2a792003-02-01 16:45:06 +00002980 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002981 proto = HIGHEST_PROTOCOL;
2982 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002983 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2984 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002985 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002987 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002988
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002989 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002990 if (self == NULL)
2991 return NULL;
2992 self->proto = proto;
2993 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 self->fp = NULL;
2995 self->write = NULL;
2996 self->memo = NULL;
2997 self->arg = NULL;
2998 self->pers_func = NULL;
2999 self->inst_pers_func = NULL;
3000 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 self->fast = 0;
3002 self->fast_container = 0;
3003 self->fast_memo = NULL;
3004 self->buf_size = 0;
3005 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003006
Tim Peters5bd2a792003-02-01 16:45:06 +00003007 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 if (file)
3009 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00003010 else {
3011 file = Pdata_New();
3012 if (file == NULL)
3013 goto err;
3014 }
3015 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003016
Tim Peterscba30e22003-02-01 06:24:36 +00003017 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003018 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 if (PyFile_Check(file)) {
3021 self->fp = PyFile_AsFile(file);
3022 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00003023 PyErr_SetString(PyExc_ValueError,
3024 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 goto err;
3026 }
3027 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00003028 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029 else if (PycStringIO_OutputCheck(file)) {
3030 self->write_func = write_cStringIO;
3031 }
3032 else if (file == Py_None) {
3033 self->write_func = write_none;
3034 }
3035 else {
3036 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003038 if (! Pdata_Check(file)) {
3039 self->write = PyObject_GetAttr(file, write_str);
3040 if (!self->write) {
3041 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003042 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003043 "argument must have 'write' "
3044 "attribute");
3045 goto err;
3046 }
3047 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003048
Tim Peters5bd2a792003-02-01 16:45:06 +00003049 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3050 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051 PyErr_NoMemory();
3052 goto err;
3053 }
3054 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056 if (PyEval_GetRestricted()) {
3057 /* Restricted execution, get private tables */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00003058 PyObject *m = PyImport_Import(copyreg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003059
Tim Peters5b7da392003-02-04 00:21:07 +00003060 if (m == NULL)
3061 goto err;
3062 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00003064 if (self->dispatch_table == NULL)
3065 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 }
3067 else {
Tim Peters5b7da392003-02-04 00:21:07 +00003068 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 Py_INCREF(dispatch_table);
3070 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003071 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003076 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003078}
3079
3080
3081static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003082get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003084 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003086 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003087
Tim Peters92c8bb32003-02-13 23:00:26 +00003088 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003089 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003090 * accepts Pickler() and Pickler(integer) too. The meaning then
3091 * is clear as mud, undocumented, and not supported by pickle.py.
3092 * I'm told Zope uses this, but I haven't traced into this code
3093 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003094 */
3095 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003097 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003098 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3099 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100 return NULL;
3101 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003102 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003103}
3104
3105
3106static void
Tim Peterscba30e22003-02-01 06:24:36 +00003107Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003109 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 Py_XDECREF(self->write);
3111 Py_XDECREF(self->memo);
3112 Py_XDECREF(self->fast_memo);
3113 Py_XDECREF(self->arg);
3114 Py_XDECREF(self->file);
3115 Py_XDECREF(self->pers_func);
3116 Py_XDECREF(self->inst_pers_func);
3117 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003118 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003119 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003120}
3121
3122static int
3123Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3124{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003125 Py_VISIT(self->write);
3126 Py_VISIT(self->memo);
3127 Py_VISIT(self->fast_memo);
3128 Py_VISIT(self->arg);
3129 Py_VISIT(self->file);
3130 Py_VISIT(self->pers_func);
3131 Py_VISIT(self->inst_pers_func);
3132 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003133 return 0;
3134}
3135
3136static int
3137Pickler_clear(Picklerobject *self)
3138{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003139 Py_CLEAR(self->write);
3140 Py_CLEAR(self->memo);
3141 Py_CLEAR(self->fast_memo);
3142 Py_CLEAR(self->arg);
3143 Py_CLEAR(self->file);
3144 Py_CLEAR(self->pers_func);
3145 Py_CLEAR(self->inst_pers_func);
3146 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003147 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003148}
3149
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003150static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003151Pickler_get_pers_func(Picklerobject *p)
3152{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 if (p->pers_func == NULL)
3154 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3155 else
3156 Py_INCREF(p->pers_func);
3157 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003158}
3159
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003160static int
3161Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3162{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 if (v == NULL) {
3164 PyErr_SetString(PyExc_TypeError,
3165 "attribute deletion is not supported");
3166 return -1;
3167 }
3168 Py_XDECREF(p->pers_func);
3169 Py_INCREF(v);
3170 p->pers_func = v;
3171 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003172}
3173
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003174static int
3175Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3176{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 if (v == NULL) {
3178 PyErr_SetString(PyExc_TypeError,
3179 "attribute deletion is not supported");
3180 return -1;
3181 }
3182 Py_XDECREF(p->inst_pers_func);
3183 Py_INCREF(v);
3184 p->inst_pers_func = v;
3185 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003186}
3187
3188static PyObject *
3189Pickler_get_memo(Picklerobject *p)
3190{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 if (p->memo == NULL)
3192 PyErr_SetString(PyExc_AttributeError, "memo");
3193 else
3194 Py_INCREF(p->memo);
3195 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003196}
3197
3198static int
3199Pickler_set_memo(Picklerobject *p, PyObject *v)
3200{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 if (v == NULL) {
3202 PyErr_SetString(PyExc_TypeError,
3203 "attribute deletion is not supported");
3204 return -1;
3205 }
3206 if (!PyDict_Check(v)) {
3207 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3208 return -1;
3209 }
3210 Py_XDECREF(p->memo);
3211 Py_INCREF(v);
3212 p->memo = v;
3213 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003214}
3215
3216static PyObject *
3217Pickler_get_error(Picklerobject *p)
3218{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 /* why is this an attribute on the Pickler? */
3220 Py_INCREF(PicklingError);
3221 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003222}
3223
3224static PyMemberDef Pickler_members[] = {
3225 {"binary", T_INT, offsetof(Picklerobject, bin)},
3226 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003227 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003228};
3229
3230static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003231 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003232 (setter)Pickler_set_pers_func},
3233 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3234 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003235 {"PicklingError", (getter)Pickler_get_error, NULL},
3236 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003237};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003238
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003239PyDoc_STRVAR(Picklertype__doc__,
3240"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003241
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003242static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003243 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003244 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003245 sizeof(Picklerobject), /*tp_basicsize*/
3246 0,
3247 (destructor)Pickler_dealloc, /* tp_dealloc */
3248 0, /* tp_print */
3249 0, /* tp_getattr */
3250 0, /* tp_setattr */
3251 0, /* tp_compare */
3252 0, /* tp_repr */
3253 0, /* tp_as_number */
3254 0, /* tp_as_sequence */
3255 0, /* tp_as_mapping */
3256 0, /* tp_hash */
3257 0, /* tp_call */
3258 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003259 PyObject_GenericGetAttr, /* tp_getattro */
3260 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003261 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003262 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003263 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003264 (traverseproc)Pickler_traverse, /* tp_traverse */
3265 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003266 0, /* tp_richcompare */
3267 0, /* tp_weaklistoffset */
3268 0, /* tp_iter */
3269 0, /* tp_iternext */
3270 Pickler_methods, /* tp_methods */
3271 Pickler_members, /* tp_members */
3272 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003273};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003274
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003275static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003276find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277{
3278 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 if (fc) {
3281 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003282 PyErr_SetString(UnpicklingError, "Global and instance "
3283 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 return NULL;
3285 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003286 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3287 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 module = PySys_GetObject("modules");
3291 if (module == NULL)
3292 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 module = PyDict_GetItem(module, py_module_name);
3295 if (module == NULL) {
3296 module = PyImport_Import(py_module_name);
3297 if (!module)
3298 return NULL;
3299 global = PyObject_GetAttr(module, py_global_name);
3300 Py_DECREF(module);
3301 }
3302 else
3303 global = PyObject_GetAttr(module, py_global_name);
3304 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003305}
3306
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003307static int
Tim Peterscba30e22003-02-01 06:24:36 +00003308marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309{
3310 if (self->num_marks < 1) {
3311 PyErr_SetString(UnpicklingError, "could not find MARK");
3312 return -1;
3313 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316}
3317
Tim Peters84e87f32001-03-17 04:50:51 +00003318
Guido van Rossum60456fd1997-04-09 17:36:32 +00003319static int
Tim Peterscba30e22003-02-01 06:24:36 +00003320load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003321{
3322 PDATA_APPEND(self->stack, Py_None, -1);
3323 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003324}
3325
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003326static int
Tim Peterscba30e22003-02-01 06:24:36 +00003327bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328{
3329 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3330 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003331}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003332
3333static int
Tim Peterscba30e22003-02-01 06:24:36 +00003334load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335{
3336 PyObject *py_int = 0;
3337 char *endptr, *s;
3338 int len, res = -1;
3339 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340
Tim Peters0bc93f52003-02-02 18:29:33 +00003341 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 if (len < 2) return bad_readline();
3343 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345 errno = 0;
3346 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3349 /* Hm, maybe we've got something long. Let's try reading
3350 it as a Python long object. */
3351 errno = 0;
3352 py_int = PyLong_FromString(s, NULL, 0);
3353 if (py_int == NULL) {
3354 PyErr_SetString(PyExc_ValueError,
3355 "could not convert string to int");
3356 goto finally;
3357 }
3358 }
3359 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003360 if (len == 3 && (l == 0 || l == 1)) {
3361 if (!( py_int = PyBool_FromLong(l))) goto finally;
3362 }
3363 else {
3364 if (!( py_int = PyInt_FromLong(l))) goto finally;
3365 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 free(s);
3369 PDATA_PUSH(self->stack, py_int, -1);
3370 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 finally:
3373 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003376}
3377
Tim Peters3c67d792003-02-02 17:59:11 +00003378static int
3379load_bool(Unpicklerobject *self, PyObject *boolean)
3380{
3381 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003382 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003383 return 0;
3384}
3385
Tim Petersee1a53c2003-02-02 02:57:53 +00003386/* s contains x bytes of a little-endian integer. Return its value as a
3387 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3388 * int, but when x is 4 it's a signed one. This is an historical source
3389 * of x-platform bugs.
3390 */
Tim Peters84e87f32001-03-17 04:50:51 +00003391static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003392calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393{
3394 unsigned char c;
3395 int i;
3396 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 for (i = 0, l = 0L; i < x; i++) {
3399 c = (unsigned char)s[i];
3400 l |= (long)c << (i * 8);
3401 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003402#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3404 * is signed, so on a box with longs bigger than 4 bytes we need
3405 * to extend a BININT's sign bit to the full width.
3406 */
3407 if (x == 4 && l & (1L << 31))
3408 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003409#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003411}
3412
3413
3414static int
Tim Peterscba30e22003-02-01 06:24:36 +00003415load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416{
3417 PyObject *py_int = 0;
3418 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421
Tim Peterscba30e22003-02-01 06:24:36 +00003422 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425 PDATA_PUSH(self->stack, py_int, -1);
3426 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003427}
3428
3429
3430static int
Tim Peterscba30e22003-02-01 06:24:36 +00003431load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432{
3433 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Tim Peters0bc93f52003-02-02 18:29:33 +00003435 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439}
3440
3441
3442static int
Tim Peterscba30e22003-02-01 06:24:36 +00003443load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444{
3445 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Tim Peters0bc93f52003-02-02 18:29:33 +00003447 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003451}
3452
3453
3454static int
Tim Peterscba30e22003-02-01 06:24:36 +00003455load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456{
3457 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003458
Tim Peters0bc93f52003-02-02 18:29:33 +00003459 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463}
Tim Peters84e87f32001-03-17 04:50:51 +00003464
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465static int
Tim Peterscba30e22003-02-01 06:24:36 +00003466load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467{
3468 PyObject *l = 0;
3469 char *end, *s;
3470 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003471
Tim Peters0bc93f52003-02-02 18:29:33 +00003472 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 if (len < 2) return bad_readline();
3474 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
Tim Peterscba30e22003-02-01 06:24:36 +00003476 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479 free(s);
3480 PDATA_PUSH(self->stack, l, -1);
3481 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003483 finally:
3484 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003487}
3488
Tim Petersee1a53c2003-02-02 02:57:53 +00003489/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3490 * data following.
3491 */
3492static int
3493load_counted_long(Unpicklerobject *self, int size)
3494{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003495 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003496 char *nbytes;
3497 unsigned char *pdata;
3498 PyObject *along;
3499
3500 assert(size == 1 || size == 4);
3501 i = self->read_func(self, &nbytes, size);
3502 if (i < 0) return -1;
3503
3504 size = calc_binint(nbytes, size);
3505 if (size < 0) {
3506 /* Corrupt or hostile pickle -- we never write one like
3507 * this.
3508 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003509 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003510 "byte count");
3511 return -1;
3512 }
3513
3514 if (size == 0)
3515 along = PyLong_FromLong(0L);
3516 else {
3517 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003518 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003519 if (i < 0) return -1;
3520 along = _PyLong_FromByteArray(pdata, (size_t)size,
3521 1 /* little endian */, 1 /* signed */);
3522 }
3523 if (along == NULL)
3524 return -1;
3525 PDATA_PUSH(self->stack, along, -1);
3526 return 0;
3527}
Tim Peters84e87f32001-03-17 04:50:51 +00003528
Guido van Rossum60456fd1997-04-09 17:36:32 +00003529static int
Tim Peterscba30e22003-02-01 06:24:36 +00003530load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531{
3532 PyObject *py_float = 0;
3533 char *endptr, *s;
3534 int len, res = -1;
3535 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536
Tim Peters0bc93f52003-02-02 18:29:33 +00003537 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 if (len < 2) return bad_readline();
3539 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003541 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003542 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543
Mark Dickinsona3ecd2c2009-01-24 16:40:29 +00003544 if ((errno == ERANGE && !(fabs(d) <= 1.0)) ||
3545 (endptr[0] != '\n') || (endptr[1] != '\0')) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 PyErr_SetString(PyExc_ValueError,
3547 "could not convert string to float");
3548 goto finally;
3549 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Tim Peterscba30e22003-02-01 06:24:36 +00003551 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554 free(s);
3555 PDATA_PUSH(self->stack, py_float, -1);
3556 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 finally:
3559 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562}
3563
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564static int
Tim Peterscba30e22003-02-01 06:24:36 +00003565load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566{
Tim Peters9905b942003-03-20 20:53:32 +00003567 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 double x;
3569 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
Tim Peters0bc93f52003-02-02 18:29:33 +00003571 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003573
Tim Peters9905b942003-03-20 20:53:32 +00003574 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3575 if (x == -1.0 && PyErr_Occurred())
3576 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Tim Peters9905b942003-03-20 20:53:32 +00003578 py_float = PyFloat_FromDouble(x);
3579 if (py_float == NULL)
3580 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 PDATA_PUSH(self->stack, py_float, -1);
3583 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003585
3586static int
Tim Peterscba30e22003-02-01 06:24:36 +00003587load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588{
3589 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003590 int len, res = -1;
3591 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003592
Tim Peters0bc93f52003-02-02 18:29:33 +00003593 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003594 if (len < 2) return bad_readline();
3595 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003597
3598 /* Strip outermost quotes */
3599 while (s[len-1] <= ' ')
3600 len--;
3601 if(s[0]=='"' && s[len-1]=='"'){
3602 s[len-1] = '\0';
3603 p = s + 1 ;
3604 len -= 2;
3605 } else if(s[0]=='\'' && s[len-1]=='\''){
3606 s[len-1] = '\0';
3607 p = s + 1 ;
3608 len -= 2;
3609 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 goto insecure;
3611 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003612
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003613 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003614 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003615 if (str) {
3616 PDATA_PUSH(self->stack, str, -1);
3617 res = 0;
3618 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 insecure:
3622 free(s);
3623 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3624 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003625}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003626
3627
3628static int
Tim Peterscba30e22003-02-01 06:24:36 +00003629load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630{
3631 PyObject *py_string = 0;
3632 long l;
3633 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634
Tim Peters0bc93f52003-02-02 18:29:33 +00003635 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003638 if (l < 0) {
3639 /* Corrupt or hostile pickle -- we never write one like
3640 * this.
3641 */
3642 PyErr_SetString(UnpicklingError,
3643 "BINSTRING pickle has negative byte count");
3644 return -1;
3645 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646
Tim Peters0bc93f52003-02-02 18:29:33 +00003647 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003649
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003650 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003653 PDATA_PUSH(self->stack, py_string, -1);
3654 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003655}
3656
3657
3658static int
Tim Peterscba30e22003-02-01 06:24:36 +00003659load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660{
3661 PyObject *py_string = 0;
3662 unsigned char l;
3663 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003664
Tim Peters0bc93f52003-02-02 18:29:33 +00003665 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003666 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003668 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Tim Peters0bc93f52003-02-02 18:29:33 +00003670 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003672 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003674 PDATA_PUSH(self->stack, py_string, -1);
3675 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003676}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677
3678
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003679#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680static int
Tim Peterscba30e22003-02-01 06:24:36 +00003681load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682{
3683 PyObject *str = 0;
3684 int len, res = -1;
3685 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003686
Tim Peters0bc93f52003-02-02 18:29:33 +00003687 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003689
Tim Peterscba30e22003-02-01 06:24:36 +00003690 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 PDATA_PUSH(self->stack, str, -1);
3694 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003696 finally:
3697 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003698}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003699#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003700
3701
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003702#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003703static int
Tim Peterscba30e22003-02-01 06:24:36 +00003704load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003705{
3706 PyObject *unicode;
3707 long l;
3708 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003709
Tim Peters0bc93f52003-02-02 18:29:33 +00003710 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003712 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003713 if (l < 0) {
3714 /* Corrupt or hostile pickle -- we never write one like
3715 * this.
3716 */
3717 PyErr_SetString(UnpicklingError,
3718 "BINUNICODE pickle has negative byte count");
3719 return -1;
3720 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003721
Tim Peters0bc93f52003-02-02 18:29:33 +00003722 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003723 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003724
Tim Peterscba30e22003-02-01 06:24:36 +00003725 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728 PDATA_PUSH(self->stack, unicode, -1);
3729 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003730}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003731#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003732
3733
3734static int
Tim Peterscba30e22003-02-01 06:24:36 +00003735load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736{
3737 PyObject *tup;
3738 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003740 if ((i = marker(self)) < 0) return -1;
3741 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3742 PDATA_PUSH(self->stack, tup, -1);
3743 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744}
3745
3746static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003747load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003748{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003749 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003750
Tim Peters1d63c9f2003-02-02 20:29:39 +00003751 if (tup == NULL)
3752 return -1;
3753
3754 while (--len >= 0) {
3755 PyObject *element;
3756
3757 PDATA_POP(self->stack, element);
3758 if (element == NULL)
3759 return -1;
3760 PyTuple_SET_ITEM(tup, len, element);
3761 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 PDATA_PUSH(self->stack, tup, -1);
3763 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764}
3765
3766static int
Tim Peterscba30e22003-02-01 06:24:36 +00003767load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768{
3769 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003771 if (!( list=PyList_New(0))) return -1;
3772 PDATA_PUSH(self->stack, list, -1);
3773 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774}
3775
3776static int
Tim Peterscba30e22003-02-01 06:24:36 +00003777load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778{
3779 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 if (!( dict=PyDict_New())) return -1;
3782 PDATA_PUSH(self->stack, dict, -1);
3783 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784}
3785
3786
3787static int
Tim Peterscba30e22003-02-01 06:24:36 +00003788load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789{
3790 PyObject *list = 0;
3791 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793 if ((i = marker(self)) < 0) return -1;
3794 if (!( list=Pdata_popList(self->stack, i))) return -1;
3795 PDATA_PUSH(self->stack, list, -1);
3796 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797}
3798
3799static int
Tim Peterscba30e22003-02-01 06:24:36 +00003800load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801{
3802 PyObject *dict, *key, *value;
3803 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 if ((i = marker(self)) < 0) return -1;
3806 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 for (k = i+1; k < j; k += 2) {
3811 key =self->stack->data[k-1];
3812 value=self->stack->data[k ];
3813 if (PyDict_SetItem(dict, key, value) < 0) {
3814 Py_DECREF(dict);
3815 return -1;
3816 }
3817 }
3818 Pdata_clear(self->stack, i);
3819 PDATA_PUSH(self->stack, dict, -1);
3820 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821}
3822
3823static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003824Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003826 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003828 if (PyClass_Check(cls)) {
3829 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 if ((l=PyObject_Size(args)) < 0) goto err;
3832 if (!( l )) {
3833 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003834
Tim Peterscba30e22003-02-01 06:24:36 +00003835 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003836 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003838 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003839 so bypass usual construction */
3840 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003843 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 goto err;
3845 return inst;
3846 }
3847 Py_DECREF(__getinitargs__);
3848 }
Tim Peters84e87f32001-03-17 04:50:51 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 if ((r=PyInstance_New(cls, args, NULL))) return r;
3851 else goto err;
3852 }
Tim Peters84e87f32001-03-17 04:50:51 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 err:
3857 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003858 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003861 tmp_value = v;
3862 /* NULL occurs when there was a KeyboardInterrupt */
3863 if (tmp_value == NULL)
3864 tmp_value = Py_None;
3865 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 Py_XDECREF(v);
3867 v=r;
3868 }
3869 PyErr_Restore(tp,v,tb);
3870 }
3871 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872}
Tim Peters84e87f32001-03-17 04:50:51 +00003873
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
3875static int
Tim Peterscba30e22003-02-01 06:24:36 +00003876load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877{
3878 PyObject *class, *tup, *obj=0;
3879 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003881 if ((i = marker(self)) < 0) return -1;
3882 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3883 PDATA_POP(self->stack, class);
3884 if (class) {
3885 obj = Instance_New(class, tup);
3886 Py_DECREF(class);
3887 }
3888 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003890 if (! obj) return -1;
3891 PDATA_PUSH(self->stack, obj, -1);
3892 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003893}
3894
3895
3896static int
Tim Peterscba30e22003-02-01 06:24:36 +00003897load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898{
3899 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3900 int i, len;
3901 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003903 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003904
Tim Peters0bc93f52003-02-02 18:29:33 +00003905 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003906 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003907 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003909
Tim Peters0bc93f52003-02-02 18:29:33 +00003910 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003912 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003913 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 self->find_class);
3915 Py_DECREF(class_name);
3916 }
3917 }
3918 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 if ((tup=Pdata_popTuple(self->stack, i))) {
3923 obj = Instance_New(class, tup);
3924 Py_DECREF(tup);
3925 }
3926 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 PDATA_PUSH(self->stack, obj, -1);
3931 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003932}
3933
Tim Peterseab7db32003-02-13 18:24:14 +00003934static int
3935load_newobj(Unpicklerobject *self)
3936{
3937 PyObject *args = NULL;
3938 PyObject *clsraw = NULL;
3939 PyTypeObject *cls; /* clsraw cast to its true type */
3940 PyObject *obj;
3941
3942 /* Stack is ... cls argtuple, and we want to call
3943 * cls.__new__(cls, *argtuple).
3944 */
3945 PDATA_POP(self->stack, args);
3946 if (args == NULL) goto Fail;
3947 if (! PyTuple_Check(args)) {
3948 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3949 "tuple.");
3950 goto Fail;
3951 }
3952
3953 PDATA_POP(self->stack, clsraw);
3954 cls = (PyTypeObject *)clsraw;
3955 if (cls == NULL) goto Fail;
3956 if (! PyType_Check(cls)) {
3957 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3958 "isn't a type object");
3959 goto Fail;
3960 }
3961 if (cls->tp_new == NULL) {
3962 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3963 "has NULL tp_new");
3964 goto Fail;
3965 }
3966
3967 /* Call __new__. */
3968 obj = cls->tp_new(cls, args, NULL);
3969 if (obj == NULL) goto Fail;
3970
3971 Py_DECREF(args);
3972 Py_DECREF(clsraw);
3973 PDATA_PUSH(self->stack, obj, -1);
3974 return 0;
3975
3976 Fail:
3977 Py_XDECREF(args);
3978 Py_XDECREF(clsraw);
3979 return -1;
3980}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981
3982static int
Tim Peterscba30e22003-02-01 06:24:36 +00003983load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984{
3985 PyObject *class = 0, *module_name = 0, *class_name = 0;
3986 int len;
3987 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Tim Peters0bc93f52003-02-02 18:29:33 +00003989 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003991 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003992 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Tim Peters0bc93f52003-02-02 18:29:33 +00003994 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003995 if (len < 2) {
3996 Py_DECREF(module_name);
3997 return bad_readline();
3998 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003999 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00004000 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 self->find_class);
4002 Py_DECREF(class_name);
4003 }
4004 }
4005 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 if (! class) return -1;
4008 PDATA_PUSH(self->stack, class, -1);
4009 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004010}
4011
4012
4013static int
Tim Peterscba30e22003-02-01 06:24:36 +00004014load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004015{
4016 PyObject *pid = 0;
4017 int len;
4018 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004020 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004021 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022 if (len < 2) return bad_readline();
4023
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004024 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004025 if (!pid) return -1;
4026
4027 if (PyList_Check(self->pers_func)) {
4028 if (PyList_Append(self->pers_func, pid) < 0) {
4029 Py_DECREF(pid);
4030 return -1;
4031 }
4032 }
4033 else {
4034 ARG_TUP(self, pid);
4035 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004036 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037 NULL);
4038 FREE_ARG_TUP(self);
4039 }
4040 }
4041
4042 if (! pid) return -1;
4043
4044 PDATA_PUSH(self->stack, pid, -1);
4045 return 0;
4046 }
4047 else {
4048 PyErr_SetString(UnpicklingError,
4049 "A load persistent id instruction was encountered,\n"
4050 "but no persistent_load function was specified.");
4051 return -1;
4052 }
4053}
4054
4055static int
Tim Peterscba30e22003-02-01 06:24:36 +00004056load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057{
4058 PyObject *pid = 0;
4059
4060 if (self->pers_func) {
4061 PDATA_POP(self->stack, pid);
4062 if (! pid) return -1;
4063
4064 if (PyList_Check(self->pers_func)) {
4065 if (PyList_Append(self->pers_func, pid) < 0) {
4066 Py_DECREF(pid);
4067 return -1;
4068 }
4069 }
4070 else {
4071 ARG_TUP(self, pid);
4072 if (self->arg) {
4073 pid = PyObject_Call(self->pers_func, self->arg,
4074 NULL);
4075 FREE_ARG_TUP(self);
4076 }
4077 if (! pid) return -1;
4078 }
4079
4080 PDATA_PUSH(self->stack, pid, -1);
4081 return 0;
4082 }
4083 else {
4084 PyErr_SetString(UnpicklingError,
4085 "A load persistent id instruction was encountered,\n"
4086 "but no persistent_load function was specified.");
4087 return -1;
4088 }
4089}
4090
4091
4092static int
Tim Peterscba30e22003-02-01 06:24:36 +00004093load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094{
Collin Winter57bef682009-05-26 04:12:39 +00004095 int len = self->stack->length;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004096
4097 /* Note that we split the (pickle.py) stack into two stacks,
4098 an object stack and a mark stack. We have to be clever and
4099 pop the right one. We do this by looking at the top of the
Collin Winter57bef682009-05-26 04:12:39 +00004100 mark stack first, and only signalling a stack underflow if
4101 the object stack is empty and the mark stack doesn't match
4102 our expectations.
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 */
Collin Winter57bef682009-05-26 04:12:39 +00004104 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105 self->num_marks--;
Collin Winter57bef682009-05-26 04:12:39 +00004106 } else if (len >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 len--;
4108 Py_DECREF(self->stack->data[len]);
Collin Winter57bef682009-05-26 04:12:39 +00004109 self->stack->length = len;
4110 } else {
4111 return stackUnderflow();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 return 0;
4114}
4115
4116
4117static int
Tim Peterscba30e22003-02-01 06:24:36 +00004118load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119{
4120 int i;
4121
4122 if ((i = marker(self)) < 0)
4123 return -1;
4124
4125 Pdata_clear(self->stack, i);
4126
4127 return 0;
4128}
4129
4130
4131static int
Tim Peterscba30e22003-02-01 06:24:36 +00004132load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133{
4134 PyObject *last;
4135 int len;
4136
4137 if ((len = self->stack->length) <= 0) return stackUnderflow();
4138 last=self->stack->data[len-1];
4139 Py_INCREF(last);
4140 PDATA_PUSH(self->stack, last, -1);
4141 return 0;
4142}
4143
4144
4145static int
Tim Peterscba30e22003-02-01 06:24:36 +00004146load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147{
4148 PyObject *py_str = 0, *value = 0;
4149 int len;
4150 char *s;
4151 int rc;
4152
Tim Peters0bc93f52003-02-02 18:29:33 +00004153 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004154 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004155
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004156 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004158 value = PyDict_GetItem(self->memo, py_str);
4159 if (! value) {
4160 PyErr_SetObject(BadPickleGet, py_str);
4161 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004162 }
4163 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 PDATA_APPEND(self->stack, value, -1);
4165 rc = 0;
4166 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 Py_DECREF(py_str);
4169 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004170}
4171
4172
4173static int
Tim Peterscba30e22003-02-01 06:24:36 +00004174load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175{
4176 PyObject *py_key = 0, *value = 0;
4177 unsigned char key;
4178 char *s;
4179 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
Tim Peters0bc93f52003-02-02 18:29:33 +00004181 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 key = (unsigned char)s[0];
4184 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186 value = PyDict_GetItem(self->memo, py_key);
4187 if (! value) {
4188 PyErr_SetObject(BadPickleGet, py_key);
4189 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004190 }
4191 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 PDATA_APPEND(self->stack, value, -1);
4193 rc = 0;
4194 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 Py_DECREF(py_key);
4197 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004198}
4199
4200
4201static int
Tim Peterscba30e22003-02-01 06:24:36 +00004202load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203{
4204 PyObject *py_key = 0, *value = 0;
4205 unsigned char c;
4206 char *s;
4207 long key;
4208 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004209
Tim Peters0bc93f52003-02-02 18:29:33 +00004210 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 c = (unsigned char)s[0];
4213 key = (long)c;
4214 c = (unsigned char)s[1];
4215 key |= (long)c << 8;
4216 c = (unsigned char)s[2];
4217 key |= (long)c << 16;
4218 c = (unsigned char)s[3];
4219 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004221 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4222
4223 value = PyDict_GetItem(self->memo, py_key);
4224 if (! value) {
4225 PyErr_SetObject(BadPickleGet, py_key);
4226 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004227 }
4228 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 PDATA_APPEND(self->stack, value, -1);
4230 rc = 0;
4231 }
4232
4233 Py_DECREF(py_key);
4234 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235}
4236
Tim Peters2d629652003-02-04 05:06:17 +00004237/* Push an object from the extension registry (EXT[124]). nbytes is
4238 * the number of bytes following the opcode, holding the index (code) value.
4239 */
4240static int
4241load_extension(Unpicklerobject *self, int nbytes)
4242{
4243 char *codebytes; /* the nbytes bytes after the opcode */
4244 long code; /* calc_binint returns long */
4245 PyObject *py_code; /* code as a Python int */
4246 PyObject *obj; /* the object to push */
4247 PyObject *pair; /* (module_name, class_name) */
4248 PyObject *module_name, *class_name;
4249
4250 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4251 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4252 code = calc_binint(codebytes, nbytes);
4253 if (code <= 0) { /* note that 0 is forbidden */
4254 /* Corrupt or hostile pickle. */
4255 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4256 return -1;
4257 }
4258
4259 /* Look for the code in the cache. */
4260 py_code = PyInt_FromLong(code);
4261 if (py_code == NULL) return -1;
4262 obj = PyDict_GetItem(extension_cache, py_code);
4263 if (obj != NULL) {
4264 /* Bingo. */
4265 Py_DECREF(py_code);
4266 PDATA_APPEND(self->stack, obj, -1);
4267 return 0;
4268 }
4269
4270 /* Look up the (module_name, class_name) pair. */
4271 pair = PyDict_GetItem(inverted_registry, py_code);
4272 if (pair == NULL) {
4273 Py_DECREF(py_code);
4274 PyErr_Format(PyExc_ValueError, "unregistered extension "
4275 "code %ld", code);
4276 return -1;
4277 }
4278 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004279 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004280 */
4281 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004282 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4283 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004284 Py_DECREF(py_code);
4285 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4286 "isn't a 2-tuple of strings", code);
4287 return -1;
4288 }
4289 /* Load the object. */
4290 obj = find_class(module_name, class_name, self->find_class);
4291 if (obj == NULL) {
4292 Py_DECREF(py_code);
4293 return -1;
4294 }
4295 /* Cache code -> obj. */
4296 code = PyDict_SetItem(extension_cache, py_code, obj);
4297 Py_DECREF(py_code);
4298 if (code < 0) {
4299 Py_DECREF(obj);
4300 return -1;
4301 }
4302 PDATA_PUSH(self->stack, obj, -1);
4303 return 0;
4304}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
4306static int
Tim Peterscba30e22003-02-01 06:24:36 +00004307load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308{
4309 PyObject *py_str = 0, *value = 0;
4310 int len, l;
4311 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Tim Peters0bc93f52003-02-02 18:29:33 +00004313 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 if (l < 2) return bad_readline();
4315 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004316 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 value=self->stack->data[len-1];
4318 l=PyDict_SetItem(self->memo, py_str, value);
4319 Py_DECREF(py_str);
4320 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004321}
4322
4323
4324static int
Tim Peterscba30e22003-02-01 06:24:36 +00004325load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326{
4327 PyObject *py_key = 0, *value = 0;
4328 unsigned char key;
4329 char *s;
4330 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004331
Tim Peters0bc93f52003-02-02 18:29:33 +00004332 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4338 value=self->stack->data[len-1];
4339 len=PyDict_SetItem(self->memo, py_key, value);
4340 Py_DECREF(py_key);
4341 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004342}
4343
4344
4345static int
Tim Peterscba30e22003-02-01 06:24:36 +00004346load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347{
4348 PyObject *py_key = 0, *value = 0;
4349 long key;
4350 unsigned char c;
4351 char *s;
4352 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004353
Tim Peters0bc93f52003-02-02 18:29:33 +00004354 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 c = (unsigned char)s[0];
4358 key = (long)c;
4359 c = (unsigned char)s[1];
4360 key |= (long)c << 8;
4361 c = (unsigned char)s[2];
4362 key |= (long)c << 16;
4363 c = (unsigned char)s[3];
4364 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 if (!( py_key = PyInt_FromLong(key))) return -1;
4367 value=self->stack->data[len-1];
4368 len=PyDict_SetItem(self->memo, py_key, value);
4369 Py_DECREF(py_key);
4370 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371}
4372
4373
4374static int
Tim Peterscba30e22003-02-01 06:24:36 +00004375do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376{
4377 PyObject *value = 0, *list = 0, *append_method = 0;
4378 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 len=self->stack->length;
4381 if (!( len >= x && x > 0 )) return stackUnderflow();
4382 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004383 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 if (PyList_Check(list)) {
4388 PyObject *slice;
4389 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004392 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 list_len = PyList_GET_SIZE(list);
4394 i=PyList_SetSlice(list, list_len, list_len, slice);
4395 Py_DECREF(slice);
4396 return i;
4397 }
4398 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399
Tim Peterscba30e22003-02-01 06:24:36 +00004400 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 return -1;
4402
4403 for (i = x; i < len; i++) {
4404 PyObject *junk;
4405
4406 value=self->stack->data[i];
4407 junk=0;
4408 ARG_TUP(self, value);
4409 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004410 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 NULL);
4412 FREE_ARG_TUP(self);
4413 }
4414 if (! junk) {
4415 Pdata_clear(self->stack, i+1);
4416 self->stack->length=x;
4417 Py_DECREF(append_method);
4418 return -1;
4419 }
4420 Py_DECREF(junk);
4421 }
4422 self->stack->length=x;
4423 Py_DECREF(append_method);
4424 }
4425
4426 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004427}
4428
4429
4430static int
Tim Peterscba30e22003-02-01 06:24:36 +00004431load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432{
4433 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004434}
4435
4436
4437static int
Tim Peterscba30e22003-02-01 06:24:36 +00004438load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439{
4440 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004441}
4442
4443
4444static int
Tim Peterscba30e22003-02-01 06:24:36 +00004445do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004446{
4447 PyObject *value = 0, *key = 0, *dict = 0;
4448 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 if (!( (len=self->stack->length) >= x
4451 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004453 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 for (i = x+1; i < len; i += 2) {
4456 key =self->stack->data[i-1];
4457 value=self->stack->data[i ];
4458 if (PyObject_SetItem(dict, key, value) < 0) {
4459 r=-1;
4460 break;
4461 }
4462 }
4463
4464 Pdata_clear(self->stack, x);
4465
4466 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004467}
4468
4469
Tim Peters84e87f32001-03-17 04:50:51 +00004470static int
Tim Peterscba30e22003-02-01 06:24:36 +00004471load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472{
4473 return do_setitems(self, self->stack->length - 2);
4474}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476static int
Tim Peterscba30e22003-02-01 06:24:36 +00004477load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478{
4479 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004480}
4481
Tim Peters84e87f32001-03-17 04:50:51 +00004482
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483static int
Tim Peterscba30e22003-02-01 06:24:36 +00004484load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485{
Tim Peters080c88b2003-02-15 03:01:11 +00004486 PyObject *state, *inst, *slotstate;
4487 PyObject *__setstate__;
4488 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004489 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004490 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491
Tim Peters080c88b2003-02-15 03:01:11 +00004492 /* Stack is ... instance, state. We want to leave instance at
4493 * the stack top, possibly mutated via instance.__setstate__(state).
4494 */
4495 if (self->stack->length < 2)
4496 return stackUnderflow();
4497 PDATA_POP(self->stack, state);
4498 if (state == NULL)
4499 return -1;
4500 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501
Tim Peters080c88b2003-02-15 03:01:11 +00004502 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4503 if (__setstate__ != NULL) {
4504 PyObject *junk = NULL;
4505
4506 /* The explicit __setstate__ is responsible for everything. */
4507 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 if (self->arg) {
4509 junk = PyObject_Call(__setstate__, self->arg, NULL);
4510 FREE_ARG_TUP(self);
4511 }
4512 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004513 if (junk == NULL)
4514 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 Py_DECREF(junk);
4516 return 0;
4517 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004518 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4519 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004521
4522 /* A default __setstate__. First see whether state embeds a
4523 * slot state dict too (a proto 2 addition).
4524 */
4525 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4526 PyObject *temp = state;
4527 state = PyTuple_GET_ITEM(temp, 0);
4528 slotstate = PyTuple_GET_ITEM(temp, 1);
4529 Py_INCREF(state);
4530 Py_INCREF(slotstate);
4531 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 }
Tim Peters080c88b2003-02-15 03:01:11 +00004533 else
4534 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535
Tim Peters080c88b2003-02-15 03:01:11 +00004536 /* Set inst.__dict__ from the state dict (if any). */
4537 if (state != Py_None) {
4538 PyObject *dict;
4539 if (! PyDict_Check(state)) {
4540 PyErr_SetString(UnpicklingError, "state is not a "
4541 "dictionary");
4542 goto finally;
4543 }
4544 dict = PyObject_GetAttr(inst, __dict___str);
4545 if (dict == NULL)
4546 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547
Tim Peters080c88b2003-02-15 03:01:11 +00004548 i = 0;
4549 while (PyDict_Next(state, &i, &d_key, &d_value)) {
Antoine Pitrou74309892009-05-02 21:13:23 +00004550 /* normally the keys for instance attributes are
4551 interned. we should try to do that here. */
4552 Py_INCREF(d_key);
4553 if (PyString_CheckExact(d_key))
4554 PyString_InternInPlace(&d_key);
4555 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4556 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004557 goto finally;
Antoine Pitrou74309892009-05-02 21:13:23 +00004558 }
4559 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004560 }
4561 Py_DECREF(dict);
4562 }
4563
4564 /* Also set instance attributes from the slotstate dict (if any). */
4565 if (slotstate != NULL) {
4566 if (! PyDict_Check(slotstate)) {
4567 PyErr_SetString(UnpicklingError, "slot state is not "
4568 "a dictionary");
4569 goto finally;
4570 }
4571 i = 0;
4572 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4573 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4574 goto finally;
4575 }
4576 }
4577 res = 0;
4578
4579 finally:
4580 Py_DECREF(state);
4581 Py_XDECREF(slotstate);
4582 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583}
4584
4585
4586static int
Tim Peterscba30e22003-02-01 06:24:36 +00004587load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588{
4589 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 /* Note that we split the (pickle.py) stack into two stacks, an
4592 object stack and a mark stack. Here we push a mark onto the
4593 mark stack.
4594 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004597 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 s=self->marks_size+20;
4599 if (s <= self->num_marks) s=self->num_marks + 1;
4600 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004601 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004603 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004605 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 PyErr_NoMemory();
4607 return -1;
4608 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004609 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004610 self->marks_size = s;
4611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616}
4617
Guido van Rossum60456fd1997-04-09 17:36:32 +00004618static int
Tim Peterscba30e22003-02-01 06:24:36 +00004619load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004620{
4621 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623 PDATA_POP(self->stack, arg_tup);
4624 if (! arg_tup) return -1;
4625 PDATA_POP(self->stack, callable);
4626 if (callable) {
4627 ob = Instance_New(callable, arg_tup);
4628 Py_DECREF(callable);
4629 }
4630 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 PDATA_PUSH(self->stack, ob, -1);
4635 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004636}
Tim Peters84e87f32001-03-17 04:50:51 +00004637
Tim Peters4190fb82003-02-02 16:09:05 +00004638/* Just raises an error if we don't know the protocol specified. PROTO
4639 * is the first opcode for protocols >= 2.
4640 */
4641static int
4642load_proto(Unpicklerobject *self)
4643{
4644 int i;
4645 char *protobyte;
4646
4647 i = self->read_func(self, &protobyte, 1);
4648 if (i < 0)
4649 return -1;
4650
4651 i = calc_binint(protobyte, 1);
4652 /* No point checking for < 0, since calc_binint returns an unsigned
4653 * int when chewing on 1 byte.
4654 */
4655 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004656 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004657 return 0;
4658
4659 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4660 return -1;
4661}
4662
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004664load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665{
4666 PyObject *err = 0, *val = 0;
4667 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 self->num_marks = 0;
4670 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004673 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 switch (s[0]) {
4677 case NONE:
4678 if (load_none(self) < 0)
4679 break;
4680 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004682 case BININT:
4683 if (load_binint(self) < 0)
4684 break;
4685 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004687 case BININT1:
4688 if (load_binint1(self) < 0)
4689 break;
4690 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004692 case BININT2:
4693 if (load_binint2(self) < 0)
4694 break;
4695 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 case INT:
4698 if (load_int(self) < 0)
4699 break;
4700 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004702 case LONG:
4703 if (load_long(self) < 0)
4704 break;
4705 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004706
Tim Petersee1a53c2003-02-02 02:57:53 +00004707 case LONG1:
4708 if (load_counted_long(self, 1) < 0)
4709 break;
4710 continue;
4711
4712 case LONG4:
4713 if (load_counted_long(self, 4) < 0)
4714 break;
4715 continue;
4716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 case FLOAT:
4718 if (load_float(self) < 0)
4719 break;
4720 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 case BINFLOAT:
4723 if (load_binfloat(self) < 0)
4724 break;
4725 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 case BINSTRING:
4728 if (load_binstring(self) < 0)
4729 break;
4730 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 case SHORT_BINSTRING:
4733 if (load_short_binstring(self) < 0)
4734 break;
4735 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case STRING:
4738 if (load_string(self) < 0)
4739 break;
4740 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004741
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004742#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 case UNICODE:
4744 if (load_unicode(self) < 0)
4745 break;
4746 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004747
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004748 case BINUNICODE:
4749 if (load_binunicode(self) < 0)
4750 break;
4751 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004752#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004755 if (load_counted_tuple(self, 0) < 0)
4756 break;
4757 continue;
4758
4759 case TUPLE1:
4760 if (load_counted_tuple(self, 1) < 0)
4761 break;
4762 continue;
4763
4764 case TUPLE2:
4765 if (load_counted_tuple(self, 2) < 0)
4766 break;
4767 continue;
4768
4769 case TUPLE3:
4770 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 break;
4772 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 case TUPLE:
4775 if (load_tuple(self) < 0)
4776 break;
4777 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 case EMPTY_LIST:
4780 if (load_empty_list(self) < 0)
4781 break;
4782 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case LIST:
4785 if (load_list(self) < 0)
4786 break;
4787 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case EMPTY_DICT:
4790 if (load_empty_dict(self) < 0)
4791 break;
4792 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 case DICT:
4795 if (load_dict(self) < 0)
4796 break;
4797 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 case OBJ:
4800 if (load_obj(self) < 0)
4801 break;
4802 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 case INST:
4805 if (load_inst(self) < 0)
4806 break;
4807 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004808
Tim Peterseab7db32003-02-13 18:24:14 +00004809 case NEWOBJ:
4810 if (load_newobj(self) < 0)
4811 break;
4812 continue;
4813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case GLOBAL:
4815 if (load_global(self) < 0)
4816 break;
4817 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case APPEND:
4820 if (load_append(self) < 0)
4821 break;
4822 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case APPENDS:
4825 if (load_appends(self) < 0)
4826 break;
4827 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case BUILD:
4830 if (load_build(self) < 0)
4831 break;
4832 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case DUP:
4835 if (load_dup(self) < 0)
4836 break;
4837 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 case BINGET:
4840 if (load_binget(self) < 0)
4841 break;
4842 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 case LONG_BINGET:
4845 if (load_long_binget(self) < 0)
4846 break;
4847 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case GET:
4850 if (load_get(self) < 0)
4851 break;
4852 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004853
Tim Peters2d629652003-02-04 05:06:17 +00004854 case EXT1:
4855 if (load_extension(self, 1) < 0)
4856 break;
4857 continue;
4858
4859 case EXT2:
4860 if (load_extension(self, 2) < 0)
4861 break;
4862 continue;
4863
4864 case EXT4:
4865 if (load_extension(self, 4) < 0)
4866 break;
4867 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004868 case MARK:
4869 if (load_mark(self) < 0)
4870 break;
4871 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004873 case BINPUT:
4874 if (load_binput(self) < 0)
4875 break;
4876 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 case LONG_BINPUT:
4879 if (load_long_binput(self) < 0)
4880 break;
4881 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 case PUT:
4884 if (load_put(self) < 0)
4885 break;
4886 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 case POP:
4889 if (load_pop(self) < 0)
4890 break;
4891 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893 case POP_MARK:
4894 if (load_pop_mark(self) < 0)
4895 break;
4896 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 case SETITEM:
4899 if (load_setitem(self) < 0)
4900 break;
4901 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903 case SETITEMS:
4904 if (load_setitems(self) < 0)
4905 break;
4906 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 case STOP:
4909 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 case PERSID:
4912 if (load_persid(self) < 0)
4913 break;
4914 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004916 case BINPERSID:
4917 if (load_binpersid(self) < 0)
4918 break;
4919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 case REDUCE:
4922 if (load_reduce(self) < 0)
4923 break;
4924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004925
Tim Peters4190fb82003-02-02 16:09:05 +00004926 case PROTO:
4927 if (load_proto(self) < 0)
4928 break;
4929 continue;
4930
Tim Peters3c67d792003-02-02 17:59:11 +00004931 case NEWTRUE:
4932 if (load_bool(self, Py_True) < 0)
4933 break;
4934 continue;
4935
4936 case NEWFALSE:
4937 if (load_bool(self, Py_False) < 0)
4938 break;
4939 continue;
4940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 case '\0':
4942 /* end of file */
4943 PyErr_SetNone(PyExc_EOFError);
4944 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004947 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 "invalid load key, '%s'.",
4949 "c", s[0]);
4950 return NULL;
4951 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 break;
4954 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 if ((err = PyErr_Occurred())) {
4957 if (err == PyExc_EOFError) {
4958 PyErr_SetNone(PyExc_EOFError);
4959 }
4960 return NULL;
4961 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 PDATA_POP(self->stack, val);
4964 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004965}
Tim Peters84e87f32001-03-17 04:50:51 +00004966
Guido van Rossum60456fd1997-04-09 17:36:32 +00004967
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968/* No-load functions to support noload, which is used to
4969 find persistent references. */
4970
4971static int
Tim Peterscba30e22003-02-01 06:24:36 +00004972noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973{
4974 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 if ((i = marker(self)) < 0) return -1;
4977 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004978}
4979
4980
4981static int
Tim Peterscba30e22003-02-01 06:24:36 +00004982noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983{
4984 int i;
4985 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 if ((i = marker(self)) < 0) return -1;
4988 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004989 if (self->readline_func(self, &s) < 0) return -1;
4990 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004991 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004993}
4994
4995static int
Tim Peterseab7db32003-02-13 18:24:14 +00004996noload_newobj(Unpicklerobject *self)
4997{
4998 PyObject *obj;
4999
5000 PDATA_POP(self->stack, obj); /* pop argtuple */
5001 if (obj == NULL) return -1;
5002 Py_DECREF(obj);
5003
5004 PDATA_POP(self->stack, obj); /* pop cls */
5005 if (obj == NULL) return -1;
5006 Py_DECREF(obj);
5007
5008 PDATA_APPEND(self->stack, Py_None, -1);
5009 return 0;
5010}
5011
5012static int
Tim Peterscba30e22003-02-01 06:24:36 +00005013noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014{
5015 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005016
Tim Peters0bc93f52003-02-02 18:29:33 +00005017 if (self->readline_func(self, &s) < 0) return -1;
5018 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019 PDATA_APPEND(self->stack, Py_None,-1);
5020 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005021}
5022
5023static int
Tim Peterscba30e22003-02-01 06:24:36 +00005024noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005027 if (self->stack->length < 2) return stackUnderflow();
5028 Pdata_clear(self->stack, self->stack->length-2);
5029 PDATA_APPEND(self->stack, Py_None,-1);
5030 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005031}
5032
5033static int
5034noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005035
Guido van Rossum053b8df1998-11-25 16:18:00 +00005036 if (self->stack->length < 1) return stackUnderflow();
5037 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00005038 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005039}
5040
Tim Peters2d629652003-02-04 05:06:17 +00005041static int
5042noload_extension(Unpicklerobject *self, int nbytes)
5043{
5044 char *codebytes;
5045
5046 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5047 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5048 PDATA_APPEND(self->stack, Py_None, -1);
5049 return 0;
5050}
5051
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005052
5053static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005054noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055{
5056 PyObject *err = 0, *val = 0;
5057 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 self->num_marks = 0;
5060 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005062 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00005063 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 switch (s[0]) {
5067 case NONE:
5068 if (load_none(self) < 0)
5069 break;
5070 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 case BININT:
5073 if (load_binint(self) < 0)
5074 break;
5075 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005077 case BININT1:
5078 if (load_binint1(self) < 0)
5079 break;
5080 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005082 case BININT2:
5083 if (load_binint2(self) < 0)
5084 break;
5085 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 case INT:
5088 if (load_int(self) < 0)
5089 break;
5090 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005092 case LONG:
5093 if (load_long(self) < 0)
5094 break;
5095 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005096
Tim Peters4190fb82003-02-02 16:09:05 +00005097 case LONG1:
5098 if (load_counted_long(self, 1) < 0)
5099 break;
5100 continue;
5101
5102 case LONG4:
5103 if (load_counted_long(self, 4) < 0)
5104 break;
5105 continue;
5106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 case FLOAT:
5108 if (load_float(self) < 0)
5109 break;
5110 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112 case BINFLOAT:
5113 if (load_binfloat(self) < 0)
5114 break;
5115 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117 case BINSTRING:
5118 if (load_binstring(self) < 0)
5119 break;
5120 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005122 case SHORT_BINSTRING:
5123 if (load_short_binstring(self) < 0)
5124 break;
5125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005127 case STRING:
5128 if (load_string(self) < 0)
5129 break;
5130 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005131
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005132#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 case UNICODE:
5134 if (load_unicode(self) < 0)
5135 break;
5136 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 case BINUNICODE:
5139 if (load_binunicode(self) < 0)
5140 break;
5141 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005142#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005145 if (load_counted_tuple(self, 0) < 0)
5146 break;
5147 continue;
5148
5149 case TUPLE1:
5150 if (load_counted_tuple(self, 1) < 0)
5151 break;
5152 continue;
5153
5154 case TUPLE2:
5155 if (load_counted_tuple(self, 2) < 0)
5156 break;
5157 continue;
5158
5159 case TUPLE3:
5160 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 break;
5162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 case TUPLE:
5165 if (load_tuple(self) < 0)
5166 break;
5167 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005169 case EMPTY_LIST:
5170 if (load_empty_list(self) < 0)
5171 break;
5172 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 case LIST:
5175 if (load_list(self) < 0)
5176 break;
5177 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 case EMPTY_DICT:
5180 if (load_empty_dict(self) < 0)
5181 break;
5182 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 case DICT:
5185 if (load_dict(self) < 0)
5186 break;
5187 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005189 case OBJ:
5190 if (noload_obj(self) < 0)
5191 break;
5192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005194 case INST:
5195 if (noload_inst(self) < 0)
5196 break;
5197 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005198
Tim Peterseab7db32003-02-13 18:24:14 +00005199 case NEWOBJ:
5200 if (noload_newobj(self) < 0)
5201 break;
5202 continue;
5203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 case GLOBAL:
5205 if (noload_global(self) < 0)
5206 break;
5207 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005209 case APPEND:
5210 if (load_append(self) < 0)
5211 break;
5212 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 case APPENDS:
5215 if (load_appends(self) < 0)
5216 break;
5217 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 case BUILD:
5220 if (noload_build(self) < 0)
5221 break;
5222 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224 case DUP:
5225 if (load_dup(self) < 0)
5226 break;
5227 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005229 case BINGET:
5230 if (load_binget(self) < 0)
5231 break;
5232 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234 case LONG_BINGET:
5235 if (load_long_binget(self) < 0)
5236 break;
5237 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 case GET:
5240 if (load_get(self) < 0)
5241 break;
5242 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005243
Tim Peters2d629652003-02-04 05:06:17 +00005244 case EXT1:
5245 if (noload_extension(self, 1) < 0)
5246 break;
5247 continue;
5248
5249 case EXT2:
5250 if (noload_extension(self, 2) < 0)
5251 break;
5252 continue;
5253
5254 case EXT4:
5255 if (noload_extension(self, 4) < 0)
5256 break;
5257 continue;
5258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005259 case MARK:
5260 if (load_mark(self) < 0)
5261 break;
5262 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005264 case BINPUT:
5265 if (load_binput(self) < 0)
5266 break;
5267 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 case LONG_BINPUT:
5270 if (load_long_binput(self) < 0)
5271 break;
5272 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274 case PUT:
5275 if (load_put(self) < 0)
5276 break;
5277 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005279 case POP:
5280 if (load_pop(self) < 0)
5281 break;
5282 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005284 case POP_MARK:
5285 if (load_pop_mark(self) < 0)
5286 break;
5287 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005289 case SETITEM:
5290 if (load_setitem(self) < 0)
5291 break;
5292 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005294 case SETITEMS:
5295 if (load_setitems(self) < 0)
5296 break;
5297 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005299 case STOP:
5300 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005302 case PERSID:
5303 if (load_persid(self) < 0)
5304 break;
5305 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005307 case BINPERSID:
5308 if (load_binpersid(self) < 0)
5309 break;
5310 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005312 case REDUCE:
5313 if (noload_reduce(self) < 0)
5314 break;
5315 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005316
Tim Peters4190fb82003-02-02 16:09:05 +00005317 case PROTO:
5318 if (load_proto(self) < 0)
5319 break;
5320 continue;
5321
Tim Peters3c67d792003-02-02 17:59:11 +00005322 case NEWTRUE:
5323 if (load_bool(self, Py_True) < 0)
5324 break;
5325 continue;
5326
5327 case NEWFALSE:
5328 if (load_bool(self, Py_False) < 0)
5329 break;
5330 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005332 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 "invalid load key, '%s'.",
5334 "c", s[0]);
5335 return NULL;
5336 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005338 break;
5339 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005341 if ((err = PyErr_Occurred())) {
5342 if (err == PyExc_EOFError) {
5343 PyErr_SetNone(PyExc_EOFError);
5344 }
5345 return NULL;
5346 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005348 PDATA_POP(self->stack, val);
5349 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005350}
Tim Peters84e87f32001-03-17 04:50:51 +00005351
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005352
Guido van Rossum60456fd1997-04-09 17:36:32 +00005353static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005354Unpickler_load(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 load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005357}
5358
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005359static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005360Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005361{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005362 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005363}
5364
Guido van Rossum60456fd1997-04-09 17:36:32 +00005365
5366static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005367 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005368 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005369 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005370 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005371 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005372 "noload() -- not load a pickle, but go through most of the motions\n"
5373 "\n"
5374 "This function can be used to read past a pickle without instantiating\n"
5375 "any objects or importing any modules. It can also be used to find all\n"
5376 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005377 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005378 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005379 {NULL, NULL} /* sentinel */
5380};
5381
5382
5383static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005384newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385{
5386 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005387
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005388 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005389 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 self->file = NULL;
5392 self->arg = NULL;
5393 self->stack = (Pdata*)Pdata_New();
5394 self->pers_func = NULL;
5395 self->last_string = NULL;
5396 self->marks = NULL;
5397 self->num_marks = 0;
5398 self->marks_size = 0;
5399 self->buf_size = 0;
5400 self->read = NULL;
5401 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005403
Tim Peterscba30e22003-02-01 06:24:36 +00005404 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005406
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005407 if (!self->stack)
5408 goto err;
5409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005410 Py_INCREF(f);
5411 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005413 /* Set read, readline based on type of f */
5414 if (PyFile_Check(f)) {
5415 self->fp = PyFile_AsFile(f);
5416 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005417 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 "I/O operation on closed file");
5419 goto err;
5420 }
5421 self->read_func = read_file;
5422 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005423 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424 else if (PycStringIO_InputCheck(f)) {
5425 self->fp = NULL;
5426 self->read_func = read_cStringIO;
5427 self->readline_func = readline_cStringIO;
5428 }
5429 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005431 self->fp = NULL;
5432 self->read_func = read_other;
5433 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005435 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5436 (self->read = PyObject_GetAttr(f, read_str)))) {
5437 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005438 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 "argument must have 'read' and "
5440 "'readline' attributes" );
5441 goto err;
5442 }
5443 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005444 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005448 err:
5449 Py_DECREF((PyObject *)self);
5450 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005451}
5452
5453
5454static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005455get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005457 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005458}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005459
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005460
Guido van Rossum60456fd1997-04-09 17:36:32 +00005461static void
Tim Peterscba30e22003-02-01 06:24:36 +00005462Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005464 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 Py_XDECREF(self->readline);
5466 Py_XDECREF(self->read);
5467 Py_XDECREF(self->file);
5468 Py_XDECREF(self->memo);
5469 Py_XDECREF(self->stack);
5470 Py_XDECREF(self->pers_func);
5471 Py_XDECREF(self->arg);
5472 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005473 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 if (self->marks) {
5476 free(self->marks);
5477 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 if (self->buf_size) {
5480 free(self->buf);
5481 }
Tim Peters84e87f32001-03-17 04:50:51 +00005482
Christian Heimese93237d2007-12-19 02:37:44 +00005483 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005484}
5485
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005486static int
5487Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5488{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005489 Py_VISIT(self->readline);
5490 Py_VISIT(self->read);
5491 Py_VISIT(self->file);
5492 Py_VISIT(self->memo);
5493 Py_VISIT(self->stack);
5494 Py_VISIT(self->pers_func);
5495 Py_VISIT(self->arg);
5496 Py_VISIT(self->last_string);
5497 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005498 return 0;
5499}
5500
5501static int
5502Unpickler_clear(Unpicklerobject *self)
5503{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005504 Py_CLEAR(self->readline);
5505 Py_CLEAR(self->read);
5506 Py_CLEAR(self->file);
5507 Py_CLEAR(self->memo);
5508 Py_CLEAR(self->stack);
5509 Py_CLEAR(self->pers_func);
5510 Py_CLEAR(self->arg);
5511 Py_CLEAR(self->last_string);
5512 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005513 return 0;
5514}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005515
5516static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005517Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005518{
5519 if (!strcmp(name, "persistent_load")) {
5520 if (!self->pers_func) {
5521 PyErr_SetString(PyExc_AttributeError, name);
5522 return NULL;
5523 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005525 Py_INCREF(self->pers_func);
5526 return self->pers_func;
5527 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005529 if (!strcmp(name, "find_global")) {
5530 if (!self->find_class) {
5531 PyErr_SetString(PyExc_AttributeError, name);
5532 return NULL;
5533 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005535 Py_INCREF(self->find_class);
5536 return self->find_class;
5537 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005539 if (!strcmp(name, "memo")) {
5540 if (!self->memo) {
5541 PyErr_SetString(PyExc_AttributeError, name);
5542 return NULL;
5543 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005545 Py_INCREF(self->memo);
5546 return self->memo;
5547 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005549 if (!strcmp(name, "UnpicklingError")) {
5550 Py_INCREF(UnpicklingError);
5551 return UnpicklingError;
5552 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005554 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005555}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005556
Guido van Rossum60456fd1997-04-09 17:36:32 +00005557
5558static int
Tim Peterscba30e22003-02-01 06:24:36 +00005559Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005560{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005562 if (!strcmp(name, "persistent_load")) {
5563 Py_XDECREF(self->pers_func);
5564 self->pers_func = value;
5565 Py_XINCREF(value);
5566 return 0;
5567 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005569 if (!strcmp(name, "find_global")) {
5570 Py_XDECREF(self->find_class);
5571 self->find_class = value;
5572 Py_XINCREF(value);
5573 return 0;
5574 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005576 if (! value) {
5577 PyErr_SetString(PyExc_TypeError,
5578 "attribute deletion is not supported");
5579 return -1;
5580 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005582 if (strcmp(name, "memo") == 0) {
5583 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005584 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005585 "memo must be a dictionary");
5586 return -1;
5587 }
5588 Py_XDECREF(self->memo);
5589 self->memo = value;
5590 Py_INCREF(value);
5591 return 0;
5592 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005594 PyErr_SetString(PyExc_AttributeError, name);
5595 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005596}
5597
Tim Peters5bd2a792003-02-01 16:45:06 +00005598/* ---------------------------------------------------------------------------
5599 * Module-level functions.
5600 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005601
Martin v. Löwis544f1192004-07-27 05:22:33 +00005602/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005603static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005604cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005605{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005606 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005607 PyObject *ob, *file, *res = NULL;
5608 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005609 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005610
Martin v. Löwis544f1192004-07-27 05:22:33 +00005611 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5612 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005613 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005614
Tim Peters5bd2a792003-02-01 16:45:06 +00005615 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005616 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005618 if (dump(pickler, ob) < 0)
5619 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005621 Py_INCREF(Py_None);
5622 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005624 finally:
5625 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005627 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005628}
5629
5630
Martin v. Löwis544f1192004-07-27 05:22:33 +00005631/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005632static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005633cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005634{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005635 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005636 PyObject *ob, *file = 0, *res = NULL;
5637 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005638 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005639
Martin v. Löwis544f1192004-07-27 05:22:33 +00005640 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5641 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005642 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005643
Tim Peterscba30e22003-02-01 06:24:36 +00005644 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005645 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005646
Tim Peters5bd2a792003-02-01 16:45:06 +00005647 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005648 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005650 if (dump(pickler, ob) < 0)
5651 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005653 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005655 finally:
5656 Py_XDECREF(pickler);
5657 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005659 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005660}
5661
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005662
Tim Peters5bd2a792003-02-01 16:45:06 +00005663/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005664static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005665cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005666{
5667 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005668 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005669
Tim Peterscba30e22003-02-01 06:24:36 +00005670 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005671 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005675 finally:
5676 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005678 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005679}
5680
5681
Tim Peters5bd2a792003-02-01 16:45:06 +00005682/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005683static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005684cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685{
5686 PyObject *ob, *file = 0, *res = NULL;
5687 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005688
Tim Peterscba30e22003-02-01 06:24:36 +00005689 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005690 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005691
Tim Peterscba30e22003-02-01 06:24:36 +00005692 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005693 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005694
Tim Peterscba30e22003-02-01 06:24:36 +00005695 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005696 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005698 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005700 finally:
5701 Py_XDECREF(file);
5702 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005704 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005705}
5706
5707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005708PyDoc_STRVAR(Unpicklertype__doc__,
5709"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005710
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005711static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005712 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005713 "cPickle.Unpickler", /*tp_name*/
5714 sizeof(Unpicklerobject), /*tp_basicsize*/
5715 0,
5716 (destructor)Unpickler_dealloc, /* tp_dealloc */
5717 0, /* tp_print */
5718 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5719 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5720 0, /* tp_compare */
5721 0, /* tp_repr */
5722 0, /* tp_as_number */
5723 0, /* tp_as_sequence */
5724 0, /* tp_as_mapping */
5725 0, /* tp_hash */
5726 0, /* tp_call */
5727 0, /* tp_str */
5728 0, /* tp_getattro */
5729 0, /* tp_setattro */
5730 0, /* tp_as_buffer */
5731 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5732 Unpicklertype__doc__, /* tp_doc */
5733 (traverseproc)Unpickler_traverse, /* tp_traverse */
5734 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005735};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005736
Guido van Rossum60456fd1997-04-09 17:36:32 +00005737static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005738 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5739 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005740 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005741 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005742 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005743 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005744
Martin v. Löwis544f1192004-07-27 05:22:33 +00005745 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5746 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005747 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005748 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005749 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005750 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005751
Georg Brandl96a8c392006-05-29 21:04:52 +00005752 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005753 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005754
Neal Norwitzb0493252002-03-31 14:44:22 +00005755 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005756 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005757
Martin v. Löwis544f1192004-07-27 05:22:33 +00005758 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5759 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005760 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005761 "This takes a file-like object for writing a pickle data stream.\n"
5762 "The optional proto argument tells the pickler to use the given\n"
5763 "protocol; supported protocols are 0, 1, 2. The default\n"
5764 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5765 "only protocol that can be written to a file opened in text\n"
5766 "mode and read back successfully. When using a protocol higher\n"
5767 "than 0, make sure the file is opened in binary mode, both when\n"
5768 "pickling and unpickling.)\n"
5769 "\n"
5770 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5771 "more efficient than protocol 1.\n"
5772 "\n"
5773 "Specifying a negative protocol version selects the highest\n"
5774 "protocol version supported. The higher the protocol used, the\n"
5775 "more recent the version of Python needed to read the pickle\n"
5776 "produced.\n"
5777 "\n"
5778 "The file parameter must have a write() method that accepts a single\n"
5779 "string argument. It can thus be an open file object, a StringIO\n"
5780 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005781 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005782
Georg Brandl96a8c392006-05-29 21:04:52 +00005783 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005784 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5785
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005786 { NULL, NULL }
5787};
5788
Guido van Rossum60456fd1997-04-09 17:36:32 +00005789static int
Tim Peterscba30e22003-02-01 06:24:36 +00005790init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005791{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005792 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005793
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005794#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005795
Tim Peters3cfe7542003-05-21 21:29:48 +00005796 if (PyType_Ready(&Unpicklertype) < 0)
5797 return -1;
5798 if (PyType_Ready(&Picklertype) < 0)
5799 return -1;
5800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005801 INIT_STR(__class__);
5802 INIT_STR(__getinitargs__);
5803 INIT_STR(__dict__);
5804 INIT_STR(__getstate__);
5805 INIT_STR(__setstate__);
5806 INIT_STR(__name__);
5807 INIT_STR(__main__);
5808 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005809 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005810 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005811 INIT_STR(append);
5812 INIT_STR(read);
5813 INIT_STR(readline);
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005814 INIT_STR(copyreg);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005815 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005816
Georg Brandldffbf5f2008-05-20 07:49:57 +00005817 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005818 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005819
Tim Peters1f1b2d22003-02-01 02:16:37 +00005820 /* This is special because we want to use a different
5821 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005822 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005823 if (!dispatch_table) return -1;
5824
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005825 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005826 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005827 if (!extension_registry) return -1;
5828
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005829 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005830 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005831 if (!inverted_registry) return -1;
5832
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005833 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005834 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005835 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005836
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005837 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005838
Tim Peters731098b2003-02-04 20:56:09 +00005839 if (!(empty_tuple = PyTuple_New(0)))
5840 return -1;
5841
5842 two_tuple = PyTuple_New(2);
5843 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005844 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005845 /* We use this temp container with no regard to refcounts, or to
5846 * keeping containees alive. Exempt from GC, because we don't
5847 * want anything looking at two_tuple() by magic.
5848 */
5849 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005851 /* Ugh */
5852 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5853 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5854 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005856 if (!( t=PyDict_New())) return -1;
5857 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005858 "def __str__(self):\n"
5859 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5860 Py_file_input,
5861 module_dict, t) )) return -1;
5862 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005864 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005865 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005866 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005868 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005869
Tim Peterscba30e22003-02-01 06:24:36 +00005870 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005871 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005872 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005873 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005875 if (!( t=PyDict_New())) return -1;
5876 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005877 "def __str__(self):\n"
5878 " a=self.args\n"
5879 " a=a and type(a[0]) or '(what)'\n"
5880 " return 'Cannot pickle %s objects' % a\n"
5881 , Py_file_input,
5882 module_dict, t) )) return -1;
5883 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005885 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005886 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005887 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005889 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005891 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005892 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005893 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005894
Martin v. Löwis658009a2002-09-16 17:26:24 +00005895 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5896 UnpicklingError, NULL)))
5897 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005899 if (PyDict_SetItemString(module_dict, "PickleError",
5900 PickleError) < 0)
5901 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005903 if (PyDict_SetItemString(module_dict, "PicklingError",
5904 PicklingError) < 0)
5905 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005907 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5908 UnpicklingError) < 0)
5909 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005911 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5912 UnpickleableError) < 0)
5913 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005915 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5916 BadPickleGet) < 0)
5917 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005919 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005921 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005922}
5923
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005924#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5925#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005926#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005927PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005928initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005929{
5930 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005931 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005932 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005933 PyObject *format_version;
5934 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005935
Alexandre Vassalotti3c4971c2008-05-16 19:14:31 +00005936 /* XXX: Should mention that the pickle module will include the C
5937 XXX: optimized implementation automatically. */
5938 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5939 "Python 3.0", 2) < 0)
5940 return;
5941
Christian Heimese93237d2007-12-19 02:37:44 +00005942 Py_TYPE(&Picklertype) = &PyType_Type;
5943 Py_TYPE(&Unpicklertype) = &PyType_Type;
5944 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005946 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005947 * so we're forced to use a temporary dictionary. :(
5948 */
5949 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005950 if (!di) return;
5951 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005953 /* Create the module and add the functions */
5954 m = Py_InitModule4("cPickle", cPickle_methods,
5955 cPickle_module_documentation,
5956 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005957 if (m == NULL)
5958 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005960 /* Add some symbolic constants to the module */
5961 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005962 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005963 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005964 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005966 /* Copy data from di. Waaa. */
5967 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5968 if (PyObject_SetItem(d, k, v) < 0) {
5969 Py_DECREF(di);
5970 return;
5971 }
5972 }
5973 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005974
Tim Peters8587b3c2003-02-13 15:44:41 +00005975 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5976 if (i < 0)
5977 return;
5978
Tim Peters5b7da392003-02-04 00:21:07 +00005979 /* These are purely informational; no code uses them. */
5980 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005981 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00005982 /* Format versions we can read. */
5983 compatible_formats = Py_BuildValue("[sssss]",
5984 "1.0", /* Original protocol 0 */
5985 "1.1", /* Protocol 0 + INST */
5986 "1.2", /* Original protocol 1 */
5987 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005988 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005989 PyDict_SetItemString(d, "format_version", format_version);
5990 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5991 Py_XDECREF(format_version);
5992 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005993}