blob: fbb1888aaa9f3c6dc689fde29d4c8602a9a43895 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
Martin v. Löwis9ac49272009-01-02 20:40:14 +000021 * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since
22 * all headers have already been included here, we can safely redefine it.
23 */
24#ifdef UNICODE
25# undef UNICODE
26#endif
27
28/*
Tim Peters797ec242003-02-01 06:22:36 +000029 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
30 * docs are in pickletools.py.
31 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000032#define MARK '('
33#define STOP '.'
34#define POP '0'
35#define POP_MARK '1'
36#define DUP '2'
37#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000038#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000039#define INT 'I'
40#define BININT 'J'
41#define BININT1 'K'
42#define LONG 'L'
43#define BININT2 'M'
44#define NONE 'N'
45#define PERSID 'P'
46#define BINPERSID 'Q'
47#define REDUCE 'R'
48#define STRING 'S'
49#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000050#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000051#define UNICODE 'V'
52#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000053#define APPEND 'a'
54#define BUILD 'b'
55#define GLOBAL 'c'
56#define DICT 'd'
57#define EMPTY_DICT '}'
58#define APPENDS 'e'
59#define GET 'g'
60#define BINGET 'h'
61#define INST 'i'
62#define LONG_BINGET 'j'
63#define LIST 'l'
64#define EMPTY_LIST ']'
65#define OBJ 'o'
66#define PUT 'p'
67#define BINPUT 'q'
68#define LONG_BINPUT 'r'
69#define SETITEM 's'
70#define TUPLE 't'
71#define EMPTY_TUPLE ')'
72#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000073
74/* Protocol 2. */
75#define PROTO '\x80' /* identify pickle protocol */
76#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
77#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
78#define EXT2 '\x83' /* ditto, but 2-byte index */
79#define EXT4 '\x84' /* ditto, but 4-byte index */
80#define TUPLE1 '\x85' /* build 1-tuple from stack top */
81#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
82#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
83#define NEWTRUE '\x88' /* push True */
84#define NEWFALSE '\x89' /* push False */
85#define LONG1 '\x8a' /* push long from < 256 bytes */
86#define LONG4 '\x8b' /* push really big long */
87
88/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
89 * so that unpicklers written before bools were introduced unpickle them
90 * as ints, but unpicklers after can recognize that bools were intended.
91 * Note that protocol 2 added direct ways to pickle bools.
92 */
Jack Jansen3a967022002-06-26 20:40:42 +000093#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000094#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000095#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000096#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000097
Tim Peters1092d642003-02-11 21:06:20 +000098/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000099 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
100 * break if this gets out of synch with pickle.py, but it's unclear that
101 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +0000102 */
103#define BATCHSIZE 1000
104
Guido van Rossum60456fd1997-04-09 17:36:32 +0000105static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000106
Guido van Rossumc03158b1999-06-09 15:23:31 +0000107static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000108static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000109static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000110static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000111static PyObject *BadPickleGet;
112
Tim Peters5b7da392003-02-04 00:21:07 +0000113/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000114static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000115
Georg Brandldffbf5f2008-05-20 07:49:57 +0000116/* copy_reg.dispatch_table, {type_object: pickling_function} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *dispatch_table;
118
119/* For EXT[124] opcodes. */
Georg Brandldffbf5f2008-05-20 07:49:57 +0000120/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000121static PyObject *extension_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000122/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000123static PyObject *inverted_registry;
Georg Brandldffbf5f2008-05-20 07:49:57 +0000124/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000125static PyObject *extension_cache;
126
Georg Brandldffbf5f2008-05-20 07:49:57 +0000127/* For looking up name pairs in copy_reg._extension_registry. */
Tim Peters731098b2003-02-04 20:56:09 +0000128static PyObject *two_tuple;
129
Guido van Rossum60456fd1997-04-09 17:36:32 +0000130static PyObject *__class___str, *__getinitargs___str, *__dict___str,
131 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000132 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000133 *write_str, *append_str,
Neal Norwitzb183a252006-04-10 01:03:32 +0000134 *read_str, *readline_str, *__main___str,
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +0000135 *copyreg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000136
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137/*************************************************************************
138 Internal Data type for pickle data. */
139
140typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000142 int length; /* number of initial slots in data currently used */
143 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000144 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000145} Pdata;
146
Tim Peters84e87f32001-03-17 04:50:51 +0000147static void
Tim Peterscba30e22003-02-01 06:24:36 +0000148Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149{
150 int i;
151 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000152
Tim Peters1d63c9f2003-02-02 20:29:39 +0000153 for (i = self->length, p = self->data; --i >= 0; p++) {
154 Py_DECREF(*p);
155 }
156 if (self->data)
157 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000158 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000159}
160
161static PyTypeObject PdataType = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000162 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163 (destructor)Pdata_dealloc,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165};
166
Christian Heimese93237d2007-12-19 02:37:44 +0000167#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000168
169static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000170Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000171{
172 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173
Tim Peters1d63c9f2003-02-02 20:29:39 +0000174 if (!(self = PyObject_New(Pdata, &PdataType)))
175 return NULL;
176 self->size = 8;
177 self->length = 0;
178 self->data = malloc(self->size * sizeof(PyObject*));
179 if (self->data)
180 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000181 Py_DECREF(self);
182 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000183}
184
Tim Peters84e87f32001-03-17 04:50:51 +0000185static int
Tim Peterscba30e22003-02-01 06:24:36 +0000186stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000187{
188 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
189 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000190}
191
Tim Peters1d63c9f2003-02-02 20:29:39 +0000192/* Retain only the initial clearto items. If clearto >= the current
193 * number of items, this is a (non-erroneous) NOP.
194 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195static int
Tim Peterscba30e22003-02-01 06:24:36 +0000196Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000197{
198 int i;
199 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000201 if (clearto < 0) return stackUnderflow();
202 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000203
Tim Peters1d63c9f2003-02-02 20:29:39 +0000204 for (i = self->length, p = self->data + clearto;
205 --i >= clearto;
206 p++) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000207 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000208 }
209 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000211 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000212}
213
Tim Peters84e87f32001-03-17 04:50:51 +0000214static int
Tim Peterscba30e22003-02-01 06:24:36 +0000215Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000216{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000217 int bigger;
218 size_t nbytes;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000219 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000220
Tim Peters1d63c9f2003-02-02 20:29:39 +0000221 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000222 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
224 if ((int)(size_t)bigger != bigger)
225 goto nomemory;
226 nbytes = (size_t)bigger * sizeof(PyObject *);
227 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
228 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000229 tmp = realloc(self->data, nbytes);
230 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000231 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000232 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000233 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000234 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235
236 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000237 PyErr_NoMemory();
238 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000239}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000240
Tim Peterse0a39072003-02-03 15:45:56 +0000241/* D is a Pdata*. Pop the topmost element and store it into V, which
242 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000243 * is raised and V is set to NULL. D and V may be evaluated several times.
244 */
245#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000246 if ((D)->length) \
247 (V) = (D)->data[--((D)->length)]; \
248 else { \
249 PyErr_SetString(UnpicklingError, "bad pickle data"); \
250 (V) = NULL; \
251 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000252}
253
Tim Peterse0a39072003-02-03 15:45:56 +0000254/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
255 * D. If the Pdata stack can't be grown to hold the new value, both
256 * raise MemoryError and execute "return ER". The difference is in ownership
257 * of O after: _PUSH transfers ownership of O from the caller to the stack
258 * (no incref of O is done, and in case of error O is decrefed), while
259 * _APPEND pushes a new reference.
260 */
261
262/* Push O on stack D, giving ownership of O to the stack. */
263#define PDATA_PUSH(D, O, ER) { \
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
265 Pdata_grow((Pdata*)(D)) < 0) { \
266 Py_DECREF(O); \
267 return ER; \
268 } \
269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
270}
271
272/* Push O on stack D, pushing a new reference. */
273#define PDATA_APPEND(D, O, ER) { \
274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
275 Pdata_grow((Pdata*)(D)) < 0) \
276 return ER; \
277 Py_INCREF(O); \
278 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
279}
280
281
Guido van Rossum053b8df1998-11-25 16:18:00 +0000282static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000283Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284{
285 PyObject *r;
286 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000287
Tim Peters1d63c9f2003-02-02 20:29:39 +0000288 l = self->length-start;
289 r = PyTuple_New(l);
290 if (r == NULL)
291 return NULL;
292 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000294
Tim Peters1d63c9f2003-02-02 20:29:39 +0000295 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000296 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000297}
298
299static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000300Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301{
302 PyObject *r;
303 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000305 l=self->length-start;
306 if (!( r=PyList_New(l))) return NULL;
307 for (i=start, j=0 ; j < l; i++, j++)
308 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000310 self->length=start;
311 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000312}
313
Guido van Rossum053b8df1998-11-25 16:18:00 +0000314/*************************************************************************/
315
316#define ARG_TUP(self, o) { \
317 if (self->arg || (self->arg=PyTuple_New(1))) { \
318 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
319 PyTuple_SET_ITEM(self->arg,0,o); \
320 } \
321 else { \
322 Py_DECREF(o); \
323 } \
324}
325
326#define FREE_ARG_TUP(self) { \
Christian Heimese93237d2007-12-19 02:37:44 +0000327 if (Py_REFCNT(self->arg) > 1) { \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000328 Py_DECREF(self->arg); \
329 self->arg=NULL; \
330 } \
331 }
332
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000333typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000334 PyObject_HEAD
335 FILE *fp;
336 PyObject *write;
337 PyObject *file;
338 PyObject *memo;
339 PyObject *arg;
340 PyObject *pers_func;
341 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000342
343 /* pickle protocol number, >= 0 */
344 int proto;
345
346 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000347 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000349 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000350 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000351 char *write_buf;
352 int buf_size;
353 PyObject *dispatch_table;
354 int fast_container; /* count nested container dumps */
355 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356} Picklerobject;
357
Barry Warsaw52acb492001-12-21 20:04:22 +0000358#ifndef PY_CPICKLE_FAST_LIMIT
359#define PY_CPICKLE_FAST_LIMIT 50
360#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000361
Jeremy Hylton938ace62002-07-17 16:30:39 +0000362static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000363
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000364typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000365 PyObject_HEAD
366 FILE *fp;
367 PyObject *file;
368 PyObject *readline;
369 PyObject *read;
370 PyObject *memo;
371 PyObject *arg;
372 Pdata *stack;
373 PyObject *mark;
374 PyObject *pers_func;
375 PyObject *last_string;
376 int *marks;
377 int num_marks;
378 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000379 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
380 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000381 int buf_size;
382 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000383 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000384} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000385
Jeremy Hylton938ace62002-07-17 16:30:39 +0000386static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000387
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000388/* Forward decls that need the above structs */
389static int save(Picklerobject *, PyObject *, int);
390static int put2(Picklerobject *, PyObject *);
391
Guido van Rossumd385d591997-04-09 17:47:47 +0000392static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000394cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
395{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000396 va_list va;
397 PyObject *args=0, *retval=0;
398 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000400 if (format) args = Py_VaBuildValue(format, va);
401 va_end(va);
402 if (format && ! args) return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000403 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000406 if (retval) {
407 if (args) {
408 PyObject *v;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000409 v=PyString_Format(retval, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000410 Py_DECREF(retval);
411 Py_DECREF(args);
412 if (! v) return NULL;
413 retval=v;
414 }
415 }
416 else
417 if (args) retval=args;
418 else {
419 PyErr_SetObject(ErrType,Py_None);
420 return NULL;
421 }
422 PyErr_SetObject(ErrType,retval);
423 Py_DECREF(retval);
424 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000425}
426
Tim Peters84e87f32001-03-17 04:50:51 +0000427static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000428write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429{
430 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000432 if (s == NULL) {
433 return 0;
434 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000435
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436 if (n > INT_MAX) {
437 /* String too large */
438 return -1;
439 }
440
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000441 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000442 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000443 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000444 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000445 PyFile_DecUseCount((PyFileObject *)self->file);
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000446 if (nbyteswritten != (size_t)n) {
447 PyErr_SetFromErrno(PyExc_IOError);
448 return -1;
449 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450
Martin v. Löwis18e16552006-02-15 17:27:45 +0000451 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000452}
453
Tim Peters84e87f32001-03-17 04:50:51 +0000454static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000455write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000456{
457 if (s == NULL) {
458 return 0;
459 }
Tim Peterscba30e22003-02-01 06:24:36 +0000460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
462 return -1;
463 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000464
Martin v. Löwis18e16552006-02-15 17:27:45 +0000465 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000466}
467
Tim Peters84e87f32001-03-17 04:50:51 +0000468static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000469write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000470{
471 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000472 if (n > INT_MAX) return -1;
473 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000474}
475
Tim Peters84e87f32001-03-17 04:50:51 +0000476static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000477write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000478{
479 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000480 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000481
Martin v. Löwis18e16552006-02-15 17:27:45 +0000482 if (_n > INT_MAX)
483 return -1;
484 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000485 if (s == NULL) {
486 if (!( self->buf_size )) return 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000487 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000488 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000489 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000490 return -1;
491 }
492 else {
493 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
494 if (write_other(self, NULL, 0) < 0)
495 return -1;
496 }
Tim Peterscba30e22003-02-01 06:24:36 +0000497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000498 if (n > WRITE_BUF_SIZE) {
499 if (!( py_str =
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000500 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 return -1;
502 }
503 else {
504 memcpy(self->write_buf + self->buf_size, s, n);
505 self->buf_size += n;
506 return n;
507 }
508 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000510 if (self->write) {
511 /* object with write method */
512 ARG_TUP(self, py_str);
513 if (self->arg) {
514 junk = PyObject_Call(self->write, self->arg, NULL);
515 FREE_ARG_TUP(self);
516 }
517 if (junk) Py_DECREF(junk);
518 else return -1;
519 }
520 else
521 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 self->buf_size = 0;
524 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000525}
526
527
Martin v. Löwis18e16552006-02-15 17:27:45 +0000528static Py_ssize_t
529read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000530{
531 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 if (self->buf_size == 0) {
534 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000536 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000537 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = size;
543 }
544 else if (n > self->buf_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000545 char *newbuf = (char *)realloc(self->buf, n);
546 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 PyErr_NoMemory();
548 return -1;
549 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000550 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551 self->buf_size = n;
552 }
Tim Peters84e87f32001-03-17 04:50:51 +0000553
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000554 PyFile_IncUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000555 Py_BEGIN_ALLOW_THREADS
556 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
557 Py_END_ALLOW_THREADS
Gregory P. Smithc20adf82008-04-07 06:33:21 +0000558 PyFile_DecUseCount((PyFileObject *)self->file);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 if (nbytesread != (size_t)n) {
560 if (feof(self->fp)) {
561 PyErr_SetNone(PyExc_EOFError);
562 return -1;
563 }
Tim Peterscba30e22003-02-01 06:24:36 +0000564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565 PyErr_SetFromErrno(PyExc_IOError);
566 return -1;
567 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000572}
573
574
Martin v. Löwis18e16552006-02-15 17:27:45 +0000575static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000576readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577{
578 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000580 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000581 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000582 PyErr_NoMemory();
583 return -1;
584 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000585 self->buf_size = 40;
586 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 i = 0;
589 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000590 int bigger;
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000591 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000593 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000594 (self->buf[i] = getc(self->fp)) == '\n') {
595 self->buf[i + 1] = '\0';
596 *s = self->buf;
597 return i + 1;
598 }
599 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 bigger = self->buf_size << 1;
601 if (bigger <= 0) { /* overflow */
602 PyErr_NoMemory();
603 return -1;
604 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000605 newbuf = (char *)realloc(self->buf, bigger);
606 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 PyErr_NoMemory();
608 return -1;
609 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +0000610 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000611 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 }
Tim Peters84e87f32001-03-17 04:50:51 +0000613}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
615
Martin v. Löwis18e16552006-02-15 17:27:45 +0000616static Py_ssize_t
617read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618{
619 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000621 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
622 PyErr_SetNone(PyExc_EOFError);
623 return -1;
624 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000626 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629}
630
631
Martin v. Löwis18e16552006-02-15 17:27:45 +0000632static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000633readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000634{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000635 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000638 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
639 return -1;
640 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000642 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000645}
646
647
Martin v. Löwis18e16552006-02-15 17:27:45 +0000648static Py_ssize_t
649read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650{
651 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000652
Martin v. Löwis18e16552006-02-15 17:27:45 +0000653 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 ARG_TUP(self, bytes);
656 if (self->arg) {
657 str = PyObject_Call(self->read, self->arg, NULL);
658 FREE_ARG_TUP(self);
659 }
660 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 Py_XDECREF(self->last_string);
663 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000665 if (! (*s = PyString_AsString(str))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000667}
668
669
Martin v. Löwis18e16552006-02-15 17:27:45 +0000670static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000671readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672{
673 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000676 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
677 return -1;
678 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000680 if ((str_size = PyString_Size(str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000681 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000683 Py_XDECREF(self->last_string);
684 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000686 if (! (*s = PyString_AsString(str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000690}
691
Tim Petersee1a53c2003-02-02 02:57:53 +0000692/* Copy the first n bytes from s into newly malloc'ed memory, plus a
693 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
694 * The caller is responsible for free()'ing the return value.
695 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000696static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000697pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698{
Tim Petersee1a53c2003-02-02 02:57:53 +0000699 char *r = (char *)malloc(n+1);
700 if (r == NULL)
701 return (char*)PyErr_NoMemory();
702 memcpy(r, s, n);
703 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000705}
706
707
708static int
Tim Peterscba30e22003-02-01 06:24:36 +0000709get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710{
711 PyObject *value, *mv;
712 long c_value;
713 char s[30];
714 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!( mv = PyDict_GetItem(self->memo, id))) {
717 PyErr_SetObject(PyExc_KeyError, id);
718 return -1;
719 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Tim Peterscba30e22003-02-01 06:24:36 +0000721 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000722 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000724 if (!( PyInt_Check(value))) {
725 PyErr_SetString(PicklingError, "no int where int expected in memo");
726 return -1;
727 }
728 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 if (!self->bin) {
731 s[0] = GET;
732 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
733 len = strlen(s);
734 }
735 else if (Pdata_Check(self->file)) {
736 if (write_other(self, NULL, 0) < 0) return -1;
737 PDATA_APPEND(self->file, mv, -1);
738 return 0;
739 }
740 else {
741 if (c_value < 256) {
742 s[0] = BINGET;
743 s[1] = (int)(c_value & 0xff);
744 len = 2;
745 }
746 else {
747 s[0] = LONG_BINGET;
748 s[1] = (int)(c_value & 0xff);
749 s[2] = (int)((c_value >> 8) & 0xff);
750 s[3] = (int)((c_value >> 16) & 0xff);
751 s[4] = (int)((c_value >> 24) & 0xff);
752 len = 5;
753 }
754 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000755
Tim Peters0bc93f52003-02-02 18:29:33 +0000756 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000758
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000759 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000761
Guido van Rossum60456fd1997-04-09 17:36:32 +0000762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763static int
Tim Peterscba30e22003-02-01 06:24:36 +0000764put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000765{
Christian Heimese93237d2007-12-19 02:37:44 +0000766 if (Py_REFCNT(ob) < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000767 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000769 return put2(self, ob);
770}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000771
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773static int
Tim Peterscba30e22003-02-01 06:24:36 +0000774put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000775{
776 char c_str[30];
777 int p;
778 size_t len;
779 int res = -1;
780 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000782 if (self->fast)
783 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 if ((p = PyDict_Size(self->memo)) < 0)
786 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000789 /* XXX Why?
790 * XXX And does "positive" really mean non-negative?
791 * XXX pickle.py starts with PUT index 0, not 1. This makes for
792 * XXX gratuitous differences between the pickling modules.
793 */
Tim Peterscba30e22003-02-01 06:24:36 +0000794 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000795
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000798
Tim Peterscba30e22003-02-01 06:24:36 +0000799 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000800 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000801
Tim Peterscba30e22003-02-01 06:24:36 +0000802 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000805 PyTuple_SET_ITEM(t, 0, memo_len);
806 Py_INCREF(memo_len);
807 PyTuple_SET_ITEM(t, 1, ob);
808 Py_INCREF(ob);
809
810 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
811 goto finally;
812
813 if (!self->bin) {
814 c_str[0] = PUT;
815 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
816 len = strlen(c_str);
817 }
818 else if (Pdata_Check(self->file)) {
819 if (write_other(self, NULL, 0) < 0) return -1;
820 PDATA_APPEND(self->file, memo_len, -1);
821 res=0; /* Job well done ;) */
822 goto finally;
823 }
824 else {
825 if (p >= 256) {
826 c_str[0] = LONG_BINPUT;
827 c_str[1] = (int)(p & 0xff);
828 c_str[2] = (int)((p >> 8) & 0xff);
829 c_str[3] = (int)((p >> 16) & 0xff);
830 c_str[4] = (int)((p >> 24) & 0xff);
831 len = 5;
832 }
833 else {
834 c_str[0] = BINPUT;
835 c_str[1] = p;
836 len = 2;
837 }
838 }
839
Tim Peters0bc93f52003-02-02 18:29:33 +0000840 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 goto finally;
842
843 res = 0;
844
845 finally:
846 Py_XDECREF(py_ob_id);
847 Py_XDECREF(memo_len);
848 Py_XDECREF(t);
849
850 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000851}
852
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000853static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000854whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 PyObject *module = 0, *modules_dict = 0,
858 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000861 if (module)
862 return module;
863 if (PyErr_ExceptionMatches(PyExc_AttributeError))
864 PyErr_Clear();
865 else
866 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000867
Tim Peterscba30e22003-02-01 06:24:36 +0000868 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 i = 0;
872 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 global_name_attr = PyObject_GetAttr(module, global_name);
877 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000878 if (PyErr_ExceptionMatches(PyExc_AttributeError))
879 PyErr_Clear();
880 else
881 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 continue;
883 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 if (global_name_attr != global) {
886 Py_DECREF(global_name_attr);
887 continue;
888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 break;
893 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 /* The following implements the rule in pickle.py added in 1.5
896 that used __main__ if no module is found. I don't actually
897 like this rule. jlf
898 */
899 if (!j) {
900 j=1;
901 name=__main___str;
902 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000904 Py_INCREF(name);
905 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000906}
907
908
Guido van Rossum60456fd1997-04-09 17:36:32 +0000909static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000910fast_save_enter(Picklerobject *self, PyObject *obj)
911{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000912 /* if fast_container < 0, we're doing an error exit. */
913 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
914 PyObject *key = NULL;
915 if (self->fast_memo == NULL) {
916 self->fast_memo = PyDict_New();
917 if (self->fast_memo == NULL) {
918 self->fast_container = -1;
919 return 0;
920 }
921 }
922 key = PyLong_FromVoidPtr(obj);
923 if (key == NULL)
924 return 0;
925 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000926 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000928 "fast mode: can't pickle cyclic objects "
929 "including object type %s at %p",
Christian Heimese93237d2007-12-19 02:37:44 +0000930 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000931 self->fast_container = -1;
932 return 0;
933 }
934 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000935 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 self->fast_container = -1;
937 return 0;
938 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000939 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000940 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000942}
943
Tim Peterscba30e22003-02-01 06:24:36 +0000944int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945fast_save_leave(Picklerobject *self, PyObject *obj)
946{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000947 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
948 PyObject *key = PyLong_FromVoidPtr(obj);
949 if (key == NULL)
950 return 0;
951 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000952 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return 0;
954 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000955 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000956 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000957 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000958}
959
960static int
Tim Peterscba30e22003-02-01 06:24:36 +0000961save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000962{
963 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000964 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000965 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000967 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000968}
969
Guido van Rossum77f6a652002-04-03 22:41:51 +0000970static int
Tim Peterscba30e22003-02-01 06:24:36 +0000971save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000973 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000974 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 long l = PyInt_AS_LONG((PyIntObject *)args);
976
Tim Peters3c67d792003-02-02 17:59:11 +0000977 if (self->proto >= 2) {
978 char opcode = l ? NEWTRUE : NEWFALSE;
979 if (self->write_func(self, &opcode, 1) < 0)
980 return -1;
981 }
982 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000983 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000984 return 0;
985}
Tim Peters84e87f32001-03-17 04:50:51 +0000986
Guido van Rossum60456fd1997-04-09 17:36:32 +0000987static int
Tim Peterscba30e22003-02-01 06:24:36 +0000988save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989{
990 char c_str[32];
991 long l = PyInt_AS_LONG((PyIntObject *)args);
992 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000994 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000995#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 || l > 0x7fffffffL
997 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000998#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000999 ) {
1000 /* Text-mode pickle, or long too big to fit in the 4-byte
1001 * signed BININT format: store as a string.
1002 */
1003 c_str[0] = INT;
1004 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +00001005 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001006 return -1;
1007 }
1008 else {
1009 /* Binary pickle and l fits in a signed 4-byte int. */
1010 c_str[1] = (int)( l & 0xff);
1011 c_str[2] = (int)((l >> 8) & 0xff);
1012 c_str[3] = (int)((l >> 16) & 0xff);
1013 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1016 if (c_str[2] == 0) {
1017 c_str[0] = BININT1;
1018 len = 2;
1019 }
1020 else {
1021 c_str[0] = BININT2;
1022 len = 3;
1023 }
1024 }
1025 else {
1026 c_str[0] = BININT;
1027 len = 5;
1028 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Tim Peters0bc93f52003-02-02 18:29:33 +00001030 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 return -1;
1032 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035}
1036
1037
1038static int
Tim Peterscba30e22003-02-01 06:24:36 +00001039save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001040{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001041 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001042 int res = -1;
1043 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001045 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001046
Tim Petersee1a53c2003-02-02 02:57:53 +00001047 if (self->proto >= 2) {
1048 /* Linear-time pickling. */
1049 size_t nbits;
1050 size_t nbytes;
1051 unsigned char *pdata;
1052 char c_str[5];
1053 int i;
1054 int sign = _PyLong_Sign(args);
1055
1056 if (sign == 0) {
1057 /* It's 0 -- an empty bytestring. */
1058 c_str[0] = LONG1;
1059 c_str[1] = 0;
1060 i = self->write_func(self, c_str, 2);
1061 if (i < 0) goto finally;
1062 res = 0;
1063 goto finally;
1064 }
1065 nbits = _PyLong_NumBits(args);
1066 if (nbits == (size_t)-1 && PyErr_Occurred())
1067 goto finally;
1068 /* How many bytes do we need? There are nbits >> 3 full
1069 * bytes of data, and nbits & 7 leftover bits. If there
1070 * are any leftover bits, then we clearly need another
1071 * byte. Wnat's not so obvious is that we *probably*
1072 * need another byte even if there aren't any leftovers:
1073 * the most-significant bit of the most-significant byte
1074 * acts like a sign bit, and it's usually got a sense
1075 * opposite of the one we need. The exception is longs
1076 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1077 * its own 256's-complement, so has the right sign bit
1078 * even without the extra byte. That's a pain to check
1079 * for in advance, though, so we always grab an extra
1080 * byte at the start, and cut it back later if possible.
1081 */
1082 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001083 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001084 PyErr_SetString(PyExc_OverflowError, "long too large "
1085 "to pickle");
1086 goto finally;
1087 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001088 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
Tim Petersee1a53c2003-02-02 02:57:53 +00001089 if (repr == NULL) goto finally;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001090 pdata = (unsigned char *)PyString_AS_STRING(repr);
Tim Petersee1a53c2003-02-02 02:57:53 +00001091 i = _PyLong_AsByteArray((PyLongObject *)args,
1092 pdata, nbytes,
1093 1 /* little endian */, 1 /* signed */);
1094 if (i < 0) goto finally;
1095 /* If the long is negative, this may be a byte more than
1096 * needed. This is so iff the MSB is all redundant sign
1097 * bits.
1098 */
1099 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1100 (pdata[nbytes - 2] & 0x80) != 0)
1101 --nbytes;
1102
1103 if (nbytes < 256) {
1104 c_str[0] = LONG1;
1105 c_str[1] = (char)nbytes;
1106 size = 2;
1107 }
1108 else {
1109 c_str[0] = LONG4;
1110 size = (int)nbytes;
1111 for (i = 1; i < 5; i++) {
1112 c_str[i] = (char)(size & 0xff);
1113 size >>= 8;
1114 }
1115 size = 5;
1116 }
1117 i = self->write_func(self, c_str, size);
1118 if (i < 0) goto finally;
1119 i = self->write_func(self, (char *)pdata, (int)nbytes);
1120 if (i < 0) goto finally;
1121 res = 0;
1122 goto finally;
1123 }
1124
1125 /* proto < 2: write the repr and newline. This is quadratic-time
1126 * (in the number of digits), in both directions.
1127 */
Tim Peterscba30e22003-02-01 06:24:36 +00001128 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001131 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136
Tim Peters0bc93f52003-02-02 18:29:33 +00001137 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001138 PyString_AS_STRING((PyStringObject *)repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Tim Peters0bc93f52003-02-02 18:29:33 +00001142 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 finally:
1148 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001150}
1151
1152
1153static int
Tim Peterscba30e22003-02-01 06:24:36 +00001154save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155{
1156 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001160 str[0] = BINFLOAT;
1161 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001163 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 return -1;
1165 }
1166 else {
1167 char c_str[250];
1168 c_str[0] = FLOAT;
Eric Smith068f0652009-04-25 21:40:15 +00001169 _PyOS_double_to_string(c_str + 1, sizeof(c_str) - 2, x, 'g',
1170 17, 0, NULL);
Georg Brandlde9b6242006-04-30 11:13:56 +00001171 /* Extend the formatted string with a newline character */
1172 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Tim Peters0bc93f52003-02-02 18:29:33 +00001174 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 return -1;
1176 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001178 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179}
1180
1181
1182static int
Tim Peterscba30e22003-02-01 06:24:36 +00001183save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184{
1185 int size, len;
1186 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001188 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001191 if (!self->bin) {
1192 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peterscba30e22003-02-01 06:24:36 +00001196 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001199 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001201 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Tim Peters0bc93f52003-02-02 18:29:33 +00001203 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Tim Peters0bc93f52003-02-02 18:29:33 +00001206 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Tim Peters0bc93f52003-02-02 18:29:33 +00001209 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 Py_XDECREF(repr);
1213 }
1214 else {
1215 int i;
1216 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001217
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001218 if ((size = PyString_Size(args)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 if (size < 256) {
1222 c_str[0] = SHORT_BINSTRING;
1223 c_str[1] = size;
1224 len = 2;
1225 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001226 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001227 c_str[0] = BINSTRING;
1228 for (i = 1; i < 5; i++)
1229 c_str[i] = (int)(size >> ((i - 1) * 8));
1230 len = 5;
1231 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001232 else
1233 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Tim Peters0bc93f52003-02-02 18:29:33 +00001235 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 if (size > 128 && Pdata_Check(self->file)) {
1239 if (write_other(self, NULL, 0) < 0) return -1;
1240 PDATA_APPEND(self->file, args, -1);
1241 }
1242 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001243 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001244 PyString_AS_STRING(
1245 (PyStringObject *)args),
Tim Peters0bc93f52003-02-02 18:29:33 +00001246 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 return -1;
1248 }
1249 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 if (doput)
1252 if (put(self, args) < 0)
1253 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001255 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 err:
1258 Py_XDECREF(repr);
1259 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260}
1261
1262
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001264/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1265 backslash and newline characters to \uXXXX escapes. */
1266static PyObject *
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001267modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268{
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001269 PyObject *repr;
1270 char *p;
1271 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001272
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001273 static const char *hexdigit = "0123456789abcdef";
1274#ifdef Py_UNICODE_WIDE
1275 const Py_ssize_t expandsize = 10;
1276#else
1277 const Py_ssize_t expandsize = 6;
1278#endif
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001279
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001280 if (size > PY_SSIZE_T_MAX / expandsize)
1281 return PyErr_NoMemory();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001282
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001283 repr = PyString_FromStringAndSize(NULL, expandsize * size);
1284 if (repr == NULL)
1285 return NULL;
1286 if (size == 0)
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001287 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288
Alexandre Vassalottif852bf92008-12-27 07:08:47 +00001289 p = q = PyString_AS_STRING(repr);
1290 while (size-- > 0) {
1291 Py_UNICODE ch = *s++;
1292#ifdef Py_UNICODE_WIDE
1293 /* Map 32-bit characters to '\Uxxxxxxxx' */
1294 if (ch >= 0x10000) {
1295 *p++ = '\\';
1296 *p++ = 'U';
1297 *p++ = hexdigit[(ch >> 28) & 0xf];
1298 *p++ = hexdigit[(ch >> 24) & 0xf];
1299 *p++ = hexdigit[(ch >> 20) & 0xf];
1300 *p++ = hexdigit[(ch >> 16) & 0xf];
1301 *p++ = hexdigit[(ch >> 12) & 0xf];
1302 *p++ = hexdigit[(ch >> 8) & 0xf];
1303 *p++ = hexdigit[(ch >> 4) & 0xf];
1304 *p++ = hexdigit[ch & 15];
1305 }
1306 else
1307#else
1308 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
1309 if (ch >= 0xD800 && ch < 0xDC00) {
1310 Py_UNICODE ch2;
1311 Py_UCS4 ucs;
1312
1313 ch2 = *s++;
1314 size--;
1315 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
1316 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
1317 *p++ = '\\';
1318 *p++ = 'U';
1319 *p++ = hexdigit[(ucs >> 28) & 0xf];
1320 *p++ = hexdigit[(ucs >> 24) & 0xf];
1321 *p++ = hexdigit[(ucs >> 20) & 0xf];
1322 *p++ = hexdigit[(ucs >> 16) & 0xf];
1323 *p++ = hexdigit[(ucs >> 12) & 0xf];
1324 *p++ = hexdigit[(ucs >> 8) & 0xf];
1325 *p++ = hexdigit[(ucs >> 4) & 0xf];
1326 *p++ = hexdigit[ucs & 0xf];
1327 continue;
1328 }
1329 /* Fall through: isolated surrogates are copied as-is */
1330 s--;
1331 size++;
1332 }
1333#endif
1334 /* Map 16-bit characters to '\uxxxx' */
1335 if (ch >= 256 || ch == '\\' || ch == '\n') {
1336 *p++ = '\\';
1337 *p++ = 'u';
1338 *p++ = hexdigit[(ch >> 12) & 0xf];
1339 *p++ = hexdigit[(ch >> 8) & 0xf];
1340 *p++ = hexdigit[(ch >> 4) & 0xf];
1341 *p++ = hexdigit[ch & 15];
1342 }
1343 /* Copy everything else as-is */
1344 else
1345 *p++ = (char) ch;
1346 }
1347 *p = '\0';
1348 _PyString_Resize(&repr, p - q);
1349 return repr;
1350}
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001351
Guido van Rossum60456fd1997-04-09 17:36:32 +00001352static int
Tim Peterscba30e22003-02-01 06:24:36 +00001353save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001354{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001355 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001356 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if (!PyUnicode_Check(args))
1359 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 if (!self->bin) {
1362 char *repr_str;
1363 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 repr = modified_EncodeRawUnicodeEscape(
1366 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001367 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001370 if ((len = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001372 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Tim Peters0bc93f52003-02-02 18:29:33 +00001374 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Tim Peters0bc93f52003-02-02 18:29:33 +00001377 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001378 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001379
Tim Peters0bc93f52003-02-02 18:29:33 +00001380 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001383 Py_XDECREF(repr);
1384 }
1385 else {
1386 int i;
1387 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001388
Tim Peterscba30e22003-02-01 06:24:36 +00001389 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001391
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001392 if ((size = PyString_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001394 if (size > INT_MAX)
1395 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 c_str[0] = BINUNICODE;
1398 for (i = 1; i < 5; i++)
1399 c_str[i] = (int)(size >> ((i - 1) * 8));
1400 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001401
Tim Peters0bc93f52003-02-02 18:29:33 +00001402 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001405 if (size > 128 && Pdata_Check(self->file)) {
1406 if (write_other(self, NULL, 0) < 0)
1407 goto err;
1408 PDATA_APPEND(self->file, repr, -1);
1409 }
1410 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001411 if (self->write_func(self, PyString_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001412 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 goto err;
1414 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 Py_DECREF(repr);
1417 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if (doput)
1420 if (put(self, args) < 0)
1421 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001423 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001425 err:
1426 Py_XDECREF(repr);
1427 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001429#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001430
Tim Peters1d63c9f2003-02-02 20:29:39 +00001431/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1432static int
Tim Peters67920142003-02-05 03:46:17 +00001433store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001434{
1435 int i;
1436 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001437
Tim Peters1d63c9f2003-02-02 20:29:39 +00001438 assert(PyTuple_Size(t) == len);
1439
1440 for (i = 0; i < len; i++) {
1441 PyObject *element = PyTuple_GET_ITEM(t, i);
1442
1443 if (element == NULL)
1444 goto finally;
1445 if (save(self, element, 0) < 0)
1446 goto finally;
1447 }
1448 res = 0;
1449
1450 finally:
1451 return res;
1452}
1453
1454/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1455 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001456 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 * (a tuple can be reached from itself), and that requires some subtle
1458 * magic so that it works in all cases. IOW, this is a long routine.
1459 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001460static int
Tim Peterscba30e22003-02-01 06:24:36 +00001461save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001463 PyObject *py_tuple_id = NULL;
1464 int len, i;
1465 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001468 static char pop = POP;
1469 static char pop_mark = POP_MARK;
1470 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if ((len = PyTuple_Size(args)) < 0)
1473 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001474
Tim Peters1d63c9f2003-02-02 20:29:39 +00001475 if (len == 0) {
1476 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001477
Tim Peters1d63c9f2003-02-02 20:29:39 +00001478 if (self->proto) {
1479 c_str[0] = EMPTY_TUPLE;
1480 len = 1;
1481 }
1482 else {
1483 c_str[0] = MARK;
1484 c_str[1] = TUPLE;
1485 len = 2;
1486 }
1487 if (self->write_func(self, c_str, len) >= 0)
1488 res = 0;
1489 /* Don't memoize an empty tuple. */
1490 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Tim Peters1d63c9f2003-02-02 20:29:39 +00001493 /* A non-empty tuple. */
1494
1495 /* id(tuple) isn't in the memo now. If it shows up there after
1496 * saving the tuple elements, the tuple must be recursive, in
1497 * which case we'll pop everything we put on the stack, and fetch
1498 * its value from the memo.
1499 */
1500 py_tuple_id = PyLong_FromVoidPtr(args);
1501 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503
Tim Peters1d63c9f2003-02-02 20:29:39 +00001504 if (len <= 3 && self->proto >= 2) {
1505 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001506 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001507 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001509 /* pop the len elements */
1510 for (i = 0; i < len; ++i)
1511 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001514 if (get(self, py_tuple_id) < 0)
1515 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 res = 0;
1517 goto finally;
1518 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001519 /* Not recursive. */
1520 if (self->write_func(self, len2opcode + len, 1) < 0)
1521 goto finally;
1522 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001524
Tim Peters1d63c9f2003-02-02 20:29:39 +00001525 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1526 * Generate MARK elt1 elt2 ... TUPLE
1527 */
1528 if (self->write_func(self, &MARKv, 1) < 0)
1529 goto finally;
1530
Tim Peters67920142003-02-05 03:46:17 +00001531 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001532 goto finally;
1533
1534 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1535 /* pop the stack stuff we pushed */
1536 if (self->bin) {
1537 if (self->write_func(self, &pop_mark, 1) < 0)
1538 goto finally;
1539 }
1540 else {
1541 /* Note that we pop one more than len, to remove
1542 * the MARK too.
1543 */
1544 for (i = 0; i <= len; i++)
1545 if (self->write_func(self, &pop, 1) < 0)
1546 goto finally;
1547 }
1548 /* fetch from memo */
1549 if (get(self, py_tuple_id) >= 0)
1550 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001551 goto finally;
1552 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001553
Tim Peters1d63c9f2003-02-02 20:29:39 +00001554 /* Not recursive. */
1555 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001557
Tim Peters1d63c9f2003-02-02 20:29:39 +00001558 memoize:
1559 if (put(self, args) >= 0)
1560 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001562 finally:
1563 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001565}
1566
Tim Peters1092d642003-02-11 21:06:20 +00001567/* iter is an iterator giving items, and we batch up chunks of
1568 * MARK item item ... item APPENDS
1569 * opcode sequences. Calling code should have arranged to first create an
1570 * empty list, or list-like object, for the APPENDS to operate on.
1571 * Returns 0 on success, <0 on error.
1572 */
1573static int
1574batch_list(Picklerobject *self, PyObject *iter)
1575{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001576 PyObject *obj = NULL;
1577 PyObject *firstitem = NULL;
Tim Peters1092d642003-02-11 21:06:20 +00001578 int i, n;
1579
1580 static char append = APPEND;
1581 static char appends = APPENDS;
1582
1583 assert(iter != NULL);
1584
1585 if (self->proto == 0) {
1586 /* APPENDS isn't available; do one at a time. */
1587 for (;;) {
1588 obj = PyIter_Next(iter);
1589 if (obj == NULL) {
1590 if (PyErr_Occurred())
1591 return -1;
1592 break;
1593 }
1594 i = save(self, obj, 0);
1595 Py_DECREF(obj);
1596 if (i < 0)
1597 return -1;
1598 if (self->write_func(self, &append, 1) < 0)
1599 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001600 }
1601 return 0;
1602 }
1603
1604 /* proto > 0: write in batches of BATCHSIZE. */
1605 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001606 /* Get first item */
1607 firstitem = PyIter_Next(iter);
1608 if (firstitem == NULL) {
1609 if (PyErr_Occurred())
1610 goto BatchFailed;
1611
1612 /* nothing more to add */
1613 break;
1614 }
1615
1616 /* Try to get a second item */
1617 obj = PyIter_Next(iter);
1618 if (obj == NULL) {
1619 if (PyErr_Occurred())
1620 goto BatchFailed;
1621
1622 /* Only one item to write */
1623 if (save(self, firstitem, 0) < 0)
1624 goto BatchFailed;
1625 if (self->write_func(self, &append, 1) < 0)
1626 goto BatchFailed;
1627 Py_CLEAR(firstitem);
1628 break;
1629 }
1630
1631 /* More than one item to write */
1632
1633 /* Pump out MARK, items, APPENDS. */
1634 if (self->write_func(self, &MARKv, 1) < 0)
1635 goto BatchFailed;
1636
1637 if (save(self, firstitem, 0) < 0)
1638 goto BatchFailed;
1639 Py_CLEAR(firstitem);
1640 n = 1;
1641
1642 /* Fetch and save up to BATCHSIZE items */
1643 while (obj) {
1644 if (save(self, obj, 0) < 0)
1645 goto BatchFailed;
1646 Py_CLEAR(obj);
1647 n += 1;
1648
1649 if (n == BATCHSIZE)
1650 break;
1651
Tim Peters1092d642003-02-11 21:06:20 +00001652 obj = PyIter_Next(iter);
1653 if (obj == NULL) {
1654 if (PyErr_Occurred())
1655 goto BatchFailed;
1656 break;
1657 }
Tim Peters1092d642003-02-11 21:06:20 +00001658 }
1659
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001660 if (self->write_func(self, &appends, 1) < 0)
1661 goto BatchFailed;
Tim Peters1092d642003-02-11 21:06:20 +00001662
Tim Peters90975f12003-02-12 05:28:58 +00001663 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001664 return 0;
1665
1666BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001667 Py_XDECREF(firstitem);
1668 Py_XDECREF(obj);
Tim Peters1092d642003-02-11 21:06:20 +00001669 return -1;
1670}
1671
Guido van Rossum60456fd1997-04-09 17:36:32 +00001672static int
Tim Peterscba30e22003-02-01 06:24:36 +00001673save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674{
Tim Peters1092d642003-02-11 21:06:20 +00001675 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001677 int len;
1678 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 if (self->fast && !fast_save_enter(self, args))
1681 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001682
Tim Peters1092d642003-02-11 21:06:20 +00001683 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001684 if (self->bin) {
1685 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001686 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 }
1688 else {
1689 s[0] = MARK;
1690 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001691 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Tim Peters1092d642003-02-11 21:06:20 +00001694 if (self->write_func(self, s, len) < 0)
1695 goto finally;
1696
1697 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if ((len = PyList_Size(args)) < 0)
1699 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001700
Tim Peters1092d642003-02-11 21:06:20 +00001701 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001702 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001703 if (put(self, args) >= 0)
1704 res = 0;
1705 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 }
Tim Peters90975f12003-02-12 05:28:58 +00001707 if (put2(self, args) < 0)
1708 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Tim Peters1092d642003-02-11 21:06:20 +00001710 /* Materialize the list elements. */
1711 iter = PyObject_GetIter(args);
1712 if (iter == NULL)
1713 goto finally;
Facundo Batista763d3092008-06-30 01:10:55 +00001714
1715 if (Py_EnterRecursiveCall(" while pickling an object") == 0)
1716 {
1717 res = batch_list(self, iter);
1718 Py_LeaveRecursiveCall();
1719 }
Tim Peters1092d642003-02-11 21:06:20 +00001720 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001722 finally:
1723 if (self->fast && !fast_save_leave(self, args))
1724 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001727}
1728
1729
Tim Peters42f08ac2003-02-11 22:43:24 +00001730/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1731 * MARK key value ... key value SETITEMS
1732 * opcode sequences. Calling code should have arranged to first create an
1733 * empty dict, or dict-like object, for the SETITEMS to operate on.
1734 * Returns 0 on success, <0 on error.
1735 *
1736 * This is very much like batch_list(). The difference between saving
1737 * elements directly, and picking apart two-tuples, is so long-winded at
1738 * the C level, though, that attempts to combine these routines were too
1739 * ugly to bear.
1740 */
1741static int
1742batch_dict(Picklerobject *self, PyObject *iter)
1743{
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001744 PyObject *p = NULL;
1745 PyObject *firstitem = NULL;
Tim Peters42f08ac2003-02-11 22:43:24 +00001746 int i, n;
1747
1748 static char setitem = SETITEM;
1749 static char setitems = SETITEMS;
1750
1751 assert(iter != NULL);
1752
1753 if (self->proto == 0) {
1754 /* SETITEMS isn't available; do one at a time. */
1755 for (;;) {
1756 p = PyIter_Next(iter);
1757 if (p == NULL) {
1758 if (PyErr_Occurred())
1759 return -1;
1760 break;
1761 }
1762 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1763 PyErr_SetString(PyExc_TypeError, "dict items "
1764 "iterator must return 2-tuples");
1765 return -1;
1766 }
1767 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1768 if (i >= 0)
1769 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1770 Py_DECREF(p);
1771 if (i < 0)
1772 return -1;
1773 if (self->write_func(self, &setitem, 1) < 0)
1774 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001775 }
1776 return 0;
1777 }
1778
1779 /* proto > 0: write in batches of BATCHSIZE. */
1780 do {
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001781 /* Get first item */
1782 firstitem = PyIter_Next(iter);
1783 if (firstitem == NULL) {
1784 if (PyErr_Occurred())
1785 goto BatchFailed;
1786
1787 /* nothing more to add */
1788 break;
1789 }
1790 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
1791 PyErr_SetString(PyExc_TypeError, "dict items "
1792 "iterator must return 2-tuples");
1793 goto BatchFailed;
1794 }
1795
1796 /* Try to get a second item */
1797 p = PyIter_Next(iter);
1798 if (p == NULL) {
1799 if (PyErr_Occurred())
1800 goto BatchFailed;
1801
1802 /* Only one item to write */
1803 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1804 goto BatchFailed;
1805 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1806 goto BatchFailed;
1807 if (self->write_func(self, &setitem, 1) < 0)
1808 goto BatchFailed;
1809 Py_CLEAR(firstitem);
1810 break;
1811 }
1812
1813 /* More than one item to write */
1814
1815 /* Pump out MARK, items, SETITEMS. */
1816 if (self->write_func(self, &MARKv, 1) < 0)
1817 goto BatchFailed;
1818
1819 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
1820 goto BatchFailed;
1821 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
1822 goto BatchFailed;
1823 Py_CLEAR(firstitem);
1824 n = 1;
1825
1826 /* Fetch and save up to BATCHSIZE items */
1827 while (p) {
1828 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1829 PyErr_SetString(PyExc_TypeError, "dict items "
1830 "iterator must return 2-tuples");
1831 goto BatchFailed;
1832 }
1833 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1834 goto BatchFailed;
1835 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1836 goto BatchFailed;
1837 Py_CLEAR(p);
1838 n += 1;
1839
1840 if (n == BATCHSIZE)
1841 break;
1842
Tim Peters42f08ac2003-02-11 22:43:24 +00001843 p = PyIter_Next(iter);
1844 if (p == NULL) {
1845 if (PyErr_Occurred())
1846 goto BatchFailed;
1847 break;
1848 }
Tim Peters42f08ac2003-02-11 22:43:24 +00001849 }
1850
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001851 if (self->write_func(self, &setitems, 1) < 0)
1852 goto BatchFailed;
Tim Peters42f08ac2003-02-11 22:43:24 +00001853
Tim Peters90975f12003-02-12 05:28:58 +00001854 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001855 return 0;
1856
1857BatchFailed:
Amaury Forgeot d'Arc24cb3822008-09-11 20:56:13 +00001858 Py_XDECREF(firstitem);
1859 Py_XDECREF(p);
Tim Peters42f08ac2003-02-11 22:43:24 +00001860 return -1;
1861}
1862
Collin Winter179bf212009-05-25 04:34:39 +00001863/* This is a variant of batch_dict() above that specializes for dicts, with no
1864 * support for dict subclasses. Like batch_dict(), we batch up chunks of
1865 * MARK key value ... key value SETITEMS
1866 * opcode sequences. Calling code should have arranged to first create an
1867 * empty dict, or dict-like object, for the SETITEMS to operate on.
1868 * Returns 0 on success, -1 on error.
1869 *
1870 * Note that this currently doesn't work for protocol 0.
1871 */
1872static int
1873batch_dict_exact(Picklerobject *self, PyObject *obj)
1874{
1875 PyObject *key = NULL, *value = NULL;
1876 int i;
1877 Py_ssize_t dict_size, ppos = 0;
1878
1879 static char setitem = SETITEM;
1880 static char setitems = SETITEMS;
1881
1882 assert(obj != NULL);
1883 assert(self->proto > 0);
1884
1885 dict_size = PyDict_Size(obj);
1886
1887 /* Special-case len(d) == 1 to save space. */
1888 if (dict_size == 1) {
1889 PyDict_Next(obj, &ppos, &key, &value);
1890 if (save(self, key, 0) < 0)
1891 return -1;
1892 if (save(self, value, 0) < 0)
1893 return -1;
1894 if (self->write_func(self, &setitem, 1) < 0)
1895 return -1;
1896 return 0;
1897 }
1898
1899 /* Write in batches of BATCHSIZE. */
1900 do {
1901 i = 0;
1902 if (self->write_func(self, &MARKv, 1) < 0)
1903 return -1;
1904 while (PyDict_Next(obj, &ppos, &key, &value)) {
1905 if (save(self, key, 0) < 0)
1906 return -1;
1907 if (save(self, value, 0) < 0)
1908 return -1;
1909 if (++i == BATCHSIZE)
1910 break;
1911 }
1912 if (self->write_func(self, &setitems, 1) < 0)
1913 return -1;
1914 if (PyDict_Size(obj) != dict_size) {
1915 PyErr_Format(
1916 PyExc_RuntimeError,
1917 "dictionary changed size during iteration");
1918 return -1;
1919 }
1920
1921 } while (i == BATCHSIZE);
1922 return 0;
1923}
1924
Guido van Rossum60456fd1997-04-09 17:36:32 +00001925static int
Tim Peterscba30e22003-02-01 06:24:36 +00001926save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927{
Tim Peters42f08ac2003-02-11 22:43:24 +00001928 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001930 int len;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 if (self->fast && !fast_save_enter(self, args))
1933 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001934
Tim Peters42f08ac2003-02-11 22:43:24 +00001935 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if (self->bin) {
1937 s[0] = EMPTY_DICT;
1938 len = 1;
1939 }
1940 else {
1941 s[0] = MARK;
1942 s[1] = DICT;
1943 len = 2;
1944 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Tim Peters0bc93f52003-02-02 18:29:33 +00001946 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001947 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001948
Tim Peters42f08ac2003-02-11 22:43:24 +00001949 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if ((len = PyDict_Size(args)) < 0)
1951 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001954 if (put(self, args) >= 0)
1955 res = 0;
1956 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 }
Tim Peters90975f12003-02-12 05:28:58 +00001958 if (put2(self, args) < 0)
1959 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001960
Tim Peters42f08ac2003-02-11 22:43:24 +00001961 /* Materialize the dict items. */
Collin Winter179bf212009-05-25 04:34:39 +00001962 if (PyDict_CheckExact(args) && self->proto > 0) {
1963 /* We can take certain shortcuts if we know this is a dict and
1964 not a dict subclass. */
1965 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1966 res = batch_dict_exact(self, args);
1967 Py_LeaveRecursiveCall();
1968 }
1969 } else {
1970 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");
1971 if (iter == NULL)
1972 goto finally;
1973 if (Py_EnterRecursiveCall(" while pickling an object") == 0) {
1974 res = batch_dict(self, iter);
1975 Py_LeaveRecursiveCall();
1976 }
1977 Py_DECREF(iter);
Facundo Batista763d3092008-06-30 01:10:55 +00001978 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 finally:
1981 if (self->fast && !fast_save_leave(self, args))
1982 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001985}
1986
1987
Tim Peters84e87f32001-03-17 04:50:51 +00001988static int
Tim Peterscba30e22003-02-01 06:24:36 +00001989save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990{
1991 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1992 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1993 char *module_str, *name_str;
1994 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 if (self->fast && !fast_save_enter(self, args))
1999 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002000
Tim Peters0bc93f52003-02-02 18:29:33 +00002001 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Tim Peterscba30e22003-02-01 06:24:36 +00002004 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007 if (self->bin) {
2008 if (save(self, class, 0) < 0)
2009 goto finally;
2010 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
2013 PyObject *element = 0;
2014 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00002017 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if ((len = PyObject_Size(class_args)) < 0)
2021 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00002024 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002025 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (save(self, element, 0) < 0) {
2028 Py_DECREF(element);
2029 goto finally;
2030 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 Py_DECREF(element);
2033 }
2034 }
2035 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002036 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2037 PyErr_Clear();
2038 else
2039 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 if (!self->bin) {
2043 if (!( name = ((PyClassObject *)class)->cl_name )) {
2044 PyErr_SetString(PicklingError, "class has no name");
2045 goto finally;
2046 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Tim Peterscba30e22003-02-01 06:24:36 +00002048 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002050
Tim Peters84e87f32001-03-17 04:50:51 +00002051
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002052 if ((module_size = PyString_Size(module)) < 0 ||
2053 (name_size = PyString_Size(name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002054 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002055
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002056 module_str = PyString_AS_STRING((PyStringObject *)module);
2057 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002058
Tim Peters0bc93f52003-02-02 18:29:33 +00002059 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Tim Peters0bc93f52003-02-02 18:29:33 +00002062 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002064
Tim Peters0bc93f52003-02-02 18:29:33 +00002065 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002066 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002067
Tim Peters0bc93f52003-02-02 18:29:33 +00002068 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002070
Tim Peters0bc93f52003-02-02 18:29:33 +00002071 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 goto finally;
2073 }
Tim Peters0bc93f52003-02-02 18:29:33 +00002074 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002075 goto finally;
2076 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002078 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
2079 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002080 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002081 goto finally;
2082 }
2083 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002084 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2085 PyErr_Clear();
2086 else
2087 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002090 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2091 PyErr_Clear();
2092 else
2093 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 res = 0;
2095 goto finally;
2096 }
2097 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002099 if (!PyDict_Check(state)) {
2100 if (put2(self, args) < 0)
2101 goto finally;
2102 }
2103 else {
2104 if (put(self, args) < 0)
2105 goto finally;
2106 }
Tim Peters84e87f32001-03-17 04:50:51 +00002107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 if (save(self, state, 0) < 0)
2109 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
Tim Peters0bc93f52003-02-02 18:29:33 +00002111 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 finally:
2117 if (self->fast && !fast_save_leave(self, args))
2118 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002120 Py_XDECREF(module);
2121 Py_XDECREF(class);
2122 Py_XDECREF(state);
2123 Py_XDECREF(getinitargs_func);
2124 Py_XDECREF(getstate_func);
2125 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002127 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128}
2129
2130
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131static int
Tim Peterscba30e22003-02-01 06:24:36 +00002132save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00002134 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 char *name_str, *module_str;
2136 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (name) {
2141 global_name = name;
2142 Py_INCREF(global_name);
2143 }
2144 else {
Tim Peterscba30e22003-02-01 06:24:36 +00002145 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 goto finally;
2147 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002148
Tim Peterscba30e22003-02-01 06:24:36 +00002149 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002150 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002152 if ((module_size = PyString_Size(module)) < 0 ||
2153 (name_size = PyString_Size(global_name)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002155
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002156 module_str = PyString_AS_STRING((PyStringObject *)module);
2157 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002158
Guido van Rossum75bfd052002-12-24 18:10:07 +00002159 /* XXX This can be doing a relative import. Clearly it shouldn't,
2160 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 mod = PyImport_ImportModule(module_str);
2162 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002164 "Can't pickle %s: import of module %s "
2165 "failed",
2166 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167 goto finally;
2168 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002169 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 if (klass == NULL) {
2171 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00002172 "Can't pickle %s: attribute lookup %s.%s "
2173 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 "OSS", args, module, global_name);
2175 goto finally;
2176 }
2177 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002178 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002180 "Can't pickle %s: it's not the same object "
2181 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 "OSS", args, module, global_name);
2183 goto finally;
2184 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002185 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002186
Tim Peters731098b2003-02-04 20:56:09 +00002187 if (self->proto >= 2) {
2188 /* See whether this is in the extension registry, and if
2189 * so generate an EXT opcode.
2190 */
2191 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002192 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002193 char c_str[5];
2194 int n;
2195
2196 PyTuple_SET_ITEM(two_tuple, 0, module);
2197 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2198 py_code = PyDict_GetItem(extension_registry, two_tuple);
2199 if (py_code == NULL)
2200 goto gen_global; /* not registered */
2201
2202 /* Verify py_code has the right type and value. */
2203 if (!PyInt_Check(py_code)) {
2204 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002205 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002206 "OO", args, py_code);
2207 goto finally;
2208 }
2209 code = PyInt_AS_LONG(py_code);
2210 if (code <= 0 || code > 0x7fffffffL) {
2211 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2212 "extension code %ld is out of range",
2213 "Ol", args, code);
2214 goto finally;
2215 }
2216
2217 /* Generate an EXT opcode. */
2218 if (code <= 0xff) {
2219 c_str[0] = EXT1;
2220 c_str[1] = (char)code;
2221 n = 2;
2222 }
2223 else if (code <= 0xffff) {
2224 c_str[0] = EXT2;
2225 c_str[1] = (char)(code & 0xff);
2226 c_str[2] = (char)((code >> 8) & 0xff);
2227 n = 3;
2228 }
2229 else {
2230 c_str[0] = EXT4;
2231 c_str[1] = (char)(code & 0xff);
2232 c_str[2] = (char)((code >> 8) & 0xff);
2233 c_str[3] = (char)((code >> 16) & 0xff);
2234 c_str[4] = (char)((code >> 24) & 0xff);
2235 n = 5;
2236 }
2237
2238 if (self->write_func(self, c_str, n) >= 0)
2239 res = 0;
2240 goto finally; /* and don't memoize */
2241 }
2242
2243 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002244 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002246
Tim Peters0bc93f52003-02-02 18:29:33 +00002247 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002249
Tim Peters0bc93f52003-02-02 18:29:33 +00002250 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002252
Tim Peters0bc93f52003-02-02 18:29:33 +00002253 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002255
Tim Peters0bc93f52003-02-02 18:29:33 +00002256 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002259 if (put(self, args) < 0)
2260 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002262 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002264 finally:
2265 Py_XDECREF(module);
2266 Py_XDECREF(global_name);
2267 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002270}
2271
Guido van Rossum60456fd1997-04-09 17:36:32 +00002272static int
Tim Peterscba30e22003-02-01 06:24:36 +00002273save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274{
2275 PyObject *pid = 0;
2276 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 Py_INCREF(args);
2281 ARG_TUP(self, args);
2282 if (self->arg) {
2283 pid = PyObject_Call(f, self->arg, NULL);
2284 FREE_ARG_TUP(self);
2285 }
2286 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002288 if (pid != Py_None) {
2289 if (!self->bin) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002290 if (!PyString_Check(pid)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002291 PyErr_SetString(PicklingError,
2292 "persistent id must be string");
2293 goto finally;
2294 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002295
Tim Peters0bc93f52003-02-02 18:29:33 +00002296 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002297 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002298
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002299 if ((size = PyString_Size(pid)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002301
Tim Peters0bc93f52003-02-02 18:29:33 +00002302 if (self->write_func(self,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002303 PyString_AS_STRING(
2304 (PyStringObject *)pid),
Tim Peters0bc93f52003-02-02 18:29:33 +00002305 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Tim Peters0bc93f52003-02-02 18:29:33 +00002308 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002309 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 res = 1;
2312 goto finally;
2313 }
2314 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002315 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002316 res = -1;
2317 else
2318 res = 1;
2319 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002321 goto finally;
2322 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002324 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002326 finally:
2327 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002331
Tim Peters71fcda52003-02-14 23:05:28 +00002332/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2333 * appropriate __reduce__ method for ob.
2334 */
Tim Peters84e87f32001-03-17 04:50:51 +00002335static int
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002336save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337{
Tim Peters71fcda52003-02-14 23:05:28 +00002338 PyObject *callable;
2339 PyObject *argtup;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002340 PyObject *state = NULL;
2341 PyObject *listitems = Py_None;
2342 PyObject *dictitems = Py_None;
2343 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002344
Tim Peters71fcda52003-02-14 23:05:28 +00002345 int use_newobj = self->proto >= 2;
2346
2347 static char reduce = REDUCE;
2348 static char build = BUILD;
2349 static char newobj = NEWOBJ;
2350
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002351 size = PyTuple_Size(args);
2352 if (size < 2 || size > 5) {
2353 cPickle_ErrFormat(PicklingError, "tuple returned by "
2354 "%s must contain 2 through 5 elements",
2355 "O", fn);
2356 return -1;
2357 }
2358
Tim Peters71fcda52003-02-14 23:05:28 +00002359 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2360 &callable,
2361 &argtup,
2362 &state,
2363 &listitems,
2364 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002365 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002366
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002367 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002368 cPickle_ErrFormat(PicklingError, "Second element of "
2369 "tuple returned by %s must be a tuple",
2370 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002371 return -1;
2372 }
2373
Tim Peters71fcda52003-02-14 23:05:28 +00002374 if (state == Py_None)
2375 state = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002376
Tim Peters71fcda52003-02-14 23:05:28 +00002377 if (listitems == Py_None)
2378 listitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002379 else if (!PyIter_Check(listitems)) {
2380 cPickle_ErrFormat(PicklingError, "Fourth element of "
2381 "tuple returned by %s must be an iterator, not %s",
2382 "Os", fn, Py_TYPE(listitems)->tp_name);
2383 return -1;
2384 }
2385
Tim Peters71fcda52003-02-14 23:05:28 +00002386 if (dictitems == Py_None)
2387 dictitems = NULL;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002388 else if (!PyIter_Check(dictitems)) {
2389 cPickle_ErrFormat(PicklingError, "Fifth element of "
2390 "tuple returned by %s must be an iterator, not %s",
2391 "Os", fn, Py_TYPE(dictitems)->tp_name);
2392 return -1;
2393 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002394
Tim Peters71fcda52003-02-14 23:05:28 +00002395 /* Protocol 2 special case: if callable's name is __newobj__, use
2396 * NEWOBJ. This consumes a lot of code.
2397 */
2398 if (use_newobj) {
2399 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002400
Tim Peters71fcda52003-02-14 23:05:28 +00002401 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002402 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2403 PyErr_Clear();
2404 else
2405 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002406 use_newobj = 0;
2407 }
2408 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002409 use_newobj = PyString_Check(temp) &&
2410 strcmp(PyString_AS_STRING(temp),
Tim Peters71fcda52003-02-14 23:05:28 +00002411 "__newobj__") == 0;
2412 Py_DECREF(temp);
2413 }
2414 }
2415 if (use_newobj) {
2416 PyObject *cls;
2417 PyObject *newargtup;
2418 int n, i;
2419
2420 /* Sanity checks. */
2421 n = PyTuple_Size(argtup);
2422 if (n < 1) {
2423 PyErr_SetString(PicklingError, "__newobj__ arglist "
2424 "is empty");
2425 return -1;
2426 }
2427
2428 cls = PyTuple_GET_ITEM(argtup, 0);
2429 if (! PyObject_HasAttrString(cls, "__new__")) {
2430 PyErr_SetString(PicklingError, "args[0] from "
2431 "__newobj__ args has no __new__");
2432 return -1;
2433 }
2434
2435 /* XXX How could ob be NULL? */
2436 if (ob != NULL) {
2437 PyObject *ob_dot_class;
2438
2439 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002440 if (ob_dot_class == NULL) {
2441 if (PyErr_ExceptionMatches(
2442 PyExc_AttributeError))
2443 PyErr_Clear();
2444 else
2445 return -1;
2446 }
Tim Peters71fcda52003-02-14 23:05:28 +00002447 i = ob_dot_class != cls; /* true iff a problem */
2448 Py_XDECREF(ob_dot_class);
2449 if (i) {
2450 PyErr_SetString(PicklingError, "args[0] from "
2451 "__newobj__ args has the wrong class");
2452 return -1;
2453 }
2454 }
2455
2456 /* Save the class and its __new__ arguments. */
2457 if (save(self, cls, 0) < 0)
2458 return -1;
2459
2460 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2461 if (newargtup == NULL)
2462 return -1;
2463 for (i = 1; i < n; ++i) {
2464 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2465 Py_INCREF(temp);
2466 PyTuple_SET_ITEM(newargtup, i-1, temp);
2467 }
Neal Norwitz5a29dd32007-10-05 05:01:38 +00002468 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002469 Py_DECREF(newargtup);
2470 if (i < 0)
2471 return -1;
2472
2473 /* Add NEWOBJ opcode. */
2474 if (self->write_func(self, &newobj, 1) < 0)
2475 return -1;
2476 }
2477 else {
2478 /* Not using NEWOBJ. */
2479 if (save(self, callable, 0) < 0 ||
2480 save(self, argtup, 0) < 0 ||
2481 self->write_func(self, &reduce, 1) < 0)
2482 return -1;
2483 }
2484
2485 /* Memoize. */
2486 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (ob != NULL) {
2488 if (state && !PyDict_Check(state)) {
2489 if (put2(self, ob) < 0)
2490 return -1;
2491 }
Tim Peters71fcda52003-02-14 23:05:28 +00002492 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002493 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 }
Tim Peters84e87f32001-03-17 04:50:51 +00002495
Guido van Rossum60456fd1997-04-09 17:36:32 +00002496
Tim Peters71fcda52003-02-14 23:05:28 +00002497 if (listitems && batch_list(self, listitems) < 0)
2498 return -1;
2499
2500 if (dictitems && batch_dict(self, dictitems) < 0)
2501 return -1;
2502
2503 if (state) {
2504 if (save(self, state, 0) < 0 ||
2505 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 return -1;
2507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002510}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002511
Guido van Rossum60456fd1997-04-09 17:36:32 +00002512static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002513save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002514{
2515 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002516 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002517 int res = -1;
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002518 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519
Facundo Batista763d3092008-06-30 01:10:55 +00002520 if (Py_EnterRecursiveCall(" while pickling an object"))
2521 return -1;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 if (!pers_save && self->pers_func) {
2524 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2525 res = tmp;
2526 goto finally;
2527 }
2528 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 if (args == Py_None) {
2531 res = save_none(self, args);
2532 goto finally;
2533 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002534
Christian Heimese93237d2007-12-19 02:37:44 +00002535 type = Py_TYPE(args);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002538 case 'b':
2539 if (args == Py_False || args == Py_True) {
2540 res = save_bool(self, args);
2541 goto finally;
2542 }
2543 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002544 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545 if (type == &PyInt_Type) {
2546 res = save_int(self, args);
2547 goto finally;
2548 }
2549 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002550
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552 if (type == &PyLong_Type) {
2553 res = save_long(self, args);
2554 goto finally;
2555 }
2556 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002557
Guido van Rossum60456fd1997-04-09 17:36:32 +00002558 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002559 if (type == &PyFloat_Type) {
2560 res = save_float(self, args);
2561 goto finally;
2562 }
2563 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002564
Guido van Rossum60456fd1997-04-09 17:36:32 +00002565 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002566 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2567 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568 goto finally;
2569 }
2570 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002571
Guido van Rossum60456fd1997-04-09 17:36:32 +00002572 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002573 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002574 res = save_string(self, args, 0);
2575 goto finally;
2576 }
Facundo Batista14618862008-06-22 15:27:10 +00002577 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002578
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002579#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002580 case 'u':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002581 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 res = save_unicode(self, args, 0);
2583 goto finally;
2584 }
Facundo Batista14618862008-06-22 15:27:10 +00002585 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002586#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002588
Christian Heimese93237d2007-12-19 02:37:44 +00002589 if (Py_REFCNT(args) > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002590 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 if (PyDict_GetItem(self->memo, py_ob_id)) {
2594 if (get(self, py_ob_id) < 0)
2595 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002597 res = 0;
2598 goto finally;
2599 }
2600 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002603 case 's':
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002604 if (type == &PyString_Type) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605 res = save_string(self, args, 1);
2606 goto finally;
2607 }
2608 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002609
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002610#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002611 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612 if (type == &PyUnicode_Type) {
2613 res = save_unicode(self, args, 1);
2614 goto finally;
2615 }
2616 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002617#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002618
Guido van Rossum60456fd1997-04-09 17:36:32 +00002619 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620 if (type == &PyTuple_Type) {
2621 res = save_tuple(self, args);
2622 goto finally;
2623 }
2624 if (type == &PyType_Type) {
2625 res = save_global(self, args, NULL);
2626 goto finally;
2627 }
2628 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002629
Guido van Rossum60456fd1997-04-09 17:36:32 +00002630 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 if (type == &PyList_Type) {
2632 res = save_list(self, args);
2633 goto finally;
2634 }
2635 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002636
2637 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002638 if (type == &PyDict_Type) {
2639 res = save_dict(self, args);
2640 goto finally;
2641 }
2642 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002643
2644 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 if (type == &PyInstance_Type) {
2646 res = save_inst(self, args);
2647 goto finally;
2648 }
2649 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002650
2651 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 if (type == &PyClass_Type) {
2653 res = save_global(self, args, NULL);
2654 goto finally;
2655 }
2656 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002657
2658 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 if (type == &PyFunction_Type) {
2660 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002661 if (res && PyErr_ExceptionMatches(PickleError)) {
2662 /* fall back to reduce */
2663 PyErr_Clear();
2664 break;
2665 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 goto finally;
2667 }
2668 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002669
2670 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 if (type == &PyCFunction_Type) {
2672 res = save_global(self, args, NULL);
2673 goto finally;
2674 }
2675 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 if (!pers_save && self->inst_pers_func) {
2678 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2679 res = tmp;
2680 goto finally;
2681 }
2682 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002683
Jeremy Hylton39c61162002-07-16 19:47:43 +00002684 if (PyType_IsSubtype(type, &PyType_Type)) {
2685 res = save_global(self, args, NULL);
2686 goto finally;
2687 }
2688
Guido van Rossumb289b872003-02-19 01:45:13 +00002689 /* Get a reduction callable, and call it. This may come from
Georg Brandldffbf5f2008-05-20 07:49:57 +00002690 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
Guido van Rossumb289b872003-02-19 01:45:13 +00002691 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002692 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002693 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2694 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002696 Py_INCREF(args);
2697 ARG_TUP(self, args);
2698 if (self->arg) {
2699 t = PyObject_Call(__reduce__, self->arg, NULL);
2700 FREE_ARG_TUP(self);
2701 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 }
2703 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002704 /* Check for a __reduce_ex__ method. */
2705 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2706 if (__reduce__ != NULL) {
2707 t = PyInt_FromLong(self->proto);
2708 if (t != NULL) {
2709 ARG_TUP(self, t);
2710 t = NULL;
2711 if (self->arg) {
2712 t = PyObject_Call(__reduce__,
2713 self->arg, NULL);
2714 FREE_ARG_TUP(self);
2715 }
2716 }
2717 }
2718 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002719 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2720 PyErr_Clear();
2721 else
2722 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002723 /* Check for a __reduce__ method. */
2724 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2725 if (__reduce__ != NULL) {
2726 t = PyObject_Call(__reduce__,
2727 empty_tuple, NULL);
2728 }
2729 else {
2730 PyErr_SetObject(UnpickleableError, args);
2731 goto finally;
2732 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002735
Tim Peters71fcda52003-02-14 23:05:28 +00002736 if (t == NULL)
2737 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002738
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002739 if (PyString_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002740 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741 goto finally;
2742 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002743
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002744 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002745 cPickle_ErrFormat(PicklingError, "Value returned by "
2746 "%s must be string or tuple",
2747 "O", __reduce__);
2748 goto finally;
2749 }
2750
Amaury Forgeot d'Arc69a9c5b2008-10-30 21:18:34 +00002751 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 finally:
Facundo Batista763d3092008-06-30 01:10:55 +00002754 Py_LeaveRecursiveCall();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 Py_XDECREF(py_ob_id);
2756 Py_XDECREF(__reduce__);
2757 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002760}
2761
2762
2763static int
Tim Peterscba30e22003-02-01 06:24:36 +00002764dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765{
2766 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767
Tim Peters4190fb82003-02-02 16:09:05 +00002768 if (self->proto >= 2) {
2769 char bytes[2];
2770
2771 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002772 assert(self->proto >= 0 && self->proto < 256);
2773 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002774 if (self->write_func(self, bytes, 2) < 0)
2775 return -1;
2776 }
2777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 if (save(self, args, 0) < 0)
2779 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Tim Peters4190fb82003-02-02 16:09:05 +00002781 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Tim Peters4190fb82003-02-02 16:09:05 +00002784 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002785 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788}
2789
2790static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002791Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002792{
Tim Peterscba30e22003-02-01 06:24:36 +00002793 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 PyDict_Clear(self->memo);
2795 Py_INCREF(Py_None);
2796 return Py_None;
2797}
2798
2799static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002800Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801{
2802 int l, i, rsize, ssize, clear=1, lm;
2803 long ik;
2804 PyObject *k, *r;
2805 char *s, *p, *have_get;
2806 Pdata *data;
2807
2808 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002809 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 return NULL;
2811
2812 /* Check to make sure we are based on a list */
2813 if (! Pdata_Check(self->file)) {
2814 PyErr_SetString(PicklingError,
2815 "Attempt to getvalue() a non-list-based pickler");
2816 return NULL;
2817 }
2818
2819 /* flush write buffer */
2820 if (write_other(self, NULL, 0) < 0) return NULL;
2821
2822 data=(Pdata*)self->file;
2823 l=data->length;
2824
2825 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002826 lm = PyDict_Size(self->memo);
2827 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002829 have_get = malloc(lm);
2830 if (have_get == NULL) return PyErr_NoMemory();
2831 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832
2833 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002834 for (rsize = 0, i = l; --i >= 0; ) {
2835 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002837 if (PyString_Check(k))
2838 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839
2840 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002841 ik = PyInt_AS_LONG((PyIntObject*)k);
2842 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 PyErr_SetString(PicklingError,
2844 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002845 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 }
Tim Petersac5687a2003-02-02 18:08:34 +00002847 if (have_get[ik]) /* with matching get */
2848 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 }
2850
2851 else if (! (PyTuple_Check(k) &&
2852 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002853 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 ) {
2855 PyErr_SetString(PicklingError,
2856 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002857 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002858 }
2859
2860 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002861 ik = PyInt_AS_LONG((PyIntObject *)k);
2862 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 PyErr_SetString(PicklingError,
2864 "Invalid get data");
2865 return NULL;
2866 }
Tim Petersac5687a2003-02-02 18:08:34 +00002867 have_get[ik] = 1;
2868 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 }
2871
2872 /* Now generate the result */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002873 r = PyString_FromStringAndSize(NULL, rsize);
Tim Petersac5687a2003-02-02 18:08:34 +00002874 if (r == NULL) goto err;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002875 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002876
Tim Petersac5687a2003-02-02 18:08:34 +00002877 for (i = 0; i < l; i++) {
2878 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002880 if (PyString_Check(k)) {
2881 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 if (ssize) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002883 p=PyString_AS_STRING((PyStringObject *)k);
Tim Petersac5687a2003-02-02 18:08:34 +00002884 while (--ssize >= 0)
2885 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 }
2887 }
2888
2889 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002890 ik = PyInt_AS_LONG((PyIntObject *)
2891 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 if (ik < 256) {
2893 *s++ = BINGET;
2894 *s++ = (int)(ik & 0xff);
2895 }
2896 else {
2897 *s++ = LONG_BINGET;
2898 *s++ = (int)(ik & 0xff);
2899 *s++ = (int)((ik >> 8) & 0xff);
2900 *s++ = (int)((ik >> 16) & 0xff);
2901 *s++ = (int)((ik >> 24) & 0xff);
2902 }
2903 }
2904
2905 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002906 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907
2908 if (have_get[ik]) { /* with matching get */
2909 if (ik < 256) {
2910 *s++ = BINPUT;
2911 *s++ = (int)(ik & 0xff);
2912 }
2913 else {
2914 *s++ = LONG_BINPUT;
2915 *s++ = (int)(ik & 0xff);
2916 *s++ = (int)((ik >> 8) & 0xff);
2917 *s++ = (int)((ik >> 16) & 0xff);
2918 *s++ = (int)((ik >> 24) & 0xff);
2919 }
2920 }
2921 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002922 }
2923
2924 if (clear) {
2925 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002926 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002927 }
2928
2929 free(have_get);
2930 return r;
2931 err:
2932 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002933 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002934}
2935
2936static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002937Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938{
2939 PyObject *ob;
2940 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002941
Tim Peterscba30e22003-02-01 06:24:36 +00002942 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if (dump(self, ob) < 0)
2946 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002948 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 /* XXX Why does dump() return self? */
2951 Py_INCREF(self);
2952 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002953}
2954
2955
Tim Peterscba30e22003-02-01 06:24:36 +00002956static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957{
Neal Norwitzb0493252002-03-31 14:44:22 +00002958 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002959 PyDoc_STR("dump(object) -- "
2960 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002961 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002962 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002963 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002964 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002966};
2967
2968
2969static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002970newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971{
2972 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002973
Tim Peters5bd2a792003-02-01 16:45:06 +00002974 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002975 proto = HIGHEST_PROTOCOL;
2976 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002977 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2978 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002979 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002981 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002982
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002983 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002984 if (self == NULL)
2985 return NULL;
2986 self->proto = proto;
2987 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 self->fp = NULL;
2989 self->write = NULL;
2990 self->memo = NULL;
2991 self->arg = NULL;
2992 self->pers_func = NULL;
2993 self->inst_pers_func = NULL;
2994 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 self->fast = 0;
2996 self->fast_container = 0;
2997 self->fast_memo = NULL;
2998 self->buf_size = 0;
2999 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003000
Tim Peters5bd2a792003-02-01 16:45:06 +00003001 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 if (file)
3003 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00003004 else {
3005 file = Pdata_New();
3006 if (file == NULL)
3007 goto err;
3008 }
3009 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00003010
Tim Peterscba30e22003-02-01 06:24:36 +00003011 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 if (PyFile_Check(file)) {
3015 self->fp = PyFile_AsFile(file);
3016 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00003017 PyErr_SetString(PyExc_ValueError,
3018 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 goto err;
3020 }
3021 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00003022 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 else if (PycStringIO_OutputCheck(file)) {
3024 self->write_func = write_cStringIO;
3025 }
3026 else if (file == Py_None) {
3027 self->write_func = write_none;
3028 }
3029 else {
3030 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032 if (! Pdata_Check(file)) {
3033 self->write = PyObject_GetAttr(file, write_str);
3034 if (!self->write) {
3035 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003036 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 "argument must have 'write' "
3038 "attribute");
3039 goto err;
3040 }
3041 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003042
Tim Peters5bd2a792003-02-01 16:45:06 +00003043 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
3044 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 PyErr_NoMemory();
3046 goto err;
3047 }
3048 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050 if (PyEval_GetRestricted()) {
3051 /* Restricted execution, get private tables */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00003052 PyObject *m = PyImport_Import(copyreg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003053
Tim Peters5b7da392003-02-04 00:21:07 +00003054 if (m == NULL)
3055 goto err;
3056 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00003058 if (self->dispatch_table == NULL)
3059 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003060 }
3061 else {
Tim Peters5b7da392003-02-04 00:21:07 +00003062 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 Py_INCREF(dispatch_table);
3064 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003065 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00003070 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003072}
3073
3074
3075static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00003076get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077{
Martin v. Löwis15e62742006-02-27 16:46:16 +00003078 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00003080 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003081
Tim Peters92c8bb32003-02-13 23:00:26 +00003082 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00003083 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00003084 * accepts Pickler() and Pickler(integer) too. The meaning then
3085 * is clear as mud, undocumented, and not supported by pickle.py.
3086 * I'm told Zope uses this, but I haven't traced into this code
3087 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00003088 */
3089 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00003091 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00003092 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
3093 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 return NULL;
3095 }
Tim Peters5bd2a792003-02-01 16:45:06 +00003096 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003097}
3098
3099
3100static void
Tim Peterscba30e22003-02-01 06:24:36 +00003101Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003103 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 Py_XDECREF(self->write);
3105 Py_XDECREF(self->memo);
3106 Py_XDECREF(self->fast_memo);
3107 Py_XDECREF(self->arg);
3108 Py_XDECREF(self->file);
3109 Py_XDECREF(self->pers_func);
3110 Py_XDECREF(self->inst_pers_func);
3111 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00003112 PyMem_Free(self->write_buf);
Christian Heimese93237d2007-12-19 02:37:44 +00003113 Py_TYPE(self)->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003114}
3115
3116static int
3117Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
3118{
Thomas Woutersc6e55062006-04-15 21:47:09 +00003119 Py_VISIT(self->write);
3120 Py_VISIT(self->memo);
3121 Py_VISIT(self->fast_memo);
3122 Py_VISIT(self->arg);
3123 Py_VISIT(self->file);
3124 Py_VISIT(self->pers_func);
3125 Py_VISIT(self->inst_pers_func);
3126 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003127 return 0;
3128}
3129
3130static int
3131Pickler_clear(Picklerobject *self)
3132{
Thomas Woutersedf17d82006-04-15 17:28:34 +00003133 Py_CLEAR(self->write);
3134 Py_CLEAR(self->memo);
3135 Py_CLEAR(self->fast_memo);
3136 Py_CLEAR(self->arg);
3137 Py_CLEAR(self->file);
3138 Py_CLEAR(self->pers_func);
3139 Py_CLEAR(self->inst_pers_func);
3140 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003141 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003142}
3143
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003144static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003145Pickler_get_pers_func(Picklerobject *p)
3146{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 if (p->pers_func == NULL)
3148 PyErr_SetString(PyExc_AttributeError, "persistent_id");
3149 else
3150 Py_INCREF(p->pers_func);
3151 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003152}
3153
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003154static int
3155Pickler_set_pers_func(Picklerobject *p, PyObject *v)
3156{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003157 if (v == NULL) {
3158 PyErr_SetString(PyExc_TypeError,
3159 "attribute deletion is not supported");
3160 return -1;
3161 }
3162 Py_XDECREF(p->pers_func);
3163 Py_INCREF(v);
3164 p->pers_func = v;
3165 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003166}
3167
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003168static int
3169Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
3170{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 if (v == NULL) {
3172 PyErr_SetString(PyExc_TypeError,
3173 "attribute deletion is not supported");
3174 return -1;
3175 }
3176 Py_XDECREF(p->inst_pers_func);
3177 Py_INCREF(v);
3178 p->inst_pers_func = v;
3179 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003180}
3181
3182static PyObject *
3183Pickler_get_memo(Picklerobject *p)
3184{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185 if (p->memo == NULL)
3186 PyErr_SetString(PyExc_AttributeError, "memo");
3187 else
3188 Py_INCREF(p->memo);
3189 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003190}
3191
3192static int
3193Pickler_set_memo(Picklerobject *p, PyObject *v)
3194{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 if (v == NULL) {
3196 PyErr_SetString(PyExc_TypeError,
3197 "attribute deletion is not supported");
3198 return -1;
3199 }
3200 if (!PyDict_Check(v)) {
3201 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3202 return -1;
3203 }
3204 Py_XDECREF(p->memo);
3205 Py_INCREF(v);
3206 p->memo = v;
3207 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003208}
3209
3210static PyObject *
3211Pickler_get_error(Picklerobject *p)
3212{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 /* why is this an attribute on the Pickler? */
3214 Py_INCREF(PicklingError);
3215 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003216}
3217
3218static PyMemberDef Pickler_members[] = {
3219 {"binary", T_INT, offsetof(Picklerobject, bin)},
3220 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003221 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003222};
3223
3224static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003225 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003226 (setter)Pickler_set_pers_func},
3227 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3228 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003229 {"PicklingError", (getter)Pickler_get_error, NULL},
3230 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003231};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003233PyDoc_STRVAR(Picklertype__doc__,
3234"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003235
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003236static PyTypeObject Picklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003237 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003238 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003239 sizeof(Picklerobject), /*tp_basicsize*/
3240 0,
3241 (destructor)Pickler_dealloc, /* tp_dealloc */
3242 0, /* tp_print */
3243 0, /* tp_getattr */
3244 0, /* tp_setattr */
3245 0, /* tp_compare */
3246 0, /* tp_repr */
3247 0, /* tp_as_number */
3248 0, /* tp_as_sequence */
3249 0, /* tp_as_mapping */
3250 0, /* tp_hash */
3251 0, /* tp_call */
3252 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003253 PyObject_GenericGetAttr, /* tp_getattro */
3254 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003255 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003256 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003257 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003258 (traverseproc)Pickler_traverse, /* tp_traverse */
3259 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003260 0, /* tp_richcompare */
3261 0, /* tp_weaklistoffset */
3262 0, /* tp_iter */
3263 0, /* tp_iternext */
3264 Pickler_methods, /* tp_methods */
3265 Pickler_members, /* tp_members */
3266 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003267};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003268
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003269static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003270find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271{
3272 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 if (fc) {
3275 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003276 PyErr_SetString(UnpicklingError, "Global and instance "
3277 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 return NULL;
3279 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003280 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3281 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 module = PySys_GetObject("modules");
3285 if (module == NULL)
3286 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 module = PyDict_GetItem(module, py_module_name);
3289 if (module == NULL) {
3290 module = PyImport_Import(py_module_name);
3291 if (!module)
3292 return NULL;
3293 global = PyObject_GetAttr(module, py_global_name);
3294 Py_DECREF(module);
3295 }
3296 else
3297 global = PyObject_GetAttr(module, py_global_name);
3298 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003299}
3300
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003301static int
Tim Peterscba30e22003-02-01 06:24:36 +00003302marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303{
3304 if (self->num_marks < 1) {
3305 PyErr_SetString(UnpicklingError, "could not find MARK");
3306 return -1;
3307 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310}
3311
Tim Peters84e87f32001-03-17 04:50:51 +00003312
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313static int
Tim Peterscba30e22003-02-01 06:24:36 +00003314load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315{
3316 PDATA_APPEND(self->stack, Py_None, -1);
3317 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318}
3319
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003320static int
Tim Peterscba30e22003-02-01 06:24:36 +00003321bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322{
3323 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3324 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003325}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326
3327static int
Tim Peterscba30e22003-02-01 06:24:36 +00003328load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329{
3330 PyObject *py_int = 0;
3331 char *endptr, *s;
3332 int len, res = -1;
3333 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Tim Peters0bc93f52003-02-02 18:29:33 +00003335 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 if (len < 2) return bad_readline();
3337 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 errno = 0;
3340 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3343 /* Hm, maybe we've got something long. Let's try reading
3344 it as a Python long object. */
3345 errno = 0;
3346 py_int = PyLong_FromString(s, NULL, 0);
3347 if (py_int == NULL) {
3348 PyErr_SetString(PyExc_ValueError,
3349 "could not convert string to int");
3350 goto finally;
3351 }
3352 }
3353 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003354 if (len == 3 && (l == 0 || l == 1)) {
3355 if (!( py_int = PyBool_FromLong(l))) goto finally;
3356 }
3357 else {
3358 if (!( py_int = PyInt_FromLong(l))) goto finally;
3359 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 free(s);
3363 PDATA_PUSH(self->stack, py_int, -1);
3364 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 finally:
3367 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370}
3371
Tim Peters3c67d792003-02-02 17:59:11 +00003372static int
3373load_bool(Unpicklerobject *self, PyObject *boolean)
3374{
3375 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003376 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003377 return 0;
3378}
3379
Tim Petersee1a53c2003-02-02 02:57:53 +00003380/* s contains x bytes of a little-endian integer. Return its value as a
3381 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3382 * int, but when x is 4 it's a signed one. This is an historical source
3383 * of x-platform bugs.
3384 */
Tim Peters84e87f32001-03-17 04:50:51 +00003385static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003386calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387{
3388 unsigned char c;
3389 int i;
3390 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392 for (i = 0, l = 0L; i < x; i++) {
3393 c = (unsigned char)s[i];
3394 l |= (long)c << (i * 8);
3395 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003396#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3398 * is signed, so on a box with longs bigger than 4 bytes we need
3399 * to extend a BININT's sign bit to the full width.
3400 */
3401 if (x == 4 && l & (1L << 31))
3402 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003403#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405}
3406
3407
3408static int
Tim Peterscba30e22003-02-01 06:24:36 +00003409load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410{
3411 PyObject *py_int = 0;
3412 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Tim Peterscba30e22003-02-01 06:24:36 +00003416 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003419 PDATA_PUSH(self->stack, py_int, -1);
3420 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003421}
3422
3423
3424static int
Tim Peterscba30e22003-02-01 06:24:36 +00003425load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426{
3427 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Tim Peters0bc93f52003-02-02 18:29:33 +00003429 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003430 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433}
3434
3435
3436static int
Tim Peterscba30e22003-02-01 06:24:36 +00003437load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438{
3439 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Tim Peters0bc93f52003-02-02 18:29:33 +00003441 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003445}
3446
3447
3448static int
Tim Peterscba30e22003-02-01 06:24:36 +00003449load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450{
3451 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Tim Peters0bc93f52003-02-02 18:29:33 +00003453 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457}
Tim Peters84e87f32001-03-17 04:50:51 +00003458
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459static int
Tim Peterscba30e22003-02-01 06:24:36 +00003460load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003461{
3462 PyObject *l = 0;
3463 char *end, *s;
3464 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
Tim Peters0bc93f52003-02-02 18:29:33 +00003466 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003467 if (len < 2) return bad_readline();
3468 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003469
Tim Peterscba30e22003-02-01 06:24:36 +00003470 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003473 free(s);
3474 PDATA_PUSH(self->stack, l, -1);
3475 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 finally:
3478 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003480 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
3482
Tim Petersee1a53c2003-02-02 02:57:53 +00003483/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3484 * data following.
3485 */
3486static int
3487load_counted_long(Unpicklerobject *self, int size)
3488{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003489 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003490 char *nbytes;
3491 unsigned char *pdata;
3492 PyObject *along;
3493
3494 assert(size == 1 || size == 4);
3495 i = self->read_func(self, &nbytes, size);
3496 if (i < 0) return -1;
3497
3498 size = calc_binint(nbytes, size);
3499 if (size < 0) {
3500 /* Corrupt or hostile pickle -- we never write one like
3501 * this.
3502 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003503 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003504 "byte count");
3505 return -1;
3506 }
3507
3508 if (size == 0)
3509 along = PyLong_FromLong(0L);
3510 else {
3511 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003512 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003513 if (i < 0) return -1;
3514 along = _PyLong_FromByteArray(pdata, (size_t)size,
3515 1 /* little endian */, 1 /* signed */);
3516 }
3517 if (along == NULL)
3518 return -1;
3519 PDATA_PUSH(self->stack, along, -1);
3520 return 0;
3521}
Tim Peters84e87f32001-03-17 04:50:51 +00003522
Guido van Rossum60456fd1997-04-09 17:36:32 +00003523static int
Tim Peterscba30e22003-02-01 06:24:36 +00003524load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525{
3526 PyObject *py_float = 0;
3527 char *endptr, *s;
3528 int len, res = -1;
3529 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Tim Peters0bc93f52003-02-02 18:29:33 +00003531 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 if (len < 2) return bad_readline();
3533 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003536 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537
Mark Dickinsona3ecd2c2009-01-24 16:40:29 +00003538 if ((errno == ERANGE && !(fabs(d) <= 1.0)) ||
3539 (endptr[0] != '\n') || (endptr[1] != '\0')) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 PyErr_SetString(PyExc_ValueError,
3541 "could not convert string to float");
3542 goto finally;
3543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Tim Peterscba30e22003-02-01 06:24:36 +00003545 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548 free(s);
3549 PDATA_PUSH(self->stack, py_float, -1);
3550 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552 finally:
3553 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003556}
3557
Guido van Rossum60456fd1997-04-09 17:36:32 +00003558static int
Tim Peterscba30e22003-02-01 06:24:36 +00003559load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560{
Tim Peters9905b942003-03-20 20:53:32 +00003561 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003562 double x;
3563 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564
Tim Peters0bc93f52003-02-02 18:29:33 +00003565 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Tim Peters9905b942003-03-20 20:53:32 +00003568 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3569 if (x == -1.0 && PyErr_Occurred())
3570 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571
Tim Peters9905b942003-03-20 20:53:32 +00003572 py_float = PyFloat_FromDouble(x);
3573 if (py_float == NULL)
3574 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003576 PDATA_PUSH(self->stack, py_float, -1);
3577 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003579
3580static int
Tim Peterscba30e22003-02-01 06:24:36 +00003581load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582{
3583 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003584 int len, res = -1;
3585 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586
Tim Peters0bc93f52003-02-02 18:29:33 +00003587 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 if (len < 2) return bad_readline();
3589 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003591
3592 /* Strip outermost quotes */
3593 while (s[len-1] <= ' ')
3594 len--;
3595 if(s[0]=='"' && s[len-1]=='"'){
3596 s[len-1] = '\0';
3597 p = s + 1 ;
3598 len -= 2;
3599 } else if(s[0]=='\'' && s[len-1]=='\''){
3600 s[len-1] = '\0';
3601 p = s + 1 ;
3602 len -= 2;
3603 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 goto insecure;
3605 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003606
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003607 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003608 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003609 if (str) {
3610 PDATA_PUSH(self->stack, str, -1);
3611 res = 0;
3612 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 insecure:
3616 free(s);
3617 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3618 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003619}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003620
3621
3622static int
Tim Peterscba30e22003-02-01 06:24:36 +00003623load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003624{
3625 PyObject *py_string = 0;
3626 long l;
3627 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628
Tim Peters0bc93f52003-02-02 18:29:33 +00003629 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003631 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003632 if (l < 0) {
3633 /* Corrupt or hostile pickle -- we never write one like
3634 * this.
3635 */
3636 PyErr_SetString(UnpicklingError,
3637 "BINSTRING pickle has negative byte count");
3638 return -1;
3639 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003640
Tim Peters0bc93f52003-02-02 18:29:33 +00003641 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003642 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003643
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003644 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003647 PDATA_PUSH(self->stack, py_string, -1);
3648 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003649}
3650
3651
3652static int
Tim Peterscba30e22003-02-01 06:24:36 +00003653load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003654{
3655 PyObject *py_string = 0;
3656 unsigned char l;
3657 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003658
Tim Peters0bc93f52003-02-02 18:29:33 +00003659 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Tim Peters0bc93f52003-02-02 18:29:33 +00003664 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003665
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003666 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003668 PDATA_PUSH(self->stack, py_string, -1);
3669 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003670}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
3672
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003673#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *str = 0;
3678 int len, res = -1;
3679 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003680
Tim Peters0bc93f52003-02-02 18:29:33 +00003681 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003683
Tim Peterscba30e22003-02-01 06:24:36 +00003684 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 PDATA_PUSH(self->stack, str, -1);
3688 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003690 finally:
3691 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003692}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003693#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003694
3695
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003696#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003697static int
Tim Peterscba30e22003-02-01 06:24:36 +00003698load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699{
3700 PyObject *unicode;
3701 long l;
3702 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003703
Tim Peters0bc93f52003-02-02 18:29:33 +00003704 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 l = calc_binint(s, 4);
Gregory P. Smith9d534572008-06-11 07:41:16 +00003707 if (l < 0) {
3708 /* Corrupt or hostile pickle -- we never write one like
3709 * this.
3710 */
3711 PyErr_SetString(UnpicklingError,
3712 "BINUNICODE pickle has negative byte count");
3713 return -1;
3714 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003715
Tim Peters0bc93f52003-02-02 18:29:33 +00003716 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003718
Tim Peterscba30e22003-02-01 06:24:36 +00003719 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003720 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722 PDATA_PUSH(self->stack, unicode, -1);
3723 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003724}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003725#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003726
3727
3728static int
Tim Peterscba30e22003-02-01 06:24:36 +00003729load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003730{
3731 PyObject *tup;
3732 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734 if ((i = marker(self)) < 0) return -1;
3735 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3736 PDATA_PUSH(self->stack, tup, -1);
3737 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003738}
3739
3740static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003741load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003743 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003744
Tim Peters1d63c9f2003-02-02 20:29:39 +00003745 if (tup == NULL)
3746 return -1;
3747
3748 while (--len >= 0) {
3749 PyObject *element;
3750
3751 PDATA_POP(self->stack, element);
3752 if (element == NULL)
3753 return -1;
3754 PyTuple_SET_ITEM(tup, len, element);
3755 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 PDATA_PUSH(self->stack, tup, -1);
3757 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758}
3759
3760static int
Tim Peterscba30e22003-02-01 06:24:36 +00003761load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762{
3763 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 if (!( list=PyList_New(0))) return -1;
3766 PDATA_PUSH(self->stack, list, -1);
3767 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768}
3769
3770static int
Tim Peterscba30e22003-02-01 06:24:36 +00003771load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772{
3773 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 if (!( dict=PyDict_New())) return -1;
3776 PDATA_PUSH(self->stack, dict, -1);
3777 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778}
3779
3780
3781static int
Tim Peterscba30e22003-02-01 06:24:36 +00003782load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783{
3784 PyObject *list = 0;
3785 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if ((i = marker(self)) < 0) return -1;
3788 if (!( list=Pdata_popList(self->stack, i))) return -1;
3789 PDATA_PUSH(self->stack, list, -1);
3790 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791}
3792
3793static int
Tim Peterscba30e22003-02-01 06:24:36 +00003794load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795{
3796 PyObject *dict, *key, *value;
3797 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 if ((i = marker(self)) < 0) return -1;
3800 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 for (k = i+1; k < j; k += 2) {
3805 key =self->stack->data[k-1];
3806 value=self->stack->data[k ];
3807 if (PyDict_SetItem(dict, key, value) < 0) {
3808 Py_DECREF(dict);
3809 return -1;
3810 }
3811 }
3812 Pdata_clear(self->stack, i);
3813 PDATA_PUSH(self->stack, dict, -1);
3814 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815}
3816
3817static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003818Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003820 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003822 if (PyClass_Check(cls)) {
3823 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 if ((l=PyObject_Size(args)) < 0) goto err;
3826 if (!( l )) {
3827 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003828
Tim Peterscba30e22003-02-01 06:24:36 +00003829 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003830 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003832 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003833 so bypass usual construction */
3834 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003836 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003837 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 goto err;
3839 return inst;
3840 }
3841 Py_DECREF(__getinitargs__);
3842 }
Tim Peters84e87f32001-03-17 04:50:51 +00003843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003844 if ((r=PyInstance_New(cls, args, NULL))) return r;
3845 else goto err;
3846 }
Tim Peters84e87f32001-03-17 04:50:51 +00003847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003848 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 err:
3851 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003852 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003855 tmp_value = v;
3856 /* NULL occurs when there was a KeyboardInterrupt */
3857 if (tmp_value == NULL)
3858 tmp_value = Py_None;
3859 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 Py_XDECREF(v);
3861 v=r;
3862 }
3863 PyErr_Restore(tp,v,tb);
3864 }
3865 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866}
Tim Peters84e87f32001-03-17 04:50:51 +00003867
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868
3869static int
Tim Peterscba30e22003-02-01 06:24:36 +00003870load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003871{
3872 PyObject *class, *tup, *obj=0;
3873 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003875 if ((i = marker(self)) < 0) return -1;
3876 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3877 PDATA_POP(self->stack, class);
3878 if (class) {
3879 obj = Instance_New(class, tup);
3880 Py_DECREF(class);
3881 }
3882 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 if (! obj) return -1;
3885 PDATA_PUSH(self->stack, obj, -1);
3886 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003887}
3888
3889
3890static int
Tim Peterscba30e22003-02-01 06:24:36 +00003891load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003892{
3893 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3894 int i, len;
3895 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003898
Tim Peters0bc93f52003-02-02 18:29:33 +00003899 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003901 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003902 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003903
Tim Peters0bc93f52003-02-02 18:29:33 +00003904 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003905 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003906 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003907 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003908 self->find_class);
3909 Py_DECREF(class_name);
3910 }
3911 }
3912 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 if ((tup=Pdata_popTuple(self->stack, i))) {
3917 obj = Instance_New(class, tup);
3918 Py_DECREF(tup);
3919 }
3920 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 PDATA_PUSH(self->stack, obj, -1);
3925 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926}
3927
Tim Peterseab7db32003-02-13 18:24:14 +00003928static int
3929load_newobj(Unpicklerobject *self)
3930{
3931 PyObject *args = NULL;
3932 PyObject *clsraw = NULL;
3933 PyTypeObject *cls; /* clsraw cast to its true type */
3934 PyObject *obj;
3935
3936 /* Stack is ... cls argtuple, and we want to call
3937 * cls.__new__(cls, *argtuple).
3938 */
3939 PDATA_POP(self->stack, args);
3940 if (args == NULL) goto Fail;
3941 if (! PyTuple_Check(args)) {
3942 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3943 "tuple.");
3944 goto Fail;
3945 }
3946
3947 PDATA_POP(self->stack, clsraw);
3948 cls = (PyTypeObject *)clsraw;
3949 if (cls == NULL) goto Fail;
3950 if (! PyType_Check(cls)) {
3951 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3952 "isn't a type object");
3953 goto Fail;
3954 }
3955 if (cls->tp_new == NULL) {
3956 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3957 "has NULL tp_new");
3958 goto Fail;
3959 }
3960
3961 /* Call __new__. */
3962 obj = cls->tp_new(cls, args, NULL);
3963 if (obj == NULL) goto Fail;
3964
3965 Py_DECREF(args);
3966 Py_DECREF(clsraw);
3967 PDATA_PUSH(self->stack, obj, -1);
3968 return 0;
3969
3970 Fail:
3971 Py_XDECREF(args);
3972 Py_XDECREF(clsraw);
3973 return -1;
3974}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
3976static int
Tim Peterscba30e22003-02-01 06:24:36 +00003977load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003978{
3979 PyObject *class = 0, *module_name = 0, *class_name = 0;
3980 int len;
3981 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003982
Tim Peters0bc93f52003-02-02 18:29:33 +00003983 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 if (len < 2) return bad_readline();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003985 module_name = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987
Tim Peters0bc93f52003-02-02 18:29:33 +00003988 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003989 if (len < 2) {
3990 Py_DECREF(module_name);
3991 return bad_readline();
3992 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003993 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003994 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 self->find_class);
3996 Py_DECREF(class_name);
3997 }
3998 }
3999 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 if (! class) return -1;
4002 PDATA_PUSH(self->stack, class, -1);
4003 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004004}
4005
4006
4007static int
Tim Peterscba30e22003-02-01 06:24:36 +00004008load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009{
4010 PyObject *pid = 0;
4011 int len;
4012 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004015 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016 if (len < 2) return bad_readline();
4017
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004018 pid = PyString_FromStringAndSize(s, len - 1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 if (!pid) return -1;
4020
4021 if (PyList_Check(self->pers_func)) {
4022 if (PyList_Append(self->pers_func, pid) < 0) {
4023 Py_DECREF(pid);
4024 return -1;
4025 }
4026 }
4027 else {
4028 ARG_TUP(self, pid);
4029 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004030 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004031 NULL);
4032 FREE_ARG_TUP(self);
4033 }
4034 }
4035
4036 if (! pid) return -1;
4037
4038 PDATA_PUSH(self->stack, pid, -1);
4039 return 0;
4040 }
4041 else {
4042 PyErr_SetString(UnpicklingError,
4043 "A load persistent id instruction was encountered,\n"
4044 "but no persistent_load function was specified.");
4045 return -1;
4046 }
4047}
4048
4049static int
Tim Peterscba30e22003-02-01 06:24:36 +00004050load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004051{
4052 PyObject *pid = 0;
4053
4054 if (self->pers_func) {
4055 PDATA_POP(self->stack, pid);
4056 if (! pid) return -1;
4057
4058 if (PyList_Check(self->pers_func)) {
4059 if (PyList_Append(self->pers_func, pid) < 0) {
4060 Py_DECREF(pid);
4061 return -1;
4062 }
4063 }
4064 else {
4065 ARG_TUP(self, pid);
4066 if (self->arg) {
4067 pid = PyObject_Call(self->pers_func, self->arg,
4068 NULL);
4069 FREE_ARG_TUP(self);
4070 }
4071 if (! pid) return -1;
4072 }
4073
4074 PDATA_PUSH(self->stack, pid, -1);
4075 return 0;
4076 }
4077 else {
4078 PyErr_SetString(UnpicklingError,
4079 "A load persistent id instruction was encountered,\n"
4080 "but no persistent_load function was specified.");
4081 return -1;
4082 }
4083}
4084
4085
4086static int
Tim Peterscba30e22003-02-01 06:24:36 +00004087load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088{
4089 int len;
4090
4091 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
4092
4093 /* Note that we split the (pickle.py) stack into two stacks,
4094 an object stack and a mark stack. We have to be clever and
4095 pop the right one. We do this by looking at the top of the
4096 mark stack.
4097 */
4098
4099 if ((self->num_marks > 0) &&
4100 (self->marks[self->num_marks - 1] == len))
4101 self->num_marks--;
4102 else {
4103 len--;
4104 Py_DECREF(self->stack->data[len]);
4105 self->stack->length=len;
4106 }
4107
4108 return 0;
4109}
4110
4111
4112static int
Tim Peterscba30e22003-02-01 06:24:36 +00004113load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114{
4115 int i;
4116
4117 if ((i = marker(self)) < 0)
4118 return -1;
4119
4120 Pdata_clear(self->stack, i);
4121
4122 return 0;
4123}
4124
4125
4126static int
Tim Peterscba30e22003-02-01 06:24:36 +00004127load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128{
4129 PyObject *last;
4130 int len;
4131
4132 if ((len = self->stack->length) <= 0) return stackUnderflow();
4133 last=self->stack->data[len-1];
4134 Py_INCREF(last);
4135 PDATA_PUSH(self->stack, last, -1);
4136 return 0;
4137}
4138
4139
4140static int
Tim Peterscba30e22003-02-01 06:24:36 +00004141load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142{
4143 PyObject *py_str = 0, *value = 0;
4144 int len;
4145 char *s;
4146 int rc;
4147
Tim Peters0bc93f52003-02-02 18:29:33 +00004148 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00004149 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00004150
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004151 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 value = PyDict_GetItem(self->memo, py_str);
4154 if (! value) {
4155 PyErr_SetObject(BadPickleGet, py_str);
4156 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004157 }
4158 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 PDATA_APPEND(self->stack, value, -1);
4160 rc = 0;
4161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 Py_DECREF(py_str);
4164 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165}
4166
4167
4168static int
Tim Peterscba30e22003-02-01 06:24:36 +00004169load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170{
4171 PyObject *py_key = 0, *value = 0;
4172 unsigned char key;
4173 char *s;
4174 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004175
Tim Peters0bc93f52003-02-02 18:29:33 +00004176 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 key = (unsigned char)s[0];
4179 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00004180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004181 value = PyDict_GetItem(self->memo, py_key);
4182 if (! value) {
4183 PyErr_SetObject(BadPickleGet, py_key);
4184 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004185 }
4186 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 PDATA_APPEND(self->stack, value, -1);
4188 rc = 0;
4189 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 Py_DECREF(py_key);
4192 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193}
4194
4195
4196static int
Tim Peterscba30e22003-02-01 06:24:36 +00004197load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198{
4199 PyObject *py_key = 0, *value = 0;
4200 unsigned char c;
4201 char *s;
4202 long key;
4203 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004204
Tim Peters0bc93f52003-02-02 18:29:33 +00004205 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 c = (unsigned char)s[0];
4208 key = (long)c;
4209 c = (unsigned char)s[1];
4210 key |= (long)c << 8;
4211 c = (unsigned char)s[2];
4212 key |= (long)c << 16;
4213 c = (unsigned char)s[3];
4214 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4217
4218 value = PyDict_GetItem(self->memo, py_key);
4219 if (! value) {
4220 PyErr_SetObject(BadPickleGet, py_key);
4221 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004222 }
4223 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 PDATA_APPEND(self->stack, value, -1);
4225 rc = 0;
4226 }
4227
4228 Py_DECREF(py_key);
4229 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230}
4231
Tim Peters2d629652003-02-04 05:06:17 +00004232/* Push an object from the extension registry (EXT[124]). nbytes is
4233 * the number of bytes following the opcode, holding the index (code) value.
4234 */
4235static int
4236load_extension(Unpicklerobject *self, int nbytes)
4237{
4238 char *codebytes; /* the nbytes bytes after the opcode */
4239 long code; /* calc_binint returns long */
4240 PyObject *py_code; /* code as a Python int */
4241 PyObject *obj; /* the object to push */
4242 PyObject *pair; /* (module_name, class_name) */
4243 PyObject *module_name, *class_name;
4244
4245 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4246 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4247 code = calc_binint(codebytes, nbytes);
4248 if (code <= 0) { /* note that 0 is forbidden */
4249 /* Corrupt or hostile pickle. */
4250 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4251 return -1;
4252 }
4253
4254 /* Look for the code in the cache. */
4255 py_code = PyInt_FromLong(code);
4256 if (py_code == NULL) return -1;
4257 obj = PyDict_GetItem(extension_cache, py_code);
4258 if (obj != NULL) {
4259 /* Bingo. */
4260 Py_DECREF(py_code);
4261 PDATA_APPEND(self->stack, obj, -1);
4262 return 0;
4263 }
4264
4265 /* Look up the (module_name, class_name) pair. */
4266 pair = PyDict_GetItem(inverted_registry, py_code);
4267 if (pair == NULL) {
4268 Py_DECREF(py_code);
4269 PyErr_Format(PyExc_ValueError, "unregistered extension "
4270 "code %ld", code);
4271 return -1;
4272 }
4273 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004274 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004275 */
4276 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004277 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4278 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
Tim Peters2d629652003-02-04 05:06:17 +00004279 Py_DECREF(py_code);
4280 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4281 "isn't a 2-tuple of strings", code);
4282 return -1;
4283 }
4284 /* Load the object. */
4285 obj = find_class(module_name, class_name, self->find_class);
4286 if (obj == NULL) {
4287 Py_DECREF(py_code);
4288 return -1;
4289 }
4290 /* Cache code -> obj. */
4291 code = PyDict_SetItem(extension_cache, py_code, obj);
4292 Py_DECREF(py_code);
4293 if (code < 0) {
4294 Py_DECREF(obj);
4295 return -1;
4296 }
4297 PDATA_PUSH(self->stack, obj, -1);
4298 return 0;
4299}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004300
4301static int
Tim Peterscba30e22003-02-01 06:24:36 +00004302load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004303{
4304 PyObject *py_str = 0, *value = 0;
4305 int len, l;
4306 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004307
Tim Peters0bc93f52003-02-02 18:29:33 +00004308 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004309 if (l < 2) return bad_readline();
4310 if (!( len=self->stack->length )) return stackUnderflow();
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004311 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004312 value=self->stack->data[len-1];
4313 l=PyDict_SetItem(self->memo, py_str, value);
4314 Py_DECREF(py_str);
4315 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316}
4317
4318
4319static int
Tim Peterscba30e22003-02-01 06:24:36 +00004320load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321{
4322 PyObject *py_key = 0, *value = 0;
4323 unsigned char key;
4324 char *s;
4325 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326
Tim Peters0bc93f52003-02-02 18:29:33 +00004327 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4333 value=self->stack->data[len-1];
4334 len=PyDict_SetItem(self->memo, py_key, value);
4335 Py_DECREF(py_key);
4336 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004337}
4338
4339
4340static int
Tim Peterscba30e22003-02-01 06:24:36 +00004341load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342{
4343 PyObject *py_key = 0, *value = 0;
4344 long key;
4345 unsigned char c;
4346 char *s;
4347 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004348
Tim Peters0bc93f52003-02-02 18:29:33 +00004349 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 c = (unsigned char)s[0];
4353 key = (long)c;
4354 c = (unsigned char)s[1];
4355 key |= (long)c << 8;
4356 c = (unsigned char)s[2];
4357 key |= (long)c << 16;
4358 c = (unsigned char)s[3];
4359 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 if (!( py_key = PyInt_FromLong(key))) return -1;
4362 value=self->stack->data[len-1];
4363 len=PyDict_SetItem(self->memo, py_key, value);
4364 Py_DECREF(py_key);
4365 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004366}
4367
4368
4369static int
Tim Peterscba30e22003-02-01 06:24:36 +00004370do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371{
4372 PyObject *value = 0, *list = 0, *append_method = 0;
4373 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 len=self->stack->length;
4376 if (!( len >= x && x > 0 )) return stackUnderflow();
4377 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004378 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 if (PyList_Check(list)) {
4383 PyObject *slice;
4384 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004387 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 list_len = PyList_GET_SIZE(list);
4389 i=PyList_SetSlice(list, list_len, list_len, slice);
4390 Py_DECREF(slice);
4391 return i;
4392 }
4393 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004394
Tim Peterscba30e22003-02-01 06:24:36 +00004395 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 return -1;
4397
4398 for (i = x; i < len; i++) {
4399 PyObject *junk;
4400
4401 value=self->stack->data[i];
4402 junk=0;
4403 ARG_TUP(self, value);
4404 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004405 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 NULL);
4407 FREE_ARG_TUP(self);
4408 }
4409 if (! junk) {
4410 Pdata_clear(self->stack, i+1);
4411 self->stack->length=x;
4412 Py_DECREF(append_method);
4413 return -1;
4414 }
4415 Py_DECREF(junk);
4416 }
4417 self->stack->length=x;
4418 Py_DECREF(append_method);
4419 }
4420
4421 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004422}
4423
4424
4425static int
Tim Peterscba30e22003-02-01 06:24:36 +00004426load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427{
4428 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004429}
4430
4431
4432static int
Tim Peterscba30e22003-02-01 06:24:36 +00004433load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434{
4435 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004436}
4437
4438
4439static int
Tim Peterscba30e22003-02-01 06:24:36 +00004440do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441{
4442 PyObject *value = 0, *key = 0, *dict = 0;
4443 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 if (!( (len=self->stack->length) >= x
4446 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 for (i = x+1; i < len; i += 2) {
4451 key =self->stack->data[i-1];
4452 value=self->stack->data[i ];
4453 if (PyObject_SetItem(dict, key, value) < 0) {
4454 r=-1;
4455 break;
4456 }
4457 }
4458
4459 Pdata_clear(self->stack, x);
4460
4461 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004462}
4463
4464
Tim Peters84e87f32001-03-17 04:50:51 +00004465static int
Tim Peterscba30e22003-02-01 06:24:36 +00004466load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467{
4468 return do_setitems(self, self->stack->length - 2);
4469}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471static int
Tim Peterscba30e22003-02-01 06:24:36 +00004472load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473{
4474 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475}
4476
Tim Peters84e87f32001-03-17 04:50:51 +00004477
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478static int
Tim Peterscba30e22003-02-01 06:24:36 +00004479load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480{
Tim Peters080c88b2003-02-15 03:01:11 +00004481 PyObject *state, *inst, *slotstate;
4482 PyObject *__setstate__;
4483 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004484 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004485 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486
Tim Peters080c88b2003-02-15 03:01:11 +00004487 /* Stack is ... instance, state. We want to leave instance at
4488 * the stack top, possibly mutated via instance.__setstate__(state).
4489 */
4490 if (self->stack->length < 2)
4491 return stackUnderflow();
4492 PDATA_POP(self->stack, state);
4493 if (state == NULL)
4494 return -1;
4495 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496
Tim Peters080c88b2003-02-15 03:01:11 +00004497 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4498 if (__setstate__ != NULL) {
4499 PyObject *junk = NULL;
4500
4501 /* The explicit __setstate__ is responsible for everything. */
4502 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 if (self->arg) {
4504 junk = PyObject_Call(__setstate__, self->arg, NULL);
4505 FREE_ARG_TUP(self);
4506 }
4507 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004508 if (junk == NULL)
4509 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 Py_DECREF(junk);
4511 return 0;
4512 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004513 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4514 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004516
4517 /* A default __setstate__. First see whether state embeds a
4518 * slot state dict too (a proto 2 addition).
4519 */
4520 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4521 PyObject *temp = state;
4522 state = PyTuple_GET_ITEM(temp, 0);
4523 slotstate = PyTuple_GET_ITEM(temp, 1);
4524 Py_INCREF(state);
4525 Py_INCREF(slotstate);
4526 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 }
Tim Peters080c88b2003-02-15 03:01:11 +00004528 else
4529 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530
Tim Peters080c88b2003-02-15 03:01:11 +00004531 /* Set inst.__dict__ from the state dict (if any). */
4532 if (state != Py_None) {
4533 PyObject *dict;
4534 if (! PyDict_Check(state)) {
4535 PyErr_SetString(UnpicklingError, "state is not a "
4536 "dictionary");
4537 goto finally;
4538 }
4539 dict = PyObject_GetAttr(inst, __dict___str);
4540 if (dict == NULL)
4541 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542
Tim Peters080c88b2003-02-15 03:01:11 +00004543 i = 0;
4544 while (PyDict_Next(state, &i, &d_key, &d_value)) {
Antoine Pitrou74309892009-05-02 21:13:23 +00004545 /* normally the keys for instance attributes are
4546 interned. we should try to do that here. */
4547 Py_INCREF(d_key);
4548 if (PyString_CheckExact(d_key))
4549 PyString_InternInPlace(&d_key);
4550 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
4551 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004552 goto finally;
Antoine Pitrou74309892009-05-02 21:13:23 +00004553 }
4554 Py_DECREF(d_key);
Tim Peters080c88b2003-02-15 03:01:11 +00004555 }
4556 Py_DECREF(dict);
4557 }
4558
4559 /* Also set instance attributes from the slotstate dict (if any). */
4560 if (slotstate != NULL) {
4561 if (! PyDict_Check(slotstate)) {
4562 PyErr_SetString(UnpicklingError, "slot state is not "
4563 "a dictionary");
4564 goto finally;
4565 }
4566 i = 0;
4567 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4568 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4569 goto finally;
4570 }
4571 }
4572 res = 0;
4573
4574 finally:
4575 Py_DECREF(state);
4576 Py_XDECREF(slotstate);
4577 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578}
4579
4580
4581static int
Tim Peterscba30e22003-02-01 06:24:36 +00004582load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583{
4584 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 /* Note that we split the (pickle.py) stack into two stacks, an
4587 object stack and a mark stack. Here we push a mark onto the
4588 mark stack.
4589 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004592 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 s=self->marks_size+20;
4594 if (s <= self->num_marks) s=self->num_marks + 1;
4595 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004596 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004598 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004599 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004600 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 PyErr_NoMemory();
4602 return -1;
4603 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004604 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004605 self->marks_size = s;
4606 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004610 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004611}
4612
Guido van Rossum60456fd1997-04-09 17:36:32 +00004613static int
Tim Peterscba30e22003-02-01 06:24:36 +00004614load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615{
4616 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 PDATA_POP(self->stack, arg_tup);
4619 if (! arg_tup) return -1;
4620 PDATA_POP(self->stack, callable);
4621 if (callable) {
4622 ob = Instance_New(callable, arg_tup);
4623 Py_DECREF(callable);
4624 }
4625 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004629 PDATA_PUSH(self->stack, ob, -1);
4630 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004631}
Tim Peters84e87f32001-03-17 04:50:51 +00004632
Tim Peters4190fb82003-02-02 16:09:05 +00004633/* Just raises an error if we don't know the protocol specified. PROTO
4634 * is the first opcode for protocols >= 2.
4635 */
4636static int
4637load_proto(Unpicklerobject *self)
4638{
4639 int i;
4640 char *protobyte;
4641
4642 i = self->read_func(self, &protobyte, 1);
4643 if (i < 0)
4644 return -1;
4645
4646 i = calc_binint(protobyte, 1);
4647 /* No point checking for < 0, since calc_binint returns an unsigned
4648 * int when chewing on 1 byte.
4649 */
4650 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004651 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004652 return 0;
4653
4654 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4655 return -1;
4656}
4657
Guido van Rossum60456fd1997-04-09 17:36:32 +00004658static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004659load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660{
4661 PyObject *err = 0, *val = 0;
4662 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 self->num_marks = 0;
4665 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004668 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 switch (s[0]) {
4672 case NONE:
4673 if (load_none(self) < 0)
4674 break;
4675 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 case BININT:
4678 if (load_binint(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 BININT1:
4683 if (load_binint1(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 BININT2:
4688 if (load_binint2(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 INT:
4693 if (load_int(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 LONG:
4698 if (load_long(self) < 0)
4699 break;
4700 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004701
Tim Petersee1a53c2003-02-02 02:57:53 +00004702 case LONG1:
4703 if (load_counted_long(self, 1) < 0)
4704 break;
4705 continue;
4706
4707 case LONG4:
4708 if (load_counted_long(self, 4) < 0)
4709 break;
4710 continue;
4711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004712 case FLOAT:
4713 if (load_float(self) < 0)
4714 break;
4715 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 case BINFLOAT:
4718 if (load_binfloat(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 BINSTRING:
4723 if (load_binstring(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 SHORT_BINSTRING:
4728 if (load_short_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 STRING:
4733 if (load_string(self) < 0)
4734 break;
4735 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004737#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 case UNICODE:
4739 if (load_unicode(self) < 0)
4740 break;
4741 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 case BINUNICODE:
4744 if (load_binunicode(self) < 0)
4745 break;
4746 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004747#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004750 if (load_counted_tuple(self, 0) < 0)
4751 break;
4752 continue;
4753
4754 case TUPLE1:
4755 if (load_counted_tuple(self, 1) < 0)
4756 break;
4757 continue;
4758
4759 case TUPLE2:
4760 if (load_counted_tuple(self, 2) < 0)
4761 break;
4762 continue;
4763
4764 case TUPLE3:
4765 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 break;
4767 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case TUPLE:
4770 if (load_tuple(self) < 0)
4771 break;
4772 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 case EMPTY_LIST:
4775 if (load_empty_list(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 LIST:
4780 if (load_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 EMPTY_DICT:
4785 if (load_empty_dict(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 DICT:
4790 if (load_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 OBJ:
4795 if (load_obj(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 INST:
4800 if (load_inst(self) < 0)
4801 break;
4802 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004803
Tim Peterseab7db32003-02-13 18:24:14 +00004804 case NEWOBJ:
4805 if (load_newobj(self) < 0)
4806 break;
4807 continue;
4808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case GLOBAL:
4810 if (load_global(self) < 0)
4811 break;
4812 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case APPEND:
4815 if (load_append(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 APPENDS:
4820 if (load_appends(self) < 0)
4821 break;
4822 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case BUILD:
4825 if (load_build(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 DUP:
4830 if (load_dup(self) < 0)
4831 break;
4832 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case BINGET:
4835 if (load_binget(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 LONG_BINGET:
4840 if (load_long_binget(self) < 0)
4841 break;
4842 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 case GET:
4845 if (load_get(self) < 0)
4846 break;
4847 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004848
Tim Peters2d629652003-02-04 05:06:17 +00004849 case EXT1:
4850 if (load_extension(self, 1) < 0)
4851 break;
4852 continue;
4853
4854 case EXT2:
4855 if (load_extension(self, 2) < 0)
4856 break;
4857 continue;
4858
4859 case EXT4:
4860 if (load_extension(self, 4) < 0)
4861 break;
4862 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 case MARK:
4864 if (load_mark(self) < 0)
4865 break;
4866 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004868 case BINPUT:
4869 if (load_binput(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 LONG_BINPUT:
4874 if (load_long_binput(self) < 0)
4875 break;
4876 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 case PUT:
4879 if (load_put(self) < 0)
4880 break;
4881 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 case POP:
4884 if (load_pop(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_MARK:
4889 if (load_pop_mark(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 SETITEM:
4894 if (load_setitem(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 SETITEMS:
4899 if (load_setitems(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 STOP:
4904 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 case PERSID:
4907 if (load_persid(self) < 0)
4908 break;
4909 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 case BINPERSID:
4912 if (load_binpersid(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 REDUCE:
4917 if (load_reduce(self) < 0)
4918 break;
4919 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004920
Tim Peters4190fb82003-02-02 16:09:05 +00004921 case PROTO:
4922 if (load_proto(self) < 0)
4923 break;
4924 continue;
4925
Tim Peters3c67d792003-02-02 17:59:11 +00004926 case NEWTRUE:
4927 if (load_bool(self, Py_True) < 0)
4928 break;
4929 continue;
4930
4931 case NEWFALSE:
4932 if (load_bool(self, Py_False) < 0)
4933 break;
4934 continue;
4935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004936 case '\0':
4937 /* end of file */
4938 PyErr_SetNone(PyExc_EOFError);
4939 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004942 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 "invalid load key, '%s'.",
4944 "c", s[0]);
4945 return NULL;
4946 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 break;
4949 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 if ((err = PyErr_Occurred())) {
4952 if (err == PyExc_EOFError) {
4953 PyErr_SetNone(PyExc_EOFError);
4954 }
4955 return NULL;
4956 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 PDATA_POP(self->stack, val);
4959 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004960}
Tim Peters84e87f32001-03-17 04:50:51 +00004961
Guido van Rossum60456fd1997-04-09 17:36:32 +00004962
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004963/* No-load functions to support noload, which is used to
4964 find persistent references. */
4965
4966static int
Tim Peterscba30e22003-02-01 06:24:36 +00004967noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968{
4969 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 if ((i = marker(self)) < 0) return -1;
4972 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004973}
4974
4975
4976static int
Tim Peterscba30e22003-02-01 06:24:36 +00004977noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978{
4979 int i;
4980 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 if ((i = marker(self)) < 0) return -1;
4983 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004984 if (self->readline_func(self, &s) < 0) return -1;
4985 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004986 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004988}
4989
4990static int
Tim Peterseab7db32003-02-13 18:24:14 +00004991noload_newobj(Unpicklerobject *self)
4992{
4993 PyObject *obj;
4994
4995 PDATA_POP(self->stack, obj); /* pop argtuple */
4996 if (obj == NULL) return -1;
4997 Py_DECREF(obj);
4998
4999 PDATA_POP(self->stack, obj); /* pop cls */
5000 if (obj == NULL) return -1;
5001 Py_DECREF(obj);
5002
5003 PDATA_APPEND(self->stack, Py_None, -1);
5004 return 0;
5005}
5006
5007static int
Tim Peterscba30e22003-02-01 06:24:36 +00005008noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009{
5010 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005011
Tim Peters0bc93f52003-02-02 18:29:33 +00005012 if (self->readline_func(self, &s) < 0) return -1;
5013 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 PDATA_APPEND(self->stack, Py_None,-1);
5015 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005016}
5017
5018static int
Tim Peterscba30e22003-02-01 06:24:36 +00005019noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005020{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005022 if (self->stack->length < 2) return stackUnderflow();
5023 Pdata_clear(self->stack, self->stack->length-2);
5024 PDATA_APPEND(self->stack, Py_None,-1);
5025 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005026}
5027
5028static int
5029noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005030
Guido van Rossum053b8df1998-11-25 16:18:00 +00005031 if (self->stack->length < 1) return stackUnderflow();
5032 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00005033 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005034}
5035
Tim Peters2d629652003-02-04 05:06:17 +00005036static int
5037noload_extension(Unpicklerobject *self, int nbytes)
5038{
5039 char *codebytes;
5040
5041 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
5042 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
5043 PDATA_APPEND(self->stack, Py_None, -1);
5044 return 0;
5045}
5046
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005047
5048static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005049noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005050{
5051 PyObject *err = 0, *val = 0;
5052 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 self->num_marks = 0;
5055 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005057 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00005058 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 switch (s[0]) {
5062 case NONE:
5063 if (load_none(self) < 0)
5064 break;
5065 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 case BININT:
5068 if (load_binint(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 BININT1:
5073 if (load_binint1(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 BININT2:
5078 if (load_binint2(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 INT:
5083 if (load_int(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 LONG:
5088 if (load_long(self) < 0)
5089 break;
5090 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005091
Tim Peters4190fb82003-02-02 16:09:05 +00005092 case LONG1:
5093 if (load_counted_long(self, 1) < 0)
5094 break;
5095 continue;
5096
5097 case LONG4:
5098 if (load_counted_long(self, 4) < 0)
5099 break;
5100 continue;
5101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 case FLOAT:
5103 if (load_float(self) < 0)
5104 break;
5105 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 case BINFLOAT:
5108 if (load_binfloat(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 BINSTRING:
5113 if (load_binstring(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 SHORT_BINSTRING:
5118 if (load_short_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 STRING:
5123 if (load_string(self) < 0)
5124 break;
5125 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005126
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005127#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 case UNICODE:
5129 if (load_unicode(self) < 0)
5130 break;
5131 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 case BINUNICODE:
5134 if (load_binunicode(self) < 0)
5135 break;
5136 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005137#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00005138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005139 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00005140 if (load_counted_tuple(self, 0) < 0)
5141 break;
5142 continue;
5143
5144 case TUPLE1:
5145 if (load_counted_tuple(self, 1) < 0)
5146 break;
5147 continue;
5148
5149 case TUPLE2:
5150 if (load_counted_tuple(self, 2) < 0)
5151 break;
5152 continue;
5153
5154 case TUPLE3:
5155 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005156 break;
5157 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 case TUPLE:
5160 if (load_tuple(self) < 0)
5161 break;
5162 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 case EMPTY_LIST:
5165 if (load_empty_list(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 LIST:
5170 if (load_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 EMPTY_DICT:
5175 if (load_empty_dict(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 DICT:
5180 if (load_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 OBJ:
5185 if (noload_obj(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 INST:
5190 if (noload_inst(self) < 0)
5191 break;
5192 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005193
Tim Peterseab7db32003-02-13 18:24:14 +00005194 case NEWOBJ:
5195 if (noload_newobj(self) < 0)
5196 break;
5197 continue;
5198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199 case GLOBAL:
5200 if (noload_global(self) < 0)
5201 break;
5202 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 case APPEND:
5205 if (load_append(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 APPENDS:
5210 if (load_appends(self) < 0)
5211 break;
5212 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 case BUILD:
5215 if (noload_build(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 DUP:
5220 if (load_dup(self) < 0)
5221 break;
5222 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224 case BINGET:
5225 if (load_binget(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 LONG_BINGET:
5230 if (load_long_binget(self) < 0)
5231 break;
5232 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234 case GET:
5235 if (load_get(self) < 0)
5236 break;
5237 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005238
Tim Peters2d629652003-02-04 05:06:17 +00005239 case EXT1:
5240 if (noload_extension(self, 1) < 0)
5241 break;
5242 continue;
5243
5244 case EXT2:
5245 if (noload_extension(self, 2) < 0)
5246 break;
5247 continue;
5248
5249 case EXT4:
5250 if (noload_extension(self, 4) < 0)
5251 break;
5252 continue;
5253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 case MARK:
5255 if (load_mark(self) < 0)
5256 break;
5257 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005259 case BINPUT:
5260 if (load_binput(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 LONG_BINPUT:
5265 if (load_long_binput(self) < 0)
5266 break;
5267 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 case PUT:
5270 if (load_put(self) < 0)
5271 break;
5272 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274 case POP:
5275 if (load_pop(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_MARK:
5280 if (load_pop_mark(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 SETITEM:
5285 if (load_setitem(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 SETITEMS:
5290 if (load_setitems(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 STOP:
5295 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005297 case PERSID:
5298 if (load_persid(self) < 0)
5299 break;
5300 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005302 case BINPERSID:
5303 if (load_binpersid(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 REDUCE:
5308 if (noload_reduce(self) < 0)
5309 break;
5310 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005311
Tim Peters4190fb82003-02-02 16:09:05 +00005312 case PROTO:
5313 if (load_proto(self) < 0)
5314 break;
5315 continue;
5316
Tim Peters3c67d792003-02-02 17:59:11 +00005317 case NEWTRUE:
5318 if (load_bool(self, Py_True) < 0)
5319 break;
5320 continue;
5321
5322 case NEWFALSE:
5323 if (load_bool(self, Py_False) < 0)
5324 break;
5325 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005327 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005328 "invalid load key, '%s'.",
5329 "c", s[0]);
5330 return NULL;
5331 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333 break;
5334 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005336 if ((err = PyErr_Occurred())) {
5337 if (err == PyExc_EOFError) {
5338 PyErr_SetNone(PyExc_EOFError);
5339 }
5340 return NULL;
5341 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005343 PDATA_POP(self->stack, val);
5344 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005345}
Tim Peters84e87f32001-03-17 04:50:51 +00005346
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005347
Guido van Rossum60456fd1997-04-09 17:36:32 +00005348static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005349Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005350{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005352}
5353
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005354static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005355Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005356{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005357 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005358}
5359
Guido van Rossum60456fd1997-04-09 17:36:32 +00005360
5361static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005362 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005363 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005364 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005365 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005366 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005367 "noload() -- not load a pickle, but go through most of the motions\n"
5368 "\n"
5369 "This function can be used to read past a pickle without instantiating\n"
5370 "any objects or importing any modules. It can also be used to find all\n"
5371 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005372 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005373 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005374 {NULL, NULL} /* sentinel */
5375};
5376
5377
5378static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005379newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005380{
5381 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005382
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005383 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005384 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005386 self->file = NULL;
5387 self->arg = NULL;
5388 self->stack = (Pdata*)Pdata_New();
5389 self->pers_func = NULL;
5390 self->last_string = NULL;
5391 self->marks = NULL;
5392 self->num_marks = 0;
5393 self->marks_size = 0;
5394 self->buf_size = 0;
5395 self->read = NULL;
5396 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005398
Tim Peterscba30e22003-02-01 06:24:36 +00005399 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005400 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005401
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005402 if (!self->stack)
5403 goto err;
5404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 Py_INCREF(f);
5406 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005408 /* Set read, readline based on type of f */
5409 if (PyFile_Check(f)) {
5410 self->fp = PyFile_AsFile(f);
5411 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005412 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005413 "I/O operation on closed file");
5414 goto err;
5415 }
5416 self->read_func = read_file;
5417 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005418 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005419 else if (PycStringIO_InputCheck(f)) {
5420 self->fp = NULL;
5421 self->read_func = read_cStringIO;
5422 self->readline_func = readline_cStringIO;
5423 }
5424 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 self->fp = NULL;
5427 self->read_func = read_other;
5428 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005430 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5431 (self->read = PyObject_GetAttr(f, read_str)))) {
5432 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005433 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005434 "argument must have 'read' and "
5435 "'readline' attributes" );
5436 goto err;
5437 }
5438 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005439 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005441 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005443 err:
5444 Py_DECREF((PyObject *)self);
5445 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005446}
5447
5448
5449static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005450get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005453}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005454
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005455
Guido van Rossum60456fd1997-04-09 17:36:32 +00005456static void
Tim Peterscba30e22003-02-01 06:24:36 +00005457Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005459 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005460 Py_XDECREF(self->readline);
5461 Py_XDECREF(self->read);
5462 Py_XDECREF(self->file);
5463 Py_XDECREF(self->memo);
5464 Py_XDECREF(self->stack);
5465 Py_XDECREF(self->pers_func);
5466 Py_XDECREF(self->arg);
5467 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005468 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 if (self->marks) {
5471 free(self->marks);
5472 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005474 if (self->buf_size) {
5475 free(self->buf);
5476 }
Tim Peters84e87f32001-03-17 04:50:51 +00005477
Christian Heimese93237d2007-12-19 02:37:44 +00005478 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005479}
5480
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005481static int
5482Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5483{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005484 Py_VISIT(self->readline);
5485 Py_VISIT(self->read);
5486 Py_VISIT(self->file);
5487 Py_VISIT(self->memo);
5488 Py_VISIT(self->stack);
5489 Py_VISIT(self->pers_func);
5490 Py_VISIT(self->arg);
5491 Py_VISIT(self->last_string);
5492 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005493 return 0;
5494}
5495
5496static int
5497Unpickler_clear(Unpicklerobject *self)
5498{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005499 Py_CLEAR(self->readline);
5500 Py_CLEAR(self->read);
5501 Py_CLEAR(self->file);
5502 Py_CLEAR(self->memo);
5503 Py_CLEAR(self->stack);
5504 Py_CLEAR(self->pers_func);
5505 Py_CLEAR(self->arg);
5506 Py_CLEAR(self->last_string);
5507 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005508 return 0;
5509}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005510
5511static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005512Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005513{
5514 if (!strcmp(name, "persistent_load")) {
5515 if (!self->pers_func) {
5516 PyErr_SetString(PyExc_AttributeError, name);
5517 return NULL;
5518 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005520 Py_INCREF(self->pers_func);
5521 return self->pers_func;
5522 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005524 if (!strcmp(name, "find_global")) {
5525 if (!self->find_class) {
5526 PyErr_SetString(PyExc_AttributeError, name);
5527 return NULL;
5528 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005530 Py_INCREF(self->find_class);
5531 return self->find_class;
5532 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 if (!strcmp(name, "memo")) {
5535 if (!self->memo) {
5536 PyErr_SetString(PyExc_AttributeError, name);
5537 return NULL;
5538 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005540 Py_INCREF(self->memo);
5541 return self->memo;
5542 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005544 if (!strcmp(name, "UnpicklingError")) {
5545 Py_INCREF(UnpicklingError);
5546 return UnpicklingError;
5547 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005549 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005550}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005551
Guido van Rossum60456fd1997-04-09 17:36:32 +00005552
5553static int
Tim Peterscba30e22003-02-01 06:24:36 +00005554Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005555{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005557 if (!strcmp(name, "persistent_load")) {
5558 Py_XDECREF(self->pers_func);
5559 self->pers_func = value;
5560 Py_XINCREF(value);
5561 return 0;
5562 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005564 if (!strcmp(name, "find_global")) {
5565 Py_XDECREF(self->find_class);
5566 self->find_class = value;
5567 Py_XINCREF(value);
5568 return 0;
5569 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005571 if (! value) {
5572 PyErr_SetString(PyExc_TypeError,
5573 "attribute deletion is not supported");
5574 return -1;
5575 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005577 if (strcmp(name, "memo") == 0) {
5578 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005579 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005580 "memo must be a dictionary");
5581 return -1;
5582 }
5583 Py_XDECREF(self->memo);
5584 self->memo = value;
5585 Py_INCREF(value);
5586 return 0;
5587 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005589 PyErr_SetString(PyExc_AttributeError, name);
5590 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005591}
5592
Tim Peters5bd2a792003-02-01 16:45:06 +00005593/* ---------------------------------------------------------------------------
5594 * Module-level functions.
5595 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005596
Martin v. Löwis544f1192004-07-27 05:22:33 +00005597/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005598static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005599cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005600{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005601 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005602 PyObject *ob, *file, *res = NULL;
5603 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005604 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005605
Martin v. Löwis544f1192004-07-27 05:22:33 +00005606 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5607 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005608 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005609
Tim Peters5bd2a792003-02-01 16:45:06 +00005610 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005611 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005613 if (dump(pickler, ob) < 0)
5614 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005616 Py_INCREF(Py_None);
5617 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005619 finally:
5620 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005622 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005623}
5624
5625
Martin v. Löwis544f1192004-07-27 05:22:33 +00005626/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005627static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005628cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005629{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005630 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005631 PyObject *ob, *file = 0, *res = NULL;
5632 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005633 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005634
Martin v. Löwis544f1192004-07-27 05:22:33 +00005635 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5636 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005637 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005638
Tim Peterscba30e22003-02-01 06:24:36 +00005639 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005640 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005641
Tim Peters5bd2a792003-02-01 16:45:06 +00005642 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005643 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005645 if (dump(pickler, ob) < 0)
5646 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005648 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005650 finally:
5651 Py_XDECREF(pickler);
5652 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005654 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005655}
5656
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005657
Tim Peters5bd2a792003-02-01 16:45:06 +00005658/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005659static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005660cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005661{
5662 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005663 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005664
Tim Peterscba30e22003-02-01 06:24:36 +00005665 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005666 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005668 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005670 finally:
5671 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005674}
5675
5676
Tim Peters5bd2a792003-02-01 16:45:06 +00005677/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005678static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005679cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005680{
5681 PyObject *ob, *file = 0, *res = NULL;
5682 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005683
Tim Peterscba30e22003-02-01 06:24:36 +00005684 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005686
Tim Peterscba30e22003-02-01 06:24:36 +00005687 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005688 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005689
Tim Peterscba30e22003-02-01 06:24:36 +00005690 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005691 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005693 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005695 finally:
5696 Py_XDECREF(file);
5697 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005699 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005700}
5701
5702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005703PyDoc_STRVAR(Unpicklertype__doc__,
5704"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005705
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005706static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005707 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005708 "cPickle.Unpickler", /*tp_name*/
5709 sizeof(Unpicklerobject), /*tp_basicsize*/
5710 0,
5711 (destructor)Unpickler_dealloc, /* tp_dealloc */
5712 0, /* tp_print */
5713 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5714 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5715 0, /* tp_compare */
5716 0, /* tp_repr */
5717 0, /* tp_as_number */
5718 0, /* tp_as_sequence */
5719 0, /* tp_as_mapping */
5720 0, /* tp_hash */
5721 0, /* tp_call */
5722 0, /* tp_str */
5723 0, /* tp_getattro */
5724 0, /* tp_setattro */
5725 0, /* tp_as_buffer */
5726 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5727 Unpicklertype__doc__, /* tp_doc */
5728 (traverseproc)Unpickler_traverse, /* tp_traverse */
5729 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005730};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005731
Guido van Rossum60456fd1997-04-09 17:36:32 +00005732static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005733 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5734 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005735 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005736 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005737 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005738 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005739
Martin v. Löwis544f1192004-07-27 05:22:33 +00005740 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5741 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005742 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005743 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005744 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005745 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005746
Georg Brandl96a8c392006-05-29 21:04:52 +00005747 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005748 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005749
Neal Norwitzb0493252002-03-31 14:44:22 +00005750 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005751 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005752
Martin v. Löwis544f1192004-07-27 05:22:33 +00005753 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5754 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005755 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005756 "This takes a file-like object for writing a pickle data stream.\n"
5757 "The optional proto argument tells the pickler to use the given\n"
5758 "protocol; supported protocols are 0, 1, 2. The default\n"
5759 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5760 "only protocol that can be written to a file opened in text\n"
5761 "mode and read back successfully. When using a protocol higher\n"
5762 "than 0, make sure the file is opened in binary mode, both when\n"
5763 "pickling and unpickling.)\n"
5764 "\n"
5765 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5766 "more efficient than protocol 1.\n"
5767 "\n"
5768 "Specifying a negative protocol version selects the highest\n"
5769 "protocol version supported. The higher the protocol used, the\n"
5770 "more recent the version of Python needed to read the pickle\n"
5771 "produced.\n"
5772 "\n"
5773 "The file parameter must have a write() method that accepts a single\n"
5774 "string argument. It can thus be an open file object, a StringIO\n"
5775 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005776 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005777
Georg Brandl96a8c392006-05-29 21:04:52 +00005778 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005779 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5780
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005781 { NULL, NULL }
5782};
5783
Guido van Rossum60456fd1997-04-09 17:36:32 +00005784static int
Tim Peterscba30e22003-02-01 06:24:36 +00005785init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005786{
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005787 PyObject *copyreg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005788
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005789#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005790
Tim Peters3cfe7542003-05-21 21:29:48 +00005791 if (PyType_Ready(&Unpicklertype) < 0)
5792 return -1;
5793 if (PyType_Ready(&Picklertype) < 0)
5794 return -1;
5795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005796 INIT_STR(__class__);
5797 INIT_STR(__getinitargs__);
5798 INIT_STR(__dict__);
5799 INIT_STR(__getstate__);
5800 INIT_STR(__setstate__);
5801 INIT_STR(__name__);
5802 INIT_STR(__main__);
5803 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005804 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005805 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005806 INIT_STR(append);
5807 INIT_STR(read);
5808 INIT_STR(readline);
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005809 INIT_STR(copyreg);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005810 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005811
Georg Brandldffbf5f2008-05-20 07:49:57 +00005812 if (!( copyreg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005813 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005814
Tim Peters1f1b2d22003-02-01 02:16:37 +00005815 /* This is special because we want to use a different
5816 one in restricted mode. */
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005817 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005818 if (!dispatch_table) return -1;
5819
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005820 extension_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005821 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005822 if (!extension_registry) return -1;
5823
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005824 inverted_registry = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005825 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005826 if (!inverted_registry) return -1;
5827
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005828 extension_cache = PyObject_GetAttrString(copyreg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005829 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005830 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005831
Alexandre Vassalotti9510e4a2008-05-11 08:25:28 +00005832 Py_DECREF(copyreg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005833
Tim Peters731098b2003-02-04 20:56:09 +00005834 if (!(empty_tuple = PyTuple_New(0)))
5835 return -1;
5836
5837 two_tuple = PyTuple_New(2);
5838 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005839 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005840 /* We use this temp container with no regard to refcounts, or to
5841 * keeping containees alive. Exempt from GC, because we don't
5842 * want anything looking at two_tuple() by magic.
5843 */
5844 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005846 /* Ugh */
5847 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5848 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5849 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005851 if (!( t=PyDict_New())) return -1;
5852 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005853 "def __str__(self):\n"
5854 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5855 Py_file_input,
5856 module_dict, t) )) return -1;
5857 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005859 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005860 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005861 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005863 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005864
Tim Peterscba30e22003-02-01 06:24:36 +00005865 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005866 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005867 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005868 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005870 if (!( t=PyDict_New())) return -1;
5871 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005872 "def __str__(self):\n"
5873 " a=self.args\n"
5874 " a=a and type(a[0]) or '(what)'\n"
5875 " return 'Cannot pickle %s objects' % a\n"
5876 , Py_file_input,
5877 module_dict, t) )) return -1;
5878 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005880 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005881 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005882 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005884 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005886 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005887 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005888 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005889
Martin v. Löwis658009a2002-09-16 17:26:24 +00005890 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5891 UnpicklingError, NULL)))
5892 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005894 if (PyDict_SetItemString(module_dict, "PickleError",
5895 PickleError) < 0)
5896 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005898 if (PyDict_SetItemString(module_dict, "PicklingError",
5899 PicklingError) < 0)
5900 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005902 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5903 UnpicklingError) < 0)
5904 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005906 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5907 UnpickleableError) < 0)
5908 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005910 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5911 BadPickleGet) < 0)
5912 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005914 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005916 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005917}
5918
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005919#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5920#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005921#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005922PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005923initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005924{
5925 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005926 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005927 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005928 PyObject *format_version;
5929 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005930
Alexandre Vassalotti3c4971c2008-05-16 19:14:31 +00005931 /* XXX: Should mention that the pickle module will include the C
5932 XXX: optimized implementation automatically. */
5933 if (PyErr_WarnPy3k("the cPickle module has been removed in "
5934 "Python 3.0", 2) < 0)
5935 return;
5936
Christian Heimese93237d2007-12-19 02:37:44 +00005937 Py_TYPE(&Picklertype) = &PyType_Type;
5938 Py_TYPE(&Unpicklertype) = &PyType_Type;
5939 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005941 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005942 * so we're forced to use a temporary dictionary. :(
5943 */
5944 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005945 if (!di) return;
5946 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005948 /* Create the module and add the functions */
5949 m = Py_InitModule4("cPickle", cPickle_methods,
5950 cPickle_module_documentation,
5951 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005952 if (m == NULL)
5953 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005955 /* Add some symbolic constants to the module */
5956 d = PyModule_GetDict(m);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005957 v = PyString_FromString(rev);
Tim Peters5b7da392003-02-04 00:21:07 +00005958 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005959 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005961 /* Copy data from di. Waaa. */
5962 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5963 if (PyObject_SetItem(d, k, v) < 0) {
5964 Py_DECREF(di);
5965 return;
5966 }
5967 }
5968 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005969
Tim Peters8587b3c2003-02-13 15:44:41 +00005970 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5971 if (i < 0)
5972 return;
5973
Tim Peters5b7da392003-02-04 00:21:07 +00005974 /* These are purely informational; no code uses them. */
5975 /* File format version we write. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00005976 format_version = PyString_FromString("2.0");
Tim Peters5b7da392003-02-04 00:21:07 +00005977 /* Format versions we can read. */
5978 compatible_formats = Py_BuildValue("[sssss]",
5979 "1.0", /* Original protocol 0 */
5980 "1.1", /* Protocol 0 + INST */
5981 "1.2", /* Original protocol 1 */
5982 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005983 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005984 PyDict_SetItemString(d, "format_version", format_version);
5985 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5986 Py_XDECREF(format_version);
5987 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005988}