blob: ad2b91fee51d1ac52cca782f711a2c2a446b8092 [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/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (s == NULL) {
426 return 0;
427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000428
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
432 }
433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) {
449 return 0;
450 }
Tim Peterscba30e22003-02-01 06:24:36 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463 if (n > INT_MAX) return -1;
464 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000465}
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000472
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000478 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000480 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
487 }
Tim Peterscba30e22003-02-01 06:24:36 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000491 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 return -1;
493 }
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
498 }
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
507 }
508 if (junk) Py_DECREF(junk);
509 else return -1;
510 }
511 else
512 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 0;
515 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516}
517
518
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519static Py_ssize_t
520read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521{
522 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000524 if (self->buf_size == 0) {
525 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000528 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size = size;
534 }
535 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000536 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537 if (!self->buf) {
538 PyErr_NoMemory();
539 return -1;
540 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 self->buf_size = n;
542 }
Tim Peters84e87f32001-03-17 04:50:51 +0000543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000544 Py_BEGIN_ALLOW_THREADS
545 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
546 Py_END_ALLOW_THREADS
547 if (nbytesread != (size_t)n) {
548 if (feof(self->fp)) {
549 PyErr_SetNone(PyExc_EOFError);
550 return -1;
551 }
Tim Peterscba30e22003-02-01 06:24:36 +0000552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553 PyErr_SetFromErrno(PyExc_IOError);
554 return -1;
555 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560}
561
562
Martin v. Löwis18e16552006-02-15 17:27:45 +0000563static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000564readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565{
566 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000569 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 PyErr_NoMemory();
571 return -1;
572 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573 self->buf_size = 40;
574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 i = 0;
577 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000578 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000580 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 (self->buf[i] = getc(self->fp)) == '\n') {
582 self->buf[i + 1] = '\0';
583 *s = self->buf;
584 return i + 1;
585 }
586 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000587 bigger = self->buf_size << 1;
588 if (bigger <= 0) { /* overflow */
589 PyErr_NoMemory();
590 return -1;
591 }
592 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 if (!self->buf) {
594 PyErr_NoMemory();
595 return -1;
596 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000597 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 }
Tim Peters84e87f32001-03-17 04:50:51 +0000599}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000600
601
Martin v. Löwis18e16552006-02-15 17:27:45 +0000602static Py_ssize_t
603read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604{
605 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
608 PyErr_SetNone(PyExc_EOFError);
609 return -1;
610 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615}
616
617
Martin v. Löwis18e16552006-02-15 17:27:45 +0000618static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000619readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
625 return -1;
626 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631}
632
633
Martin v. Löwis18e16552006-02-15 17:27:45 +0000634static Py_ssize_t
635read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636{
637 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis18e16552006-02-15 17:27:45 +0000639 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000641 ARG_TUP(self, bytes);
642 if (self->arg) {
643 str = PyObject_Call(self->read, self->arg, NULL);
644 FREE_ARG_TUP(self);
645 }
646 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 Py_XDECREF(self->last_string);
649 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (! (*s = PyString_AsString(str))) return -1;
652 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653}
654
655
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000657readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658{
659 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
663 return -1;
664 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666 if ((str_size = PyString_Size(str)) < 0)
667 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 Py_XDECREF(self->last_string);
670 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 if (! (*s = PyString_AsString(str)))
673 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000676}
677
Tim Petersee1a53c2003-02-02 02:57:53 +0000678/* Copy the first n bytes from s into newly malloc'ed memory, plus a
679 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
680 * The caller is responsible for free()'ing the return value.
681 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000683pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684{
Tim Petersee1a53c2003-02-02 02:57:53 +0000685 char *r = (char *)malloc(n+1);
686 if (r == NULL)
687 return (char*)PyErr_NoMemory();
688 memcpy(r, s, n);
689 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691}
692
693
694static int
Tim Peterscba30e22003-02-01 06:24:36 +0000695get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696{
697 PyObject *value, *mv;
698 long c_value;
699 char s[30];
700 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 if (!( mv = PyDict_GetItem(self->memo, id))) {
703 PyErr_SetObject(PyExc_KeyError, id);
704 return -1;
705 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000706
Tim Peterscba30e22003-02-01 06:24:36 +0000707 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (!( PyInt_Check(value))) {
711 PyErr_SetString(PicklingError, "no int where int expected in memo");
712 return -1;
713 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000714 c_value = PyInt_AsLong(value);
715 if (c_value == -1 && PyErr_Occurred())
716 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if (!self->bin) {
719 s[0] = GET;
720 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
721 len = strlen(s);
722 }
723 else if (Pdata_Check(self->file)) {
724 if (write_other(self, NULL, 0) < 0) return -1;
725 PDATA_APPEND(self->file, mv, -1);
726 return 0;
727 }
728 else {
729 if (c_value < 256) {
730 s[0] = BINGET;
731 s[1] = (int)(c_value & 0xff);
732 len = 2;
733 }
734 else {
735 s[0] = LONG_BINGET;
736 s[1] = (int)(c_value & 0xff);
737 s[2] = (int)((c_value >> 8) & 0xff);
738 s[3] = (int)((c_value >> 16) & 0xff);
739 s[4] = (int)((c_value >> 24) & 0xff);
740 len = 5;
741 }
742 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000743
Tim Peters0bc93f52003-02-02 18:29:33 +0000744 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000745 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000746
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000747 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000749
Guido van Rossum60456fd1997-04-09 17:36:32 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751static int
Tim Peterscba30e22003-02-01 06:24:36 +0000752put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753{
Tim Peterscba30e22003-02-01 06:24:36 +0000754 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 return put2(self, ob);
758}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761static int
Tim Peterscba30e22003-02-01 06:24:36 +0000762put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763{
764 char c_str[30];
765 int p;
766 size_t len;
767 int res = -1;
768 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 if (self->fast)
771 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if ((p = PyDict_Size(self->memo)) < 0)
774 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000777 /* XXX Why?
778 * XXX And does "positive" really mean non-negative?
779 * XXX pickle.py starts with PUT index 0, not 1. This makes for
780 * XXX gratuitous differences between the pickling modules.
781 */
Tim Peterscba30e22003-02-01 06:24:36 +0000782 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Tim Peterscba30e22003-02-01 06:24:36 +0000784 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000786
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789
Tim Peterscba30e22003-02-01 06:24:36 +0000790 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 PyTuple_SET_ITEM(t, 0, memo_len);
794 Py_INCREF(memo_len);
795 PyTuple_SET_ITEM(t, 1, ob);
796 Py_INCREF(ob);
797
798 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
799 goto finally;
800
801 if (!self->bin) {
802 c_str[0] = PUT;
803 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
804 len = strlen(c_str);
805 }
806 else if (Pdata_Check(self->file)) {
807 if (write_other(self, NULL, 0) < 0) return -1;
808 PDATA_APPEND(self->file, memo_len, -1);
809 res=0; /* Job well done ;) */
810 goto finally;
811 }
812 else {
813 if (p >= 256) {
814 c_str[0] = LONG_BINPUT;
815 c_str[1] = (int)(p & 0xff);
816 c_str[2] = (int)((p >> 8) & 0xff);
817 c_str[3] = (int)((p >> 16) & 0xff);
818 c_str[4] = (int)((p >> 24) & 0xff);
819 len = 5;
820 }
821 else {
822 c_str[0] = BINPUT;
823 c_str[1] = p;
824 len = 2;
825 }
826 }
827
Tim Peters0bc93f52003-02-02 18:29:33 +0000828 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829 goto finally;
830
831 res = 0;
832
833 finally:
834 Py_XDECREF(py_ob_id);
835 Py_XDECREF(memo_len);
836 Py_XDECREF(t);
837
838 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000839}
840
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000841static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000842whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000844 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 PyObject *module = 0, *modules_dict = 0,
846 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000849 if (module)
850 return module;
851 if (PyErr_ExceptionMatches(PyExc_AttributeError))
852 PyErr_Clear();
853 else
854 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000855
Tim Peterscba30e22003-02-01 06:24:36 +0000856 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 i = 0;
860 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 global_name_attr = PyObject_GetAttr(module, global_name);
865 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000866 if (PyErr_ExceptionMatches(PyExc_AttributeError))
867 PyErr_Clear();
868 else
869 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 continue;
871 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (global_name_attr != global) {
874 Py_DECREF(global_name_attr);
875 continue;
876 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 break;
881 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 /* The following implements the rule in pickle.py added in 1.5
884 that used __main__ if no module is found. I don't actually
885 like this rule. jlf
886 */
887 if (!j) {
888 j=1;
889 name=__main___str;
890 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 Py_INCREF(name);
893 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000894}
895
896
Guido van Rossum60456fd1997-04-09 17:36:32 +0000897static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000898fast_save_enter(Picklerobject *self, PyObject *obj)
899{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000900 /* if fast_container < 0, we're doing an error exit. */
901 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
902 PyObject *key = NULL;
903 if (self->fast_memo == NULL) {
904 self->fast_memo = PyDict_New();
905 if (self->fast_memo == NULL) {
906 self->fast_container = -1;
907 return 0;
908 }
909 }
910 key = PyLong_FromVoidPtr(obj);
911 if (key == NULL)
912 return 0;
913 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000914 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000916 "fast mode: can't pickle cyclic objects "
917 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 obj->ob_type->tp_name, obj);
919 self->fast_container = -1;
920 return 0;
921 }
922 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000923 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 self->fast_container = -1;
925 return 0;
926 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000927 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000928 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000930}
931
Tim Peterscba30e22003-02-01 06:24:36 +0000932int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933fast_save_leave(Picklerobject *self, PyObject *obj)
934{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000935 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
936 PyObject *key = PyLong_FromVoidPtr(obj);
937 if (key == NULL)
938 return 0;
939 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000940 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 return 0;
942 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000943 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000944 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000945 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000946}
947
948static int
Tim Peterscba30e22003-02-01 06:24:36 +0000949save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000950{
951 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000952 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000955 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000956}
957
Guido van Rossum77f6a652002-04-03 22:41:51 +0000958static int
Tim Peterscba30e22003-02-01 06:24:36 +0000959save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000960{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000961 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000962 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000963 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964
Tim Peters3c67d792003-02-02 17:59:11 +0000965 if (self->proto >= 2) {
966 char opcode = l ? NEWTRUE : NEWFALSE;
967 if (self->write_func(self, &opcode, 1) < 0)
968 return -1;
969 }
970 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000971 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return 0;
973}
Tim Peters84e87f32001-03-17 04:50:51 +0000974
Guido van Rossum60456fd1997-04-09 17:36:32 +0000975static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000976save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977{
978 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000979 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000982#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 || l > 0x7fffffffL
984 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000985#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 ) {
987 /* Text-mode pickle, or long too big to fit in the 4-byte
988 * signed BININT format: store as a string.
989 */
990 c_str[0] = INT;
991 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000992 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000993 return -1;
994 }
995 else {
996 /* Binary pickle and l fits in a signed 4-byte int. */
997 c_str[1] = (int)( l & 0xff);
998 c_str[2] = (int)((l >> 8) & 0xff);
999 c_str[3] = (int)((l >> 16) & 0xff);
1000 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1003 if (c_str[2] == 0) {
1004 c_str[0] = BININT1;
1005 len = 2;
1006 }
1007 else {
1008 c_str[0] = BININT2;
1009 len = 3;
1010 }
1011 }
1012 else {
1013 c_str[0] = BININT;
1014 len = 5;
1015 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Tim Peters0bc93f52003-02-02 18:29:33 +00001017 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 return -1;
1019 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022}
1023
1024
1025static int
Tim Peterscba30e22003-02-01 06:24:36 +00001026save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001028 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001029 int res = -1;
1030 PyObject *repr = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001031 int val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Guido van Rossumddefaf32007-01-14 03:31:43 +00001034 if (val == -1 && PyErr_Occurred()) {
1035 /* out of range for int pickling */
1036 PyErr_Clear();
1037 }
1038 else
1039 return save_int(self, val);
1040
Tim Petersee1a53c2003-02-02 02:57:53 +00001041 if (self->proto >= 2) {
1042 /* Linear-time pickling. */
1043 size_t nbits;
1044 size_t nbytes;
1045 unsigned char *pdata;
1046 char c_str[5];
1047 int i;
1048 int sign = _PyLong_Sign(args);
1049
1050 if (sign == 0) {
1051 /* It's 0 -- an empty bytestring. */
1052 c_str[0] = LONG1;
1053 c_str[1] = 0;
1054 i = self->write_func(self, c_str, 2);
1055 if (i < 0) goto finally;
1056 res = 0;
1057 goto finally;
1058 }
1059 nbits = _PyLong_NumBits(args);
1060 if (nbits == (size_t)-1 && PyErr_Occurred())
1061 goto finally;
1062 /* How many bytes do we need? There are nbits >> 3 full
1063 * bytes of data, and nbits & 7 leftover bits. If there
1064 * are any leftover bits, then we clearly need another
1065 * byte. Wnat's not so obvious is that we *probably*
1066 * need another byte even if there aren't any leftovers:
1067 * the most-significant bit of the most-significant byte
1068 * acts like a sign bit, and it's usually got a sense
1069 * opposite of the one we need. The exception is longs
1070 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1071 * its own 256's-complement, so has the right sign bit
1072 * even without the extra byte. That's a pain to check
1073 * for in advance, though, so we always grab an extra
1074 * byte at the start, and cut it back later if possible.
1075 */
1076 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001077 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001078 PyErr_SetString(PyExc_OverflowError, "long too large "
1079 "to pickle");
1080 goto finally;
1081 }
1082 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1083 if (repr == NULL) goto finally;
1084 pdata = (unsigned char *)PyString_AS_STRING(repr);
1085 i = _PyLong_AsByteArray((PyLongObject *)args,
1086 pdata, nbytes,
1087 1 /* little endian */, 1 /* signed */);
1088 if (i < 0) goto finally;
1089 /* If the long is negative, this may be a byte more than
1090 * needed. This is so iff the MSB is all redundant sign
1091 * bits.
1092 */
1093 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1094 (pdata[nbytes - 2] & 0x80) != 0)
1095 --nbytes;
1096
1097 if (nbytes < 256) {
1098 c_str[0] = LONG1;
1099 c_str[1] = (char)nbytes;
1100 size = 2;
1101 }
1102 else {
1103 c_str[0] = LONG4;
1104 size = (int)nbytes;
1105 for (i = 1; i < 5; i++) {
1106 c_str[i] = (char)(size & 0xff);
1107 size >>= 8;
1108 }
1109 size = 5;
1110 }
1111 i = self->write_func(self, c_str, size);
1112 if (i < 0) goto finally;
1113 i = self->write_func(self, (char *)pdata, (int)nbytes);
1114 if (i < 0) goto finally;
1115 res = 0;
1116 goto finally;
1117 }
1118
1119 /* proto < 2: write the repr and newline. This is quadratic-time
1120 * (in the number of digits), in both directions.
1121 */
Tim Peterscba30e22003-02-01 06:24:36 +00001122 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 if ((size = PyString_Size(repr)) < 0)
1126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Tim Peters0bc93f52003-02-02 18:29:33 +00001128 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self,
1132 PyString_AS_STRING((PyStringObject *)repr),
1133 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Tim Peters0bc93f52003-02-02 18:29:33 +00001136 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 finally:
1142 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144}
1145
1146
1147static int
Tim Peterscba30e22003-02-01 06:24:36 +00001148save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149{
1150 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001154 str[0] = BINFLOAT;
1155 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001157 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 return -1;
1159 }
1160 else {
1161 char c_str[250];
1162 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1164 /* Extend the formatted string with a newline character */
1165 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Tim Peters0bc93f52003-02-02 18:29:33 +00001167 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 return -1;
1169 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172}
1173
1174
1175static int
Tim Peterscba30e22003-02-01 06:24:36 +00001176save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177{
1178 int size, len;
1179 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 if ((size = PyString_Size(args)) < 0)
1182 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if (!self->bin) {
1185 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001188
Tim Peterscba30e22003-02-01 06:24:36 +00001189 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 if ((len = PyString_Size(repr)) < 0)
1193 goto err;
1194 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peters0bc93f52003-02-02 18:29:33 +00001196 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Tim Peters0bc93f52003-02-02 18:29:33 +00001199 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Tim Peters0bc93f52003-02-02 18:29:33 +00001202 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001205 Py_XDECREF(repr);
1206 }
1207 else {
1208 int i;
1209 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if ((size = PyString_Size(args)) < 0)
1212 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if (size < 256) {
1215 c_str[0] = SHORT_BINSTRING;
1216 c_str[1] = size;
1217 len = 2;
1218 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001219 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 c_str[0] = BINSTRING;
1221 for (i = 1; i < 5; i++)
1222 c_str[i] = (int)(size >> ((i - 1) * 8));
1223 len = 5;
1224 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001225 else
1226 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Tim Peters0bc93f52003-02-02 18:29:33 +00001228 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 if (size > 128 && Pdata_Check(self->file)) {
1232 if (write_other(self, NULL, 0) < 0) return -1;
1233 PDATA_APPEND(self->file, args, -1);
1234 }
1235 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001236 if (self->write_func(self,
1237 PyString_AS_STRING(
1238 (PyStringObject *)args),
1239 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001240 return -1;
1241 }
1242 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 if (doput)
1245 if (put(self, args) < 0)
1246 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001248 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001250 err:
1251 Py_XDECREF(repr);
1252 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253}
1254
1255
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001256#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1258 backslash and newline characters to \uXXXX escapes. */
1259static PyObject *
1260modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1261{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262 PyObject *repr;
1263 char *p;
1264 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 repr = PyString_FromStringAndSize(NULL, 6 * size);
1269 if (repr == NULL)
1270 return NULL;
1271 if (size == 0)
1272 return repr;
1273
1274 p = q = PyString_AS_STRING(repr);
1275 while (size-- > 0) {
1276 Py_UNICODE ch = *s++;
1277 /* Map 16-bit characters to '\uxxxx' */
1278 if (ch >= 256 || ch == '\\' || ch == '\n') {
1279 *p++ = '\\';
1280 *p++ = 'u';
1281 *p++ = hexdigit[(ch >> 12) & 0xf];
1282 *p++ = hexdigit[(ch >> 8) & 0xf];
1283 *p++ = hexdigit[(ch >> 4) & 0xf];
1284 *p++ = hexdigit[ch & 15];
1285 }
1286 /* Copy everything else as-is */
1287 else
1288 *p++ = (char) ch;
1289 }
1290 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001291 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001292 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001293}
1294
1295
Guido van Rossum60456fd1997-04-09 17:36:32 +00001296static int
Tim Peterscba30e22003-02-01 06:24:36 +00001297save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001299 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if (!PyUnicode_Check(args))
1303 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (!self->bin) {
1306 char *repr_str;
1307 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 repr = modified_EncodeRawUnicodeEscape(
1310 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001311 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if ((len = PyString_Size(repr)) < 0)
1315 goto err;
1316 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001317
Tim Peters0bc93f52003-02-02 18:29:33 +00001318 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001319 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Tim Peters0bc93f52003-02-02 18:29:33 +00001321 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Tim Peters0bc93f52003-02-02 18:29:33 +00001324 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 Py_XDECREF(repr);
1328 }
1329 else {
1330 int i;
1331 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001332
Tim Peterscba30e22003-02-01 06:24:36 +00001333 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 if ((size = PyString_Size(repr)) < 0)
1337 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 if (size > INT_MAX)
1339 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 c_str[0] = BINUNICODE;
1342 for (i = 1; i < 5; i++)
1343 c_str[i] = (int)(size >> ((i - 1) * 8));
1344 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001345
Tim Peters0bc93f52003-02-02 18:29:33 +00001346 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if (size > 128 && Pdata_Check(self->file)) {
1350 if (write_other(self, NULL, 0) < 0)
1351 goto err;
1352 PDATA_APPEND(self->file, repr, -1);
1353 }
1354 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001355 if (self->write_func(self, PyString_AS_STRING(repr),
1356 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 goto err;
1358 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 Py_DECREF(repr);
1361 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 if (doput)
1364 if (put(self, args) < 0)
1365 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 err:
1370 Py_XDECREF(repr);
1371 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001373#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001374
Tim Peters1d63c9f2003-02-02 20:29:39 +00001375/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1376static int
Tim Peters67920142003-02-05 03:46:17 +00001377store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001378{
1379 int i;
1380 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001381
Tim Peters1d63c9f2003-02-02 20:29:39 +00001382 assert(PyTuple_Size(t) == len);
1383
1384 for (i = 0; i < len; i++) {
1385 PyObject *element = PyTuple_GET_ITEM(t, i);
1386
1387 if (element == NULL)
1388 goto finally;
1389 if (save(self, element, 0) < 0)
1390 goto finally;
1391 }
1392 res = 0;
1393
1394 finally:
1395 return res;
1396}
1397
1398/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1399 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001400 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001401 * (a tuple can be reached from itself), and that requires some subtle
1402 * magic so that it works in all cases. IOW, this is a long routine.
1403 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404static int
Tim Peterscba30e22003-02-01 06:24:36 +00001405save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001407 PyObject *py_tuple_id = NULL;
1408 int len, i;
1409 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001412 static char pop = POP;
1413 static char pop_mark = POP_MARK;
1414 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 if ((len = PyTuple_Size(args)) < 0)
1417 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418
Tim Peters1d63c9f2003-02-02 20:29:39 +00001419 if (len == 0) {
1420 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001421
Tim Peters1d63c9f2003-02-02 20:29:39 +00001422 if (self->proto) {
1423 c_str[0] = EMPTY_TUPLE;
1424 len = 1;
1425 }
1426 else {
1427 c_str[0] = MARK;
1428 c_str[1] = TUPLE;
1429 len = 2;
1430 }
1431 if (self->write_func(self, c_str, len) >= 0)
1432 res = 0;
1433 /* Don't memoize an empty tuple. */
1434 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436
Tim Peters1d63c9f2003-02-02 20:29:39 +00001437 /* A non-empty tuple. */
1438
1439 /* id(tuple) isn't in the memo now. If it shows up there after
1440 * saving the tuple elements, the tuple must be recursive, in
1441 * which case we'll pop everything we put on the stack, and fetch
1442 * its value from the memo.
1443 */
1444 py_tuple_id = PyLong_FromVoidPtr(args);
1445 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447
Tim Peters1d63c9f2003-02-02 20:29:39 +00001448 if (len <= 3 && self->proto >= 2) {
1449 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001450 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001453 /* pop the len elements */
1454 for (i = 0; i < len; ++i)
1455 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 if (get(self, py_tuple_id) < 0)
1459 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 res = 0;
1461 goto finally;
1462 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001463 /* Not recursive. */
1464 if (self->write_func(self, len2opcode + len, 1) < 0)
1465 goto finally;
1466 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Tim Peters1d63c9f2003-02-02 20:29:39 +00001469 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1470 * Generate MARK elt1 elt2 ... TUPLE
1471 */
1472 if (self->write_func(self, &MARKv, 1) < 0)
1473 goto finally;
1474
Tim Peters67920142003-02-05 03:46:17 +00001475 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001476 goto finally;
1477
1478 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1479 /* pop the stack stuff we pushed */
1480 if (self->bin) {
1481 if (self->write_func(self, &pop_mark, 1) < 0)
1482 goto finally;
1483 }
1484 else {
1485 /* Note that we pop one more than len, to remove
1486 * the MARK too.
1487 */
1488 for (i = 0; i <= len; i++)
1489 if (self->write_func(self, &pop, 1) < 0)
1490 goto finally;
1491 }
1492 /* fetch from memo */
1493 if (get(self, py_tuple_id) >= 0)
1494 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 goto finally;
1496 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497
Tim Peters1d63c9f2003-02-02 20:29:39 +00001498 /* Not recursive. */
1499 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001501
Tim Peters1d63c9f2003-02-02 20:29:39 +00001502 memoize:
1503 if (put(self, args) >= 0)
1504 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 finally:
1507 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509}
1510
Tim Peters1092d642003-02-11 21:06:20 +00001511/* iter is an iterator giving items, and we batch up chunks of
1512 * MARK item item ... item APPENDS
1513 * opcode sequences. Calling code should have arranged to first create an
1514 * empty list, or list-like object, for the APPENDS to operate on.
1515 * Returns 0 on success, <0 on error.
1516 */
1517static int
1518batch_list(Picklerobject *self, PyObject *iter)
1519{
1520 PyObject *obj;
1521 PyObject *slice[BATCHSIZE];
1522 int i, n;
1523
1524 static char append = APPEND;
1525 static char appends = APPENDS;
1526
1527 assert(iter != NULL);
1528
1529 if (self->proto == 0) {
1530 /* APPENDS isn't available; do one at a time. */
1531 for (;;) {
1532 obj = PyIter_Next(iter);
1533 if (obj == NULL) {
1534 if (PyErr_Occurred())
1535 return -1;
1536 break;
1537 }
1538 i = save(self, obj, 0);
1539 Py_DECREF(obj);
1540 if (i < 0)
1541 return -1;
1542 if (self->write_func(self, &append, 1) < 0)
1543 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001544 }
1545 return 0;
1546 }
1547
1548 /* proto > 0: write in batches of BATCHSIZE. */
1549 do {
1550 /* Get next group of (no more than) BATCHSIZE elements. */
1551 for (n = 0; n < BATCHSIZE; ++n) {
1552 obj = PyIter_Next(iter);
1553 if (obj == NULL) {
1554 if (PyErr_Occurred())
1555 goto BatchFailed;
1556 break;
1557 }
1558 slice[n] = obj;
1559 }
1560
1561 if (n > 1) {
1562 /* Pump out MARK, slice[0:n], APPENDS. */
1563 if (self->write_func(self, &MARKv, 1) < 0)
1564 goto BatchFailed;
1565 for (i = 0; i < n; ++i) {
1566 if (save(self, slice[i], 0) < 0)
1567 goto BatchFailed;
1568 }
1569 if (self->write_func(self, &appends, 1) < 0)
1570 goto BatchFailed;
1571 }
1572 else if (n == 1) {
1573 if (save(self, slice[0], 0) < 0)
1574 goto BatchFailed;
1575 if (self->write_func(self, &append, 1) < 0)
1576 goto BatchFailed;
1577 }
1578
1579 for (i = 0; i < n; ++i) {
1580 Py_DECREF(slice[i]);
1581 }
Tim Peters90975f12003-02-12 05:28:58 +00001582 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001583 return 0;
1584
1585BatchFailed:
1586 while (--n >= 0) {
1587 Py_DECREF(slice[n]);
1588 }
1589 return -1;
1590}
1591
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592static int
Tim Peterscba30e22003-02-01 06:24:36 +00001593save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594{
Tim Peters1092d642003-02-11 21:06:20 +00001595 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001597 int len;
1598 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 if (self->fast && !fast_save_enter(self, args))
1601 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001602
Tim Peters1092d642003-02-11 21:06:20 +00001603 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 if (self->bin) {
1605 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001606 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 }
1608 else {
1609 s[0] = MARK;
1610 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001611 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001613
Tim Peters1092d642003-02-11 21:06:20 +00001614 if (self->write_func(self, s, len) < 0)
1615 goto finally;
1616
1617 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if ((len = PyList_Size(args)) < 0)
1619 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001620
Tim Peters1092d642003-02-11 21:06:20 +00001621 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001623 if (put(self, args) >= 0)
1624 res = 0;
1625 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 }
Tim Peters90975f12003-02-12 05:28:58 +00001627 if (put2(self, args) < 0)
1628 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001629
Tim Peters1092d642003-02-11 21:06:20 +00001630 /* Materialize the list elements. */
1631 iter = PyObject_GetIter(args);
1632 if (iter == NULL)
1633 goto finally;
1634 res = batch_list(self, iter);
1635 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 finally:
1638 if (self->fast && !fast_save_leave(self, args))
1639 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001642}
1643
1644
Tim Peters42f08ac2003-02-11 22:43:24 +00001645/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1646 * MARK key value ... key value SETITEMS
1647 * opcode sequences. Calling code should have arranged to first create an
1648 * empty dict, or dict-like object, for the SETITEMS to operate on.
1649 * Returns 0 on success, <0 on error.
1650 *
1651 * This is very much like batch_list(). The difference between saving
1652 * elements directly, and picking apart two-tuples, is so long-winded at
1653 * the C level, though, that attempts to combine these routines were too
1654 * ugly to bear.
1655 */
1656static int
1657batch_dict(Picklerobject *self, PyObject *iter)
1658{
1659 PyObject *p;
1660 PyObject *slice[BATCHSIZE];
1661 int i, n;
1662
1663 static char setitem = SETITEM;
1664 static char setitems = SETITEMS;
1665
1666 assert(iter != NULL);
1667
1668 if (self->proto == 0) {
1669 /* SETITEMS isn't available; do one at a time. */
1670 for (;;) {
1671 p = PyIter_Next(iter);
1672 if (p == NULL) {
1673 if (PyErr_Occurred())
1674 return -1;
1675 break;
1676 }
1677 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1678 PyErr_SetString(PyExc_TypeError, "dict items "
1679 "iterator must return 2-tuples");
1680 return -1;
1681 }
1682 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1683 if (i >= 0)
1684 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1685 Py_DECREF(p);
1686 if (i < 0)
1687 return -1;
1688 if (self->write_func(self, &setitem, 1) < 0)
1689 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001690 }
1691 return 0;
1692 }
1693
1694 /* proto > 0: write in batches of BATCHSIZE. */
1695 do {
1696 /* Get next group of (no more than) BATCHSIZE elements. */
1697 for (n = 0; n < BATCHSIZE; ++n) {
1698 p = PyIter_Next(iter);
1699 if (p == NULL) {
1700 if (PyErr_Occurred())
1701 goto BatchFailed;
1702 break;
1703 }
1704 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1705 PyErr_SetString(PyExc_TypeError, "dict items "
1706 "iterator must return 2-tuples");
1707 goto BatchFailed;
1708 }
1709 slice[n] = p;
1710 }
1711
1712 if (n > 1) {
1713 /* Pump out MARK, slice[0:n], SETITEMS. */
1714 if (self->write_func(self, &MARKv, 1) < 0)
1715 goto BatchFailed;
1716 for (i = 0; i < n; ++i) {
1717 p = slice[i];
1718 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1719 goto BatchFailed;
1720 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1721 goto BatchFailed;
1722 }
1723 if (self->write_func(self, &setitems, 1) < 0)
1724 goto BatchFailed;
1725 }
1726 else if (n == 1) {
1727 p = slice[0];
1728 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1729 goto BatchFailed;
1730 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1731 goto BatchFailed;
1732 if (self->write_func(self, &setitem, 1) < 0)
1733 goto BatchFailed;
1734 }
1735
1736 for (i = 0; i < n; ++i) {
1737 Py_DECREF(slice[i]);
1738 }
Tim Peters90975f12003-02-12 05:28:58 +00001739 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001740 return 0;
1741
1742BatchFailed:
1743 while (--n >= 0) {
1744 Py_DECREF(slice[n]);
1745 }
1746 return -1;
1747}
1748
Guido van Rossum60456fd1997-04-09 17:36:32 +00001749static int
Tim Peterscba30e22003-02-01 06:24:36 +00001750save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751{
Tim Peters42f08ac2003-02-11 22:43:24 +00001752 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001754 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001755 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 if (self->fast && !fast_save_enter(self, args))
1758 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001759
Tim Peters42f08ac2003-02-11 22:43:24 +00001760 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (self->bin) {
1762 s[0] = EMPTY_DICT;
1763 len = 1;
1764 }
1765 else {
1766 s[0] = MARK;
1767 s[1] = DICT;
1768 len = 2;
1769 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Tim Peters0bc93f52003-02-02 18:29:33 +00001771 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Tim Peters42f08ac2003-02-11 22:43:24 +00001774 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 if ((len = PyDict_Size(args)) < 0)
1776 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001779 if (put(self, args) >= 0)
1780 res = 0;
1781 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 }
Tim Peters90975f12003-02-12 05:28:58 +00001783 if (put2(self, args) < 0)
1784 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Tim Peters42f08ac2003-02-11 22:43:24 +00001786 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001787 items = PyObject_CallMethod(args, "items", "()");
1788 if (items == NULL)
1789 goto finally;
1790 iter = PyObject_GetIter(items);
1791 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001792 if (iter == NULL)
1793 goto finally;
1794 res = batch_dict(self, iter);
1795 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 finally:
1798 if (self->fast && !fast_save_leave(self, args))
1799 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802}
1803
1804
Guido van Rossum60456fd1997-04-09 17:36:32 +00001805static int
Tim Peterscba30e22003-02-01 06:24:36 +00001806save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001808 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 char *name_str, *module_str;
1810 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 if (name) {
1815 global_name = name;
1816 Py_INCREF(global_name);
1817 }
1818 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001819 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 goto finally;
1821 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001822
Tim Peterscba30e22003-02-01 06:24:36 +00001823 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 if ((module_size = PyString_Size(module)) < 0 ||
1827 (name_size = PyString_Size(global_name)) < 0)
1828 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 module_str = PyString_AS_STRING((PyStringObject *)module);
1831 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001832
Guido van Rossum75bfd052002-12-24 18:10:07 +00001833 /* XXX This can be doing a relative import. Clearly it shouldn't,
1834 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 mod = PyImport_ImportModule(module_str);
1836 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001838 "Can't pickle %s: import of module %s "
1839 "failed",
1840 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001841 goto finally;
1842 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001843 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 if (klass == NULL) {
1845 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001846 "Can't pickle %s: attribute lookup %s.%s "
1847 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 "OSS", args, module, global_name);
1849 goto finally;
1850 }
1851 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001852 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001854 "Can't pickle %s: it's not the same object "
1855 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001856 "OSS", args, module, global_name);
1857 goto finally;
1858 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001859 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001860
Tim Peters731098b2003-02-04 20:56:09 +00001861 if (self->proto >= 2) {
1862 /* See whether this is in the extension registry, and if
1863 * so generate an EXT opcode.
1864 */
1865 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001866 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001867 char c_str[5];
1868 int n;
1869
1870 PyTuple_SET_ITEM(two_tuple, 0, module);
1871 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1872 py_code = PyDict_GetItem(extension_registry, two_tuple);
1873 if (py_code == NULL)
1874 goto gen_global; /* not registered */
1875
1876 /* Verify py_code has the right type and value. */
1877 if (!PyInt_Check(py_code)) {
1878 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001879 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001880 "OO", args, py_code);
1881 goto finally;
1882 }
1883 code = PyInt_AS_LONG(py_code);
1884 if (code <= 0 || code > 0x7fffffffL) {
1885 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1886 "extension code %ld is out of range",
1887 "Ol", args, code);
1888 goto finally;
1889 }
1890
1891 /* Generate an EXT opcode. */
1892 if (code <= 0xff) {
1893 c_str[0] = EXT1;
1894 c_str[1] = (char)code;
1895 n = 2;
1896 }
1897 else if (code <= 0xffff) {
1898 c_str[0] = EXT2;
1899 c_str[1] = (char)(code & 0xff);
1900 c_str[2] = (char)((code >> 8) & 0xff);
1901 n = 3;
1902 }
1903 else {
1904 c_str[0] = EXT4;
1905 c_str[1] = (char)(code & 0xff);
1906 c_str[2] = (char)((code >> 8) & 0xff);
1907 c_str[3] = (char)((code >> 16) & 0xff);
1908 c_str[4] = (char)((code >> 24) & 0xff);
1909 n = 5;
1910 }
1911
1912 if (self->write_func(self, c_str, n) >= 0)
1913 res = 0;
1914 goto finally; /* and don't memoize */
1915 }
1916
1917 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001918 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Tim Peters0bc93f52003-02-02 18:29:33 +00001921 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Tim Peters0bc93f52003-02-02 18:29:33 +00001924 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001926
Tim Peters0bc93f52003-02-02 18:29:33 +00001927 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Tim Peters0bc93f52003-02-02 18:29:33 +00001930 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 if (put(self, args) < 0)
1934 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 finally:
1939 Py_XDECREF(module);
1940 Py_XDECREF(global_name);
1941 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944}
1945
Guido van Rossum60456fd1997-04-09 17:36:32 +00001946static int
Tim Peterscba30e22003-02-01 06:24:36 +00001947save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948{
1949 PyObject *pid = 0;
1950 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001952 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 Py_INCREF(args);
1955 ARG_TUP(self, args);
1956 if (self->arg) {
1957 pid = PyObject_Call(f, self->arg, NULL);
1958 FREE_ARG_TUP(self);
1959 }
1960 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 if (pid != Py_None) {
1963 if (!self->bin) {
1964 if (!PyString_Check(pid)) {
1965 PyErr_SetString(PicklingError,
1966 "persistent id must be string");
1967 goto finally;
1968 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001969
Tim Peters0bc93f52003-02-02 18:29:33 +00001970 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 if ((size = PyString_Size(pid)) < 0)
1974 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Tim Peters0bc93f52003-02-02 18:29:33 +00001976 if (self->write_func(self,
1977 PyString_AS_STRING(
1978 (PyStringObject *)pid),
1979 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Tim Peters0bc93f52003-02-02 18:29:33 +00001982 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 res = 1;
1986 goto finally;
1987 }
1988 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001989 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 res = -1;
1991 else
1992 res = 1;
1993 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001995 goto finally;
1996 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 finally:
2001 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002003 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002004}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002005
Tim Peters71fcda52003-02-14 23:05:28 +00002006/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2007 * appropriate __reduce__ method for ob.
2008 */
Tim Peters84e87f32001-03-17 04:50:51 +00002009static int
Tim Peters71fcda52003-02-14 23:05:28 +00002010save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011{
Tim Peters71fcda52003-02-14 23:05:28 +00002012 PyObject *callable;
2013 PyObject *argtup;
2014 PyObject *state = NULL;
2015 PyObject *listitems = NULL;
2016 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002017
Tim Peters71fcda52003-02-14 23:05:28 +00002018 int use_newobj = self->proto >= 2;
2019
2020 static char reduce = REDUCE;
2021 static char build = BUILD;
2022 static char newobj = NEWOBJ;
2023
2024 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2025 &callable,
2026 &argtup,
2027 &state,
2028 &listitems,
2029 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002030 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002031
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002032 if (!PyTuple_Check(argtup)) {
2033 PyErr_SetString(PicklingError,
2034 "args from reduce() should be a tuple");
2035 return -1;
2036 }
2037
Tim Peters71fcda52003-02-14 23:05:28 +00002038 if (state == Py_None)
2039 state = NULL;
2040 if (listitems == Py_None)
2041 listitems = NULL;
2042 if (dictitems == Py_None)
2043 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002044
Tim Peters71fcda52003-02-14 23:05:28 +00002045 /* Protocol 2 special case: if callable's name is __newobj__, use
2046 * NEWOBJ. This consumes a lot of code.
2047 */
2048 if (use_newobj) {
2049 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002050
Tim Peters71fcda52003-02-14 23:05:28 +00002051 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002052 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2053 PyErr_Clear();
2054 else
2055 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002056 use_newobj = 0;
2057 }
2058 else {
2059 use_newobj = PyString_Check(temp) &&
2060 strcmp(PyString_AS_STRING(temp),
2061 "__newobj__") == 0;
2062 Py_DECREF(temp);
2063 }
2064 }
2065 if (use_newobj) {
2066 PyObject *cls;
2067 PyObject *newargtup;
2068 int n, i;
2069
2070 /* Sanity checks. */
2071 n = PyTuple_Size(argtup);
2072 if (n < 1) {
2073 PyErr_SetString(PicklingError, "__newobj__ arglist "
2074 "is empty");
2075 return -1;
2076 }
2077
2078 cls = PyTuple_GET_ITEM(argtup, 0);
2079 if (! PyObject_HasAttrString(cls, "__new__")) {
2080 PyErr_SetString(PicklingError, "args[0] from "
2081 "__newobj__ args has no __new__");
2082 return -1;
2083 }
2084
2085 /* XXX How could ob be NULL? */
2086 if (ob != NULL) {
2087 PyObject *ob_dot_class;
2088
2089 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002090 if (ob_dot_class == NULL) {
2091 if (PyErr_ExceptionMatches(
2092 PyExc_AttributeError))
2093 PyErr_Clear();
2094 else
2095 return -1;
2096 }
Tim Peters71fcda52003-02-14 23:05:28 +00002097 i = ob_dot_class != cls; /* true iff a problem */
2098 Py_XDECREF(ob_dot_class);
2099 if (i) {
2100 PyErr_SetString(PicklingError, "args[0] from "
2101 "__newobj__ args has the wrong class");
2102 return -1;
2103 }
2104 }
2105
2106 /* Save the class and its __new__ arguments. */
2107 if (save(self, cls, 0) < 0)
2108 return -1;
2109
2110 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2111 if (newargtup == NULL)
2112 return -1;
2113 for (i = 1; i < n; ++i) {
2114 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2115 Py_INCREF(temp);
2116 PyTuple_SET_ITEM(newargtup, i-1, temp);
2117 }
2118 i = save(self, newargtup, 0) < 0;
2119 Py_DECREF(newargtup);
2120 if (i < 0)
2121 return -1;
2122
2123 /* Add NEWOBJ opcode. */
2124 if (self->write_func(self, &newobj, 1) < 0)
2125 return -1;
2126 }
2127 else {
2128 /* Not using NEWOBJ. */
2129 if (save(self, callable, 0) < 0 ||
2130 save(self, argtup, 0) < 0 ||
2131 self->write_func(self, &reduce, 1) < 0)
2132 return -1;
2133 }
2134
2135 /* Memoize. */
2136 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 if (ob != NULL) {
2138 if (state && !PyDict_Check(state)) {
2139 if (put2(self, ob) < 0)
2140 return -1;
2141 }
Tim Peters71fcda52003-02-14 23:05:28 +00002142 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002143 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 }
Tim Peters84e87f32001-03-17 04:50:51 +00002145
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Tim Peters71fcda52003-02-14 23:05:28 +00002147 if (listitems && batch_list(self, listitems) < 0)
2148 return -1;
2149
2150 if (dictitems && batch_dict(self, dictitems) < 0)
2151 return -1;
2152
2153 if (state) {
2154 if (save(self, state, 0) < 0 ||
2155 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002156 return -1;
2157 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002159 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002160}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002161
Guido van Rossum60456fd1997-04-09 17:36:32 +00002162static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002163save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164{
2165 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002166 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2167 PyObject *arg_tup;
2168 int res = -1;
2169 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002170
Martin v. Löwis5a395302002-08-04 08:20:23 +00002171 if (self->nesting++ > Py_GetRecursionLimit()){
2172 PyErr_SetString(PyExc_RuntimeError,
2173 "maximum recursion depth exceeded");
2174 goto finally;
2175 }
2176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002177 if (!pers_save && self->pers_func) {
2178 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2179 res = tmp;
2180 goto finally;
2181 }
2182 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 if (args == Py_None) {
2185 res = save_none(self, args);
2186 goto finally;
2187 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002192 case 'b':
2193 if (args == Py_False || args == Py_True) {
2194 res = save_bool(self, args);
2195 goto finally;
2196 }
2197 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002198 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002199 if (type == &PyLong_Type) {
2200 res = save_long(self, args);
2201 goto finally;
2202 }
2203 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002204
Guido van Rossum60456fd1997-04-09 17:36:32 +00002205 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002206 if (type == &PyFloat_Type) {
2207 res = save_float(self, args);
2208 goto finally;
2209 }
2210 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002211
Guido van Rossum60456fd1997-04-09 17:36:32 +00002212 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002213 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2214 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002215 goto finally;
2216 }
2217 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002218
Guido van Rossum60456fd1997-04-09 17:36:32 +00002219 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002220 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2221 res = save_string(self, args, 0);
2222 goto finally;
2223 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002224
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002225#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002226 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002227 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2228 res = save_unicode(self, args, 0);
2229 goto finally;
2230 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002231#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002235 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002238 if (PyDict_GetItem(self->memo, py_ob_id)) {
2239 if (get(self, py_ob_id) < 0)
2240 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002242 res = 0;
2243 goto finally;
2244 }
2245 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002247 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002248 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002249 if (type == &PyString_Type) {
2250 res = save_string(self, args, 1);
2251 goto finally;
2252 }
2253 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002254
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002255#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002256 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 if (type == &PyUnicode_Type) {
2258 res = save_unicode(self, args, 1);
2259 goto finally;
2260 }
2261 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002262#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002263
Guido van Rossum60456fd1997-04-09 17:36:32 +00002264 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002265 if (type == &PyTuple_Type) {
2266 res = save_tuple(self, args);
2267 goto finally;
2268 }
2269 if (type == &PyType_Type) {
2270 res = save_global(self, args, NULL);
2271 goto finally;
2272 }
2273 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002274
Guido van Rossum60456fd1997-04-09 17:36:32 +00002275 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276 if (type == &PyList_Type) {
2277 res = save_list(self, args);
2278 goto finally;
2279 }
2280 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281
2282 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002283 if (type == &PyDict_Type) {
2284 res = save_dict(self, args);
2285 goto finally;
2286 }
2287 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002288
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002289 case 'i':
2290 break;
2291
2292 case 'c':
2293 break;
2294
Guido van Rossum60456fd1997-04-09 17:36:32 +00002295 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 if (type == &PyFunction_Type) {
2297 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002298 if (res && PyErr_ExceptionMatches(PickleError)) {
2299 /* fall back to reduce */
2300 PyErr_Clear();
2301 break;
2302 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002303 goto finally;
2304 }
2305 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
2307 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 if (type == &PyCFunction_Type) {
2309 res = save_global(self, args, NULL);
2310 goto finally;
2311 }
2312 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 if (!pers_save && self->inst_pers_func) {
2315 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2316 res = tmp;
2317 goto finally;
2318 }
2319 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320
Jeremy Hylton39c61162002-07-16 19:47:43 +00002321 if (PyType_IsSubtype(type, &PyType_Type)) {
2322 res = save_global(self, args, NULL);
2323 goto finally;
2324 }
2325
Guido van Rossumb289b872003-02-19 01:45:13 +00002326 /* Get a reduction callable, and call it. This may come from
2327 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2328 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002329 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002330 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2331 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002333 Py_INCREF(args);
2334 ARG_TUP(self, args);
2335 if (self->arg) {
2336 t = PyObject_Call(__reduce__, self->arg, NULL);
2337 FREE_ARG_TUP(self);
2338 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002339 }
2340 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002341 /* Check for a __reduce_ex__ method. */
2342 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2343 if (__reduce__ != NULL) {
2344 t = PyInt_FromLong(self->proto);
2345 if (t != NULL) {
2346 ARG_TUP(self, t);
2347 t = NULL;
2348 if (self->arg) {
2349 t = PyObject_Call(__reduce__,
2350 self->arg, NULL);
2351 FREE_ARG_TUP(self);
2352 }
2353 }
2354 }
2355 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002356 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2357 PyErr_Clear();
2358 else
2359 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002360 /* Check for a __reduce__ method. */
2361 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2362 if (__reduce__ != NULL) {
2363 t = PyObject_Call(__reduce__,
2364 empty_tuple, NULL);
2365 }
2366 else {
2367 PyErr_SetObject(UnpickleableError, args);
2368 goto finally;
2369 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002372
Tim Peters71fcda52003-02-14 23:05:28 +00002373 if (t == NULL)
2374 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002375
Tim Peters71fcda52003-02-14 23:05:28 +00002376 if (PyString_Check(t)) {
2377 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002378 goto finally;
2379 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002380
Tim Peters71fcda52003-02-14 23:05:28 +00002381 if (! PyTuple_Check(t)) {
2382 cPickle_ErrFormat(PicklingError, "Value returned by "
2383 "%s must be string or tuple",
2384 "O", __reduce__);
2385 goto finally;
2386 }
2387
2388 size = PyTuple_Size(t);
2389 if (size < 2 || size > 5) {
2390 cPickle_ErrFormat(PicklingError, "tuple returned by "
2391 "%s must contain 2 through 5 elements",
2392 "O", __reduce__);
2393 goto finally;
2394 }
2395
2396 arg_tup = PyTuple_GET_ITEM(t, 1);
2397 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2398 cPickle_ErrFormat(PicklingError, "Second element of "
2399 "tuple returned by %s must be a tuple",
2400 "O", __reduce__);
2401 goto finally;
2402 }
2403
2404 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002407 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 Py_XDECREF(py_ob_id);
2409 Py_XDECREF(__reduce__);
2410 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002413}
2414
2415
2416static int
Tim Peterscba30e22003-02-01 06:24:36 +00002417dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418{
2419 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002420
Tim Peters4190fb82003-02-02 16:09:05 +00002421 if (self->proto >= 2) {
2422 char bytes[2];
2423
2424 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002425 assert(self->proto >= 0 && self->proto < 256);
2426 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002427 if (self->write_func(self, bytes, 2) < 0)
2428 return -1;
2429 }
2430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 if (save(self, args, 0) < 0)
2432 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002433
Tim Peters4190fb82003-02-02 16:09:05 +00002434 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002435 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
Tim Peters4190fb82003-02-02 16:09:05 +00002437 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002441}
2442
2443static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002444Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445{
Tim Peterscba30e22003-02-01 06:24:36 +00002446 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 PyDict_Clear(self->memo);
2448 Py_INCREF(Py_None);
2449 return Py_None;
2450}
2451
2452static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002453Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454{
2455 int l, i, rsize, ssize, clear=1, lm;
2456 long ik;
2457 PyObject *k, *r;
2458 char *s, *p, *have_get;
2459 Pdata *data;
2460
2461 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002462 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 return NULL;
2464
2465 /* Check to make sure we are based on a list */
2466 if (! Pdata_Check(self->file)) {
2467 PyErr_SetString(PicklingError,
2468 "Attempt to getvalue() a non-list-based pickler");
2469 return NULL;
2470 }
2471
2472 /* flush write buffer */
2473 if (write_other(self, NULL, 0) < 0) return NULL;
2474
2475 data=(Pdata*)self->file;
2476 l=data->length;
2477
2478 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002479 lm = PyDict_Size(self->memo);
2480 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002482 have_get = malloc(lm);
2483 if (have_get == NULL) return PyErr_NoMemory();
2484 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485
2486 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002487 for (rsize = 0, i = l; --i >= 0; ) {
2488 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489
Tim Petersac5687a2003-02-02 18:08:34 +00002490 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492
2493 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002494 ik = PyInt_AsLong(k);
2495 if (ik == -1 && PyErr_Occurred())
2496 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002497 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002498 PyErr_SetString(PicklingError,
2499 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002500 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 }
Tim Petersac5687a2003-02-02 18:08:34 +00002502 if (have_get[ik]) /* with matching get */
2503 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 }
2505
2506 else if (! (PyTuple_Check(k) &&
2507 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002508 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 ) {
2510 PyErr_SetString(PicklingError,
2511 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002512 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 }
2514
2515 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002516 ik = PyInt_AsLong(k);
2517 if (ik == -1 && PyErr_Occurred())
2518 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002519 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520 PyErr_SetString(PicklingError,
2521 "Invalid get data");
2522 return NULL;
2523 }
Tim Petersac5687a2003-02-02 18:08:34 +00002524 have_get[ik] = 1;
2525 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 }
2528
2529 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002530 r = PyString_FromStringAndSize(NULL, rsize);
2531 if (r == NULL) goto err;
2532 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002533
Tim Petersac5687a2003-02-02 18:08:34 +00002534 for (i = 0; i < l; i++) {
2535 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536
2537 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002538 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002540 p=PyString_AS_STRING((PyStringObject *)k);
2541 while (--ssize >= 0)
2542 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 }
2544 }
2545
2546 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002547 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2548 if (ik == -1 && PyErr_Occurred())
2549 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 if (ik < 256) {
2551 *s++ = BINGET;
2552 *s++ = (int)(ik & 0xff);
2553 }
2554 else {
2555 *s++ = LONG_BINGET;
2556 *s++ = (int)(ik & 0xff);
2557 *s++ = (int)((ik >> 8) & 0xff);
2558 *s++ = (int)((ik >> 16) & 0xff);
2559 *s++ = (int)((ik >> 24) & 0xff);
2560 }
2561 }
2562
2563 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002564 ik = PyLong_AsLong(k);
2565 if (ik == -1 && PyErr_Occurred())
2566 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567
2568 if (have_get[ik]) { /* with matching get */
2569 if (ik < 256) {
2570 *s++ = BINPUT;
2571 *s++ = (int)(ik & 0xff);
2572 }
2573 else {
2574 *s++ = LONG_BINPUT;
2575 *s++ = (int)(ik & 0xff);
2576 *s++ = (int)((ik >> 8) & 0xff);
2577 *s++ = (int)((ik >> 16) & 0xff);
2578 *s++ = (int)((ik >> 24) & 0xff);
2579 }
2580 }
2581 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002582 }
2583
2584 if (clear) {
2585 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002586 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 }
2588
2589 free(have_get);
2590 return r;
2591 err:
2592 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002593 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002594}
2595
2596static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002597Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598{
2599 PyObject *ob;
2600 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002601
Tim Peterscba30e22003-02-01 06:24:36 +00002602 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605 if (dump(self, ob) < 0)
2606 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610 /* XXX Why does dump() return self? */
2611 Py_INCREF(self);
2612 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002613}
2614
2615
Tim Peterscba30e22003-02-01 06:24:36 +00002616static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002617{
Neal Norwitzb0493252002-03-31 14:44:22 +00002618 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002619 PyDoc_STR("dump(object) -- "
2620 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002621 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002622 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002623 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002624 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002625 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002626};
2627
2628
2629static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002630newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631{
2632 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002633
Tim Peters5bd2a792003-02-01 16:45:06 +00002634 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002635 proto = HIGHEST_PROTOCOL;
2636 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2638 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002639 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002641 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002642
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002643 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002644 if (self == NULL)
2645 return NULL;
2646 self->proto = proto;
2647 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 self->fp = NULL;
2649 self->write = NULL;
2650 self->memo = NULL;
2651 self->arg = NULL;
2652 self->pers_func = NULL;
2653 self->inst_pers_func = NULL;
2654 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002656 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 self->fast_container = 0;
2658 self->fast_memo = NULL;
2659 self->buf_size = 0;
2660 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002661
Tim Peters5bd2a792003-02-01 16:45:06 +00002662 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 if (file)
2664 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002665 else {
2666 file = Pdata_New();
2667 if (file == NULL)
2668 goto err;
2669 }
2670 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002671
Tim Peterscba30e22003-02-01 06:24:36 +00002672 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675 if (PyFile_Check(file)) {
2676 self->fp = PyFile_AsFile(file);
2677 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002678 PyErr_SetString(PyExc_ValueError,
2679 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680 goto err;
2681 }
2682 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002683 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 else if (PycStringIO_OutputCheck(file)) {
2685 self->write_func = write_cStringIO;
2686 }
2687 else if (file == Py_None) {
2688 self->write_func = write_none;
2689 }
2690 else {
2691 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002693 if (! Pdata_Check(file)) {
2694 self->write = PyObject_GetAttr(file, write_str);
2695 if (!self->write) {
2696 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002697 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 "argument must have 'write' "
2699 "attribute");
2700 goto err;
2701 }
2702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002703
Tim Peters5bd2a792003-02-01 16:45:06 +00002704 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2705 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706 PyErr_NoMemory();
2707 goto err;
2708 }
2709 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 if (PyEval_GetRestricted()) {
2712 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002713 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002714
Tim Peters5b7da392003-02-04 00:21:07 +00002715 if (m == NULL)
2716 goto err;
2717 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002719 if (self->dispatch_table == NULL)
2720 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 }
2722 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002723 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 Py_INCREF(dispatch_table);
2725 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002726 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002728 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002731 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002732 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002733}
2734
2735
2736static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002737get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002738{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002739 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002741 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002742
Tim Peters92c8bb32003-02-13 23:00:26 +00002743 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002744 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002745 * accepts Pickler() and Pickler(integer) too. The meaning then
2746 * is clear as mud, undocumented, and not supported by pickle.py.
2747 * I'm told Zope uses this, but I haven't traced into this code
2748 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002749 */
2750 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002752 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002753 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2754 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 return NULL;
2756 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002757 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002758}
2759
2760
2761static void
Tim Peterscba30e22003-02-01 06:24:36 +00002762Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002764 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002765 Py_XDECREF(self->write);
2766 Py_XDECREF(self->memo);
2767 Py_XDECREF(self->fast_memo);
2768 Py_XDECREF(self->arg);
2769 Py_XDECREF(self->file);
2770 Py_XDECREF(self->pers_func);
2771 Py_XDECREF(self->inst_pers_func);
2772 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002773 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002774 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002775}
2776
2777static int
2778Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2779{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002780 Py_VISIT(self->write);
2781 Py_VISIT(self->memo);
2782 Py_VISIT(self->fast_memo);
2783 Py_VISIT(self->arg);
2784 Py_VISIT(self->file);
2785 Py_VISIT(self->pers_func);
2786 Py_VISIT(self->inst_pers_func);
2787 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002788 return 0;
2789}
2790
2791static int
2792Pickler_clear(Picklerobject *self)
2793{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002794 Py_CLEAR(self->write);
2795 Py_CLEAR(self->memo);
2796 Py_CLEAR(self->fast_memo);
2797 Py_CLEAR(self->arg);
2798 Py_CLEAR(self->file);
2799 Py_CLEAR(self->pers_func);
2800 Py_CLEAR(self->inst_pers_func);
2801 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002802 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002803}
2804
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002805static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002806Pickler_get_pers_func(Picklerobject *p)
2807{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002808 if (p->pers_func == NULL)
2809 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2810 else
2811 Py_INCREF(p->pers_func);
2812 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002813}
2814
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002815static int
2816Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2817{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002818 if (v == NULL) {
2819 PyErr_SetString(PyExc_TypeError,
2820 "attribute deletion is not supported");
2821 return -1;
2822 }
2823 Py_XDECREF(p->pers_func);
2824 Py_INCREF(v);
2825 p->pers_func = v;
2826 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002827}
2828
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002829static int
2830Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2831{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 if (v == NULL) {
2833 PyErr_SetString(PyExc_TypeError,
2834 "attribute deletion is not supported");
2835 return -1;
2836 }
2837 Py_XDECREF(p->inst_pers_func);
2838 Py_INCREF(v);
2839 p->inst_pers_func = v;
2840 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002841}
2842
2843static PyObject *
2844Pickler_get_memo(Picklerobject *p)
2845{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002846 if (p->memo == NULL)
2847 PyErr_SetString(PyExc_AttributeError, "memo");
2848 else
2849 Py_INCREF(p->memo);
2850 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002851}
2852
2853static int
2854Pickler_set_memo(Picklerobject *p, PyObject *v)
2855{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 if (v == NULL) {
2857 PyErr_SetString(PyExc_TypeError,
2858 "attribute deletion is not supported");
2859 return -1;
2860 }
2861 if (!PyDict_Check(v)) {
2862 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2863 return -1;
2864 }
2865 Py_XDECREF(p->memo);
2866 Py_INCREF(v);
2867 p->memo = v;
2868 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002869}
2870
2871static PyObject *
2872Pickler_get_error(Picklerobject *p)
2873{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 /* why is this an attribute on the Pickler? */
2875 Py_INCREF(PicklingError);
2876 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002877}
2878
2879static PyMemberDef Pickler_members[] = {
2880 {"binary", T_INT, offsetof(Picklerobject, bin)},
2881 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002882 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002883};
2884
2885static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002886 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002887 (setter)Pickler_set_pers_func},
2888 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2889 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002890 {"PicklingError", (getter)Pickler_get_error, NULL},
2891 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002892};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002894PyDoc_STRVAR(Picklertype__doc__,
2895"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002896
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002897static PyTypeObject Picklertype = {
2898 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002899 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002900 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002901 sizeof(Picklerobject), /*tp_basicsize*/
2902 0,
2903 (destructor)Pickler_dealloc, /* tp_dealloc */
2904 0, /* tp_print */
2905 0, /* tp_getattr */
2906 0, /* tp_setattr */
2907 0, /* tp_compare */
2908 0, /* tp_repr */
2909 0, /* tp_as_number */
2910 0, /* tp_as_sequence */
2911 0, /* tp_as_mapping */
2912 0, /* tp_hash */
2913 0, /* tp_call */
2914 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002915 PyObject_GenericGetAttr, /* tp_getattro */
2916 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002917 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002918 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002919 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002920 (traverseproc)Pickler_traverse, /* tp_traverse */
2921 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002922 0, /* tp_richcompare */
2923 0, /* tp_weaklistoffset */
2924 0, /* tp_iter */
2925 0, /* tp_iternext */
2926 Pickler_methods, /* tp_methods */
2927 Pickler_members, /* tp_members */
2928 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002929};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002930
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002931static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002932find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933{
2934 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 if (fc) {
2937 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002938 PyErr_SetString(UnpicklingError, "Global and instance "
2939 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 return NULL;
2941 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002942 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2943 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946 module = PySys_GetObject("modules");
2947 if (module == NULL)
2948 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 module = PyDict_GetItem(module, py_module_name);
2951 if (module == NULL) {
2952 module = PyImport_Import(py_module_name);
2953 if (!module)
2954 return NULL;
2955 global = PyObject_GetAttr(module, py_global_name);
2956 Py_DECREF(module);
2957 }
2958 else
2959 global = PyObject_GetAttr(module, py_global_name);
2960 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002961}
2962
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002963static int
Tim Peterscba30e22003-02-01 06:24:36 +00002964marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965{
2966 if (self->num_marks < 1) {
2967 PyErr_SetString(UnpicklingError, "could not find MARK");
2968 return -1;
2969 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972}
2973
Tim Peters84e87f32001-03-17 04:50:51 +00002974
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975static int
Tim Peterscba30e22003-02-01 06:24:36 +00002976load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977{
2978 PDATA_APPEND(self->stack, Py_None, -1);
2979 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980}
2981
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002982static int
Tim Peterscba30e22003-02-01 06:24:36 +00002983bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984{
2985 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2986 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002987}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002988
2989static int
Tim Peterscba30e22003-02-01 06:24:36 +00002990load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991{
2992 PyObject *py_int = 0;
2993 char *endptr, *s;
2994 int len, res = -1;
2995 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Tim Peters0bc93f52003-02-02 18:29:33 +00002997 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 if (len < 2) return bad_readline();
2999 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 errno = 0;
3002 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3005 /* Hm, maybe we've got something long. Let's try reading
3006 it as a Python long object. */
3007 errno = 0;
3008 py_int = PyLong_FromString(s, NULL, 0);
3009 if (py_int == NULL) {
3010 PyErr_SetString(PyExc_ValueError,
3011 "could not convert string to int");
3012 goto finally;
3013 }
3014 }
3015 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003016 if (len == 3 && (l == 0 || l == 1)) {
3017 if (!( py_int = PyBool_FromLong(l))) goto finally;
3018 }
3019 else {
3020 if (!( py_int = PyInt_FromLong(l))) goto finally;
3021 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 free(s);
3025 PDATA_PUSH(self->stack, py_int, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028 finally:
3029 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003032}
3033
Tim Peters3c67d792003-02-02 17:59:11 +00003034static int
3035load_bool(Unpicklerobject *self, PyObject *boolean)
3036{
3037 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003038 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003039 return 0;
3040}
3041
Tim Petersee1a53c2003-02-02 02:57:53 +00003042/* s contains x bytes of a little-endian integer. Return its value as a
3043 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3044 * int, but when x is 4 it's a signed one. This is an historical source
3045 * of x-platform bugs.
3046 */
Tim Peters84e87f32001-03-17 04:50:51 +00003047static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003048calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003049{
3050 unsigned char c;
3051 int i;
3052 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 for (i = 0, l = 0L; i < x; i++) {
3055 c = (unsigned char)s[i];
3056 l |= (long)c << (i * 8);
3057 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003058#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3060 * is signed, so on a box with longs bigger than 4 bytes we need
3061 * to extend a BININT's sign bit to the full width.
3062 */
3063 if (x == 4 && l & (1L << 31))
3064 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003065#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003067}
3068
3069
3070static int
Tim Peterscba30e22003-02-01 06:24:36 +00003071load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072{
3073 PyObject *py_int = 0;
3074 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077
Tim Peterscba30e22003-02-01 06:24:36 +00003078 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 PDATA_PUSH(self->stack, py_int, -1);
3082 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083}
3084
3085
3086static int
Tim Peterscba30e22003-02-01 06:24:36 +00003087load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088{
3089 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Tim Peters0bc93f52003-02-02 18:29:33 +00003091 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095}
3096
3097
3098static int
Tim Peterscba30e22003-02-01 06:24:36 +00003099load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100{
3101 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Tim Peters0bc93f52003-02-02 18:29:33 +00003103 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107}
3108
3109
3110static int
Tim Peterscba30e22003-02-01 06:24:36 +00003111load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003112{
3113 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
Tim Peters0bc93f52003-02-02 18:29:33 +00003115 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003119}
Tim Peters84e87f32001-03-17 04:50:51 +00003120
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121static int
Tim Peterscba30e22003-02-01 06:24:36 +00003122load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123{
3124 PyObject *l = 0;
3125 char *end, *s;
3126 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Tim Peters0bc93f52003-02-02 18:29:33 +00003128 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 if (len < 2) return bad_readline();
3130 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Tim Peterscba30e22003-02-01 06:24:36 +00003132 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 free(s);
3136 PDATA_PUSH(self->stack, l, -1);
3137 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 finally:
3140 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003143}
3144
Tim Petersee1a53c2003-02-02 02:57:53 +00003145/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3146 * data following.
3147 */
3148static int
3149load_counted_long(Unpicklerobject *self, int size)
3150{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003151 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003152 char *nbytes;
3153 unsigned char *pdata;
3154 PyObject *along;
3155
3156 assert(size == 1 || size == 4);
3157 i = self->read_func(self, &nbytes, size);
3158 if (i < 0) return -1;
3159
3160 size = calc_binint(nbytes, size);
3161 if (size < 0) {
3162 /* Corrupt or hostile pickle -- we never write one like
3163 * this.
3164 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003165 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003166 "byte count");
3167 return -1;
3168 }
3169
3170 if (size == 0)
3171 along = PyLong_FromLong(0L);
3172 else {
3173 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003174 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003175 if (i < 0) return -1;
3176 along = _PyLong_FromByteArray(pdata, (size_t)size,
3177 1 /* little endian */, 1 /* signed */);
3178 }
3179 if (along == NULL)
3180 return -1;
3181 PDATA_PUSH(self->stack, along, -1);
3182 return 0;
3183}
Tim Peters84e87f32001-03-17 04:50:51 +00003184
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185static int
Tim Peterscba30e22003-02-01 06:24:36 +00003186load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187{
3188 PyObject *py_float = 0;
3189 char *endptr, *s;
3190 int len, res = -1;
3191 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Tim Peters0bc93f52003-02-02 18:29:33 +00003193 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if (len < 2) return bad_readline();
3195 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003198 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3201 PyErr_SetString(PyExc_ValueError,
3202 "could not convert string to float");
3203 goto finally;
3204 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
Tim Peterscba30e22003-02-01 06:24:36 +00003206 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 free(s);
3210 PDATA_PUSH(self->stack, py_float, -1);
3211 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 finally:
3214 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217}
3218
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219static int
Tim Peterscba30e22003-02-01 06:24:36 +00003220load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221{
Tim Peters9905b942003-03-20 20:53:32 +00003222 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 double x;
3224 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Tim Peters0bc93f52003-02-02 18:29:33 +00003226 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
Tim Peters9905b942003-03-20 20:53:32 +00003229 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3230 if (x == -1.0 && PyErr_Occurred())
3231 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Tim Peters9905b942003-03-20 20:53:32 +00003233 py_float = PyFloat_FromDouble(x);
3234 if (py_float == NULL)
3235 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237 PDATA_PUSH(self->stack, py_float, -1);
3238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
3241static int
Tim Peterscba30e22003-02-01 06:24:36 +00003242load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243{
3244 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003245 int len, res = -1;
3246 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Tim Peters0bc93f52003-02-02 18:29:33 +00003248 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249 if (len < 2) return bad_readline();
3250 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003251
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003252
3253 /* Strip outermost quotes */
3254 while (s[len-1] <= ' ')
3255 len--;
3256 if(s[0]=='"' && s[len-1]=='"'){
3257 s[len-1] = '\0';
3258 p = s + 1 ;
3259 len -= 2;
3260 } else if(s[0]=='\'' && s[len-1]=='\''){
3261 s[len-1] = '\0';
3262 p = s + 1 ;
3263 len -= 2;
3264 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265 goto insecure;
3266 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003267
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003268 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003269 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003270 if (str) {
3271 PDATA_PUSH(self->stack, str, -1);
3272 res = 0;
3273 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 insecure:
3277 free(s);
3278 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3279 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003280}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003281
3282
3283static int
Tim Peterscba30e22003-02-01 06:24:36 +00003284load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003285{
3286 PyObject *py_string = 0;
3287 long l;
3288 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003289
Tim Peters0bc93f52003-02-02 18:29:33 +00003290 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Tim Peters0bc93f52003-02-02 18:29:33 +00003294 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003295 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296
Tim Peterscba30e22003-02-01 06:24:36 +00003297 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300 PDATA_PUSH(self->stack, py_string, -1);
3301 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003302}
3303
3304
3305static int
Tim Peterscba30e22003-02-01 06:24:36 +00003306load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003307{
3308 PyObject *py_string = 0;
3309 unsigned char l;
3310 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311
Tim Peters0bc93f52003-02-02 18:29:33 +00003312 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003313 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316
Tim Peters0bc93f52003-02-02 18:29:33 +00003317 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003321 PDATA_PUSH(self->stack, py_string, -1);
3322 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003323}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003324
3325
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003326#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327static int
Tim Peterscba30e22003-02-01 06:24:36 +00003328load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329{
3330 PyObject *str = 0;
3331 int len, res = -1;
3332 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003333
Tim Peters0bc93f52003-02-02 18:29:33 +00003334 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003336
Tim Peterscba30e22003-02-01 06:24:36 +00003337 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003340 PDATA_PUSH(self->stack, str, -1);
3341 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003343 finally:
3344 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003345}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003346#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003347
3348
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003349#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003350static int
Tim Peterscba30e22003-02-01 06:24:36 +00003351load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352{
3353 PyObject *unicode;
3354 long l;
3355 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003356
Tim Peters0bc93f52003-02-02 18:29:33 +00003357 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003360
Tim Peters0bc93f52003-02-02 18:29:33 +00003361 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003363
Tim Peterscba30e22003-02-01 06:24:36 +00003364 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003367 PDATA_PUSH(self->stack, unicode, -1);
3368 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003369}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003370#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003371
3372
3373static int
Tim Peterscba30e22003-02-01 06:24:36 +00003374load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375{
3376 PyObject *tup;
3377 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 if ((i = marker(self)) < 0) return -1;
3380 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3381 PDATA_PUSH(self->stack, tup, -1);
3382 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383}
3384
3385static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003386load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003387{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003388 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
Tim Peters1d63c9f2003-02-02 20:29:39 +00003390 if (tup == NULL)
3391 return -1;
3392
3393 while (--len >= 0) {
3394 PyObject *element;
3395
3396 PDATA_POP(self->stack, element);
3397 if (element == NULL)
3398 return -1;
3399 PyTuple_SET_ITEM(tup, len, element);
3400 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003401 PDATA_PUSH(self->stack, tup, -1);
3402 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003403}
3404
3405static int
Tim Peterscba30e22003-02-01 06:24:36 +00003406load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407{
3408 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410 if (!( list=PyList_New(0))) return -1;
3411 PDATA_PUSH(self->stack, list, -1);
3412 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003413}
3414
3415static int
Tim Peterscba30e22003-02-01 06:24:36 +00003416load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417{
3418 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 if (!( dict=PyDict_New())) return -1;
3421 PDATA_PUSH(self->stack, dict, -1);
3422 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423}
3424
3425
3426static int
Tim Peterscba30e22003-02-01 06:24:36 +00003427load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003428{
3429 PyObject *list = 0;
3430 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003432 if ((i = marker(self)) < 0) return -1;
3433 if (!( list=Pdata_popList(self->stack, i))) return -1;
3434 PDATA_PUSH(self->stack, list, -1);
3435 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436}
3437
3438static int
Tim Peterscba30e22003-02-01 06:24:36 +00003439load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440{
3441 PyObject *dict, *key, *value;
3442 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003444 if ((i = marker(self)) < 0) return -1;
3445 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003449 for (k = i+1; k < j; k += 2) {
3450 key =self->stack->data[k-1];
3451 value=self->stack->data[k ];
3452 if (PyDict_SetItem(dict, key, value) < 0) {
3453 Py_DECREF(dict);
3454 return -1;
3455 }
3456 }
3457 Pdata_clear(self->stack, i);
3458 PDATA_PUSH(self->stack, dict, -1);
3459 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003460}
3461
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003462static PyObject *
3463Instance_New(PyObject *cls, PyObject *args)
3464{
3465 PyObject *r = 0;
3466
3467 if ((r=PyObject_CallObject(cls, args))) return r;
3468
3469 {
3470 PyObject *tp, *v, *tb, *tmp_value;
3471
3472 PyErr_Fetch(&tp, &v, &tb);
3473 tmp_value = v;
3474 /* NULL occurs when there was a KeyboardInterrupt */
3475 if (tmp_value == NULL)
3476 tmp_value = Py_None;
3477 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3478 Py_XDECREF(v);
3479 v=r;
3480 }
3481 PyErr_Restore(tp,v,tb);
3482 }
3483 return NULL;
3484}
3485
Guido van Rossum60456fd1997-04-09 17:36:32 +00003486
3487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
3490 PyObject *class, *tup, *obj=0;
3491 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if ((i = marker(self)) < 0) return -1;
3494 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3495 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003496 if (class) {
3497 obj = Instance_New(class, tup);
3498 Py_DECREF(class);
3499 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502 if (! obj) return -1;
3503 PDATA_PUSH(self->stack, obj, -1);
3504 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003505}
3506
3507
3508static int
Tim Peterscba30e22003-02-01 06:24:36 +00003509load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510{
3511 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3512 int i, len;
3513 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003516
Tim Peters0bc93f52003-02-02 18:29:33 +00003517 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 if (len < 2) return bad_readline();
3519 module_name = PyString_FromStringAndSize(s, len - 1);
3520 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003521
Tim Peters0bc93f52003-02-02 18:29:33 +00003522 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if (len < 2) return bad_readline();
3524 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003525 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526 self->find_class);
3527 Py_DECREF(class_name);
3528 }
3529 }
3530 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003535 obj = Instance_New(class, tup);
3536 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 }
3538 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 PDATA_PUSH(self->stack, obj, -1);
3543 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544}
3545
Tim Peterseab7db32003-02-13 18:24:14 +00003546static int
3547load_newobj(Unpicklerobject *self)
3548{
3549 PyObject *args = NULL;
3550 PyObject *clsraw = NULL;
3551 PyTypeObject *cls; /* clsraw cast to its true type */
3552 PyObject *obj;
3553
3554 /* Stack is ... cls argtuple, and we want to call
3555 * cls.__new__(cls, *argtuple).
3556 */
3557 PDATA_POP(self->stack, args);
3558 if (args == NULL) goto Fail;
3559 if (! PyTuple_Check(args)) {
3560 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3561 "tuple.");
3562 goto Fail;
3563 }
3564
3565 PDATA_POP(self->stack, clsraw);
3566 cls = (PyTypeObject *)clsraw;
3567 if (cls == NULL) goto Fail;
3568 if (! PyType_Check(cls)) {
3569 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3570 "isn't a type object");
3571 goto Fail;
3572 }
3573 if (cls->tp_new == NULL) {
3574 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3575 "has NULL tp_new");
3576 goto Fail;
3577 }
3578
3579 /* Call __new__. */
3580 obj = cls->tp_new(cls, args, NULL);
3581 if (obj == NULL) goto Fail;
3582
3583 Py_DECREF(args);
3584 Py_DECREF(clsraw);
3585 PDATA_PUSH(self->stack, obj, -1);
3586 return 0;
3587
3588 Fail:
3589 Py_XDECREF(args);
3590 Py_XDECREF(clsraw);
3591 return -1;
3592}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593
3594static int
Tim Peterscba30e22003-02-01 06:24:36 +00003595load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003596{
3597 PyObject *class = 0, *module_name = 0, *class_name = 0;
3598 int len;
3599 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003600
Tim Peters0bc93f52003-02-02 18:29:33 +00003601 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 if (len < 2) return bad_readline();
3603 module_name = PyString_FromStringAndSize(s, len - 1);
3604 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Tim Peters0bc93f52003-02-02 18:29:33 +00003606 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003607 if (len < 2) {
3608 Py_DECREF(module_name);
3609 return bad_readline();
3610 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003612 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 self->find_class);
3614 Py_DECREF(class_name);
3615 }
3616 }
3617 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 if (! class) return -1;
3620 PDATA_PUSH(self->stack, class, -1);
3621 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003622}
3623
3624
3625static int
Tim Peterscba30e22003-02-01 06:24:36 +00003626load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627{
3628 PyObject *pid = 0;
3629 int len;
3630 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003633 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634 if (len < 2) return bad_readline();
3635
3636 pid = PyString_FromStringAndSize(s, len - 1);
3637 if (!pid) return -1;
3638
3639 if (PyList_Check(self->pers_func)) {
3640 if (PyList_Append(self->pers_func, pid) < 0) {
3641 Py_DECREF(pid);
3642 return -1;
3643 }
3644 }
3645 else {
3646 ARG_TUP(self, pid);
3647 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003648 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003649 NULL);
3650 FREE_ARG_TUP(self);
3651 }
3652 }
3653
3654 if (! pid) return -1;
3655
3656 PDATA_PUSH(self->stack, pid, -1);
3657 return 0;
3658 }
3659 else {
3660 PyErr_SetString(UnpicklingError,
3661 "A load persistent id instruction was encountered,\n"
3662 "but no persistent_load function was specified.");
3663 return -1;
3664 }
3665}
3666
3667static int
Tim Peterscba30e22003-02-01 06:24:36 +00003668load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003669{
3670 PyObject *pid = 0;
3671
3672 if (self->pers_func) {
3673 PDATA_POP(self->stack, pid);
3674 if (! pid) return -1;
3675
3676 if (PyList_Check(self->pers_func)) {
3677 if (PyList_Append(self->pers_func, pid) < 0) {
3678 Py_DECREF(pid);
3679 return -1;
3680 }
3681 }
3682 else {
3683 ARG_TUP(self, pid);
3684 if (self->arg) {
3685 pid = PyObject_Call(self->pers_func, self->arg,
3686 NULL);
3687 FREE_ARG_TUP(self);
3688 }
3689 if (! pid) return -1;
3690 }
3691
3692 PDATA_PUSH(self->stack, pid, -1);
3693 return 0;
3694 }
3695 else {
3696 PyErr_SetString(UnpicklingError,
3697 "A load persistent id instruction was encountered,\n"
3698 "but no persistent_load function was specified.");
3699 return -1;
3700 }
3701}
3702
3703
3704static int
Tim Peterscba30e22003-02-01 06:24:36 +00003705load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706{
3707 int len;
3708
3709 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3710
3711 /* Note that we split the (pickle.py) stack into two stacks,
3712 an object stack and a mark stack. We have to be clever and
3713 pop the right one. We do this by looking at the top of the
3714 mark stack.
3715 */
3716
3717 if ((self->num_marks > 0) &&
3718 (self->marks[self->num_marks - 1] == len))
3719 self->num_marks--;
3720 else {
3721 len--;
3722 Py_DECREF(self->stack->data[len]);
3723 self->stack->length=len;
3724 }
3725
3726 return 0;
3727}
3728
3729
3730static int
Tim Peterscba30e22003-02-01 06:24:36 +00003731load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732{
3733 int i;
3734
3735 if ((i = marker(self)) < 0)
3736 return -1;
3737
3738 Pdata_clear(self->stack, i);
3739
3740 return 0;
3741}
3742
3743
3744static int
Tim Peterscba30e22003-02-01 06:24:36 +00003745load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746{
3747 PyObject *last;
3748 int len;
3749
3750 if ((len = self->stack->length) <= 0) return stackUnderflow();
3751 last=self->stack->data[len-1];
3752 Py_INCREF(last);
3753 PDATA_PUSH(self->stack, last, -1);
3754 return 0;
3755}
3756
3757
3758static int
Tim Peterscba30e22003-02-01 06:24:36 +00003759load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760{
3761 PyObject *py_str = 0, *value = 0;
3762 int len;
3763 char *s;
3764 int rc;
3765
Tim Peters0bc93f52003-02-02 18:29:33 +00003766 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003767 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003769 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003771 value = PyDict_GetItem(self->memo, py_str);
3772 if (! value) {
3773 PyErr_SetObject(BadPickleGet, py_str);
3774 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003775 }
3776 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 PDATA_APPEND(self->stack, value, -1);
3778 rc = 0;
3779 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 Py_DECREF(py_str);
3782 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783}
3784
3785
3786static int
Tim Peterscba30e22003-02-01 06:24:36 +00003787load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788{
3789 PyObject *py_key = 0, *value = 0;
3790 unsigned char key;
3791 char *s;
3792 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003793
Tim Peters0bc93f52003-02-02 18:29:33 +00003794 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796 key = (unsigned char)s[0];
3797 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 value = PyDict_GetItem(self->memo, py_key);
3800 if (! value) {
3801 PyErr_SetObject(BadPickleGet, py_key);
3802 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003803 }
3804 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 PDATA_APPEND(self->stack, value, -1);
3806 rc = 0;
3807 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809 Py_DECREF(py_key);
3810 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811}
3812
3813
3814static int
Tim Peterscba30e22003-02-01 06:24:36 +00003815load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003816{
3817 PyObject *py_key = 0, *value = 0;
3818 unsigned char c;
3819 char *s;
3820 long key;
3821 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003822
Tim Peters0bc93f52003-02-02 18:29:33 +00003823 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003825 c = (unsigned char)s[0];
3826 key = (long)c;
3827 c = (unsigned char)s[1];
3828 key |= (long)c << 8;
3829 c = (unsigned char)s[2];
3830 key |= (long)c << 16;
3831 c = (unsigned char)s[3];
3832 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3835
3836 value = PyDict_GetItem(self->memo, py_key);
3837 if (! value) {
3838 PyErr_SetObject(BadPickleGet, py_key);
3839 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003840 }
3841 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 PDATA_APPEND(self->stack, value, -1);
3843 rc = 0;
3844 }
3845
3846 Py_DECREF(py_key);
3847 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848}
3849
Tim Peters2d629652003-02-04 05:06:17 +00003850/* Push an object from the extension registry (EXT[124]). nbytes is
3851 * the number of bytes following the opcode, holding the index (code) value.
3852 */
3853static int
3854load_extension(Unpicklerobject *self, int nbytes)
3855{
3856 char *codebytes; /* the nbytes bytes after the opcode */
3857 long code; /* calc_binint returns long */
3858 PyObject *py_code; /* code as a Python int */
3859 PyObject *obj; /* the object to push */
3860 PyObject *pair; /* (module_name, class_name) */
3861 PyObject *module_name, *class_name;
3862
3863 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3864 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3865 code = calc_binint(codebytes, nbytes);
3866 if (code <= 0) { /* note that 0 is forbidden */
3867 /* Corrupt or hostile pickle. */
3868 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3869 return -1;
3870 }
3871
3872 /* Look for the code in the cache. */
3873 py_code = PyInt_FromLong(code);
3874 if (py_code == NULL) return -1;
3875 obj = PyDict_GetItem(extension_cache, py_code);
3876 if (obj != NULL) {
3877 /* Bingo. */
3878 Py_DECREF(py_code);
3879 PDATA_APPEND(self->stack, obj, -1);
3880 return 0;
3881 }
3882
3883 /* Look up the (module_name, class_name) pair. */
3884 pair = PyDict_GetItem(inverted_registry, py_code);
3885 if (pair == NULL) {
3886 Py_DECREF(py_code);
3887 PyErr_Format(PyExc_ValueError, "unregistered extension "
3888 "code %ld", code);
3889 return -1;
3890 }
3891 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003892 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003893 */
3894 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3895 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3896 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3897 Py_DECREF(py_code);
3898 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3899 "isn't a 2-tuple of strings", code);
3900 return -1;
3901 }
3902 /* Load the object. */
3903 obj = find_class(module_name, class_name, self->find_class);
3904 if (obj == NULL) {
3905 Py_DECREF(py_code);
3906 return -1;
3907 }
3908 /* Cache code -> obj. */
3909 code = PyDict_SetItem(extension_cache, py_code, obj);
3910 Py_DECREF(py_code);
3911 if (code < 0) {
3912 Py_DECREF(obj);
3913 return -1;
3914 }
3915 PDATA_PUSH(self->stack, obj, -1);
3916 return 0;
3917}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
3919static int
Tim Peterscba30e22003-02-01 06:24:36 +00003920load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921{
3922 PyObject *py_str = 0, *value = 0;
3923 int len, l;
3924 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Tim Peters0bc93f52003-02-02 18:29:33 +00003926 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 if (l < 2) return bad_readline();
3928 if (!( len=self->stack->length )) return stackUnderflow();
3929 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3930 value=self->stack->data[len-1];
3931 l=PyDict_SetItem(self->memo, py_str, value);
3932 Py_DECREF(py_str);
3933 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934}
3935
3936
3937static int
Tim Peterscba30e22003-02-01 06:24:36 +00003938load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939{
3940 PyObject *py_key = 0, *value = 0;
3941 unsigned char key;
3942 char *s;
3943 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Tim Peters0bc93f52003-02-02 18:29:33 +00003945 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003948 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003950 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3951 value=self->stack->data[len-1];
3952 len=PyDict_SetItem(self->memo, py_key, value);
3953 Py_DECREF(py_key);
3954 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955}
3956
3957
3958static int
Tim Peterscba30e22003-02-01 06:24:36 +00003959load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960{
3961 PyObject *py_key = 0, *value = 0;
3962 long key;
3963 unsigned char c;
3964 char *s;
3965 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Tim Peters0bc93f52003-02-02 18:29:33 +00003967 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003970 c = (unsigned char)s[0];
3971 key = (long)c;
3972 c = (unsigned char)s[1];
3973 key |= (long)c << 8;
3974 c = (unsigned char)s[2];
3975 key |= (long)c << 16;
3976 c = (unsigned char)s[3];
3977 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003979 if (!( py_key = PyInt_FromLong(key))) return -1;
3980 value=self->stack->data[len-1];
3981 len=PyDict_SetItem(self->memo, py_key, value);
3982 Py_DECREF(py_key);
3983 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984}
3985
3986
3987static int
Tim Peterscba30e22003-02-01 06:24:36 +00003988do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989{
3990 PyObject *value = 0, *list = 0, *append_method = 0;
3991 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 len=self->stack->length;
3994 if (!( len >= x && x > 0 )) return stackUnderflow();
3995 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003996 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 if (PyList_Check(list)) {
4001 PyObject *slice;
4002 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004005 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 list_len = PyList_GET_SIZE(list);
4007 i=PyList_SetSlice(list, list_len, list_len, slice);
4008 Py_DECREF(slice);
4009 return i;
4010 }
4011 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004012
Tim Peterscba30e22003-02-01 06:24:36 +00004013 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 return -1;
4015
4016 for (i = x; i < len; i++) {
4017 PyObject *junk;
4018
4019 value=self->stack->data[i];
4020 junk=0;
4021 ARG_TUP(self, value);
4022 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004023 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 NULL);
4025 FREE_ARG_TUP(self);
4026 }
4027 if (! junk) {
4028 Pdata_clear(self->stack, i+1);
4029 self->stack->length=x;
4030 Py_DECREF(append_method);
4031 return -1;
4032 }
4033 Py_DECREF(junk);
4034 }
4035 self->stack->length=x;
4036 Py_DECREF(append_method);
4037 }
4038
4039 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004040}
4041
4042
4043static int
Tim Peterscba30e22003-02-01 06:24:36 +00004044load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045{
4046 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047}
4048
4049
4050static int
Tim Peterscba30e22003-02-01 06:24:36 +00004051load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052{
4053 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004054}
4055
4056
4057static int
Tim Peterscba30e22003-02-01 06:24:36 +00004058do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059{
4060 PyObject *value = 0, *key = 0, *dict = 0;
4061 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 if (!( (len=self->stack->length) >= x
4064 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004068 for (i = x+1; i < len; i += 2) {
4069 key =self->stack->data[i-1];
4070 value=self->stack->data[i ];
4071 if (PyObject_SetItem(dict, key, value) < 0) {
4072 r=-1;
4073 break;
4074 }
4075 }
4076
4077 Pdata_clear(self->stack, x);
4078
4079 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004080}
4081
4082
Tim Peters84e87f32001-03-17 04:50:51 +00004083static int
Tim Peterscba30e22003-02-01 06:24:36 +00004084load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085{
4086 return do_setitems(self, self->stack->length - 2);
4087}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089static int
Tim Peterscba30e22003-02-01 06:24:36 +00004090load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091{
4092 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004093}
4094
Tim Peters84e87f32001-03-17 04:50:51 +00004095
Guido van Rossum60456fd1997-04-09 17:36:32 +00004096static int
Tim Peterscba30e22003-02-01 06:24:36 +00004097load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098{
Tim Peters080c88b2003-02-15 03:01:11 +00004099 PyObject *state, *inst, *slotstate;
4100 PyObject *__setstate__;
4101 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004102 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004103 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104
Tim Peters080c88b2003-02-15 03:01:11 +00004105 /* Stack is ... instance, state. We want to leave instance at
4106 * the stack top, possibly mutated via instance.__setstate__(state).
4107 */
4108 if (self->stack->length < 2)
4109 return stackUnderflow();
4110 PDATA_POP(self->stack, state);
4111 if (state == NULL)
4112 return -1;
4113 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114
Tim Peters080c88b2003-02-15 03:01:11 +00004115 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4116 if (__setstate__ != NULL) {
4117 PyObject *junk = NULL;
4118
4119 /* The explicit __setstate__ is responsible for everything. */
4120 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 if (self->arg) {
4122 junk = PyObject_Call(__setstate__, self->arg, NULL);
4123 FREE_ARG_TUP(self);
4124 }
4125 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004126 if (junk == NULL)
4127 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128 Py_DECREF(junk);
4129 return 0;
4130 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004131 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4132 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004134
4135 /* A default __setstate__. First see whether state embeds a
4136 * slot state dict too (a proto 2 addition).
4137 */
4138 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4139 PyObject *temp = state;
4140 state = PyTuple_GET_ITEM(temp, 0);
4141 slotstate = PyTuple_GET_ITEM(temp, 1);
4142 Py_INCREF(state);
4143 Py_INCREF(slotstate);
4144 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 }
Tim Peters080c88b2003-02-15 03:01:11 +00004146 else
4147 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148
Tim Peters080c88b2003-02-15 03:01:11 +00004149 /* Set inst.__dict__ from the state dict (if any). */
4150 if (state != Py_None) {
4151 PyObject *dict;
4152 if (! PyDict_Check(state)) {
4153 PyErr_SetString(UnpicklingError, "state is not a "
4154 "dictionary");
4155 goto finally;
4156 }
4157 dict = PyObject_GetAttr(inst, __dict___str);
4158 if (dict == NULL)
4159 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160
Tim Peters080c88b2003-02-15 03:01:11 +00004161 i = 0;
4162 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4163 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4164 goto finally;
4165 }
4166 Py_DECREF(dict);
4167 }
4168
4169 /* Also set instance attributes from the slotstate dict (if any). */
4170 if (slotstate != NULL) {
4171 if (! PyDict_Check(slotstate)) {
4172 PyErr_SetString(UnpicklingError, "slot state is not "
4173 "a dictionary");
4174 goto finally;
4175 }
4176 i = 0;
4177 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4178 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4179 goto finally;
4180 }
4181 }
4182 res = 0;
4183
4184 finally:
4185 Py_DECREF(state);
4186 Py_XDECREF(slotstate);
4187 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188}
4189
4190
4191static int
Tim Peterscba30e22003-02-01 06:24:36 +00004192load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193{
4194 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 /* Note that we split the (pickle.py) stack into two stacks, an
4197 object stack and a mark stack. Here we push a mark onto the
4198 mark stack.
4199 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201 if ((self->num_marks + 1) >= self->marks_size) {
4202 s=self->marks_size+20;
4203 if (s <= self->num_marks) s=self->num_marks + 1;
4204 if (self->marks == NULL)
4205 self->marks=(int *)malloc(s * sizeof(int));
4206 else
Tim Peterscba30e22003-02-01 06:24:36 +00004207 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 s * sizeof(int));
4209 if (! self->marks) {
4210 PyErr_NoMemory();
4211 return -1;
4212 }
4213 self->marks_size = s;
4214 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004219}
4220
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221static int
Tim Peterscba30e22003-02-01 06:24:36 +00004222load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223{
4224 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 PDATA_POP(self->stack, arg_tup);
4227 if (! arg_tup) return -1;
4228 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004229 if (callable) {
4230 ob = Instance_New(callable, arg_tup);
4231 Py_DECREF(callable);
4232 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 PDATA_PUSH(self->stack, ob, -1);
4238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239}
Tim Peters84e87f32001-03-17 04:50:51 +00004240
Tim Peters4190fb82003-02-02 16:09:05 +00004241/* Just raises an error if we don't know the protocol specified. PROTO
4242 * is the first opcode for protocols >= 2.
4243 */
4244static int
4245load_proto(Unpicklerobject *self)
4246{
4247 int i;
4248 char *protobyte;
4249
4250 i = self->read_func(self, &protobyte, 1);
4251 if (i < 0)
4252 return -1;
4253
4254 i = calc_binint(protobyte, 1);
4255 /* No point checking for < 0, since calc_binint returns an unsigned
4256 * int when chewing on 1 byte.
4257 */
4258 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004259 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004260 return 0;
4261
4262 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4263 return -1;
4264}
4265
Guido van Rossum60456fd1997-04-09 17:36:32 +00004266static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004267load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268{
4269 PyObject *err = 0, *val = 0;
4270 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 self->num_marks = 0;
4273 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004276 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 switch (s[0]) {
4280 case NONE:
4281 if (load_none(self) < 0)
4282 break;
4283 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 case BININT:
4286 if (load_binint(self) < 0)
4287 break;
4288 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case BININT1:
4291 if (load_binint1(self) < 0)
4292 break;
4293 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 case BININT2:
4296 if (load_binint2(self) < 0)
4297 break;
4298 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 case INT:
4301 if (load_int(self) < 0)
4302 break;
4303 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004305 case LONG:
4306 if (load_long(self) < 0)
4307 break;
4308 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004309
Tim Petersee1a53c2003-02-02 02:57:53 +00004310 case LONG1:
4311 if (load_counted_long(self, 1) < 0)
4312 break;
4313 continue;
4314
4315 case LONG4:
4316 if (load_counted_long(self, 4) < 0)
4317 break;
4318 continue;
4319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 case FLOAT:
4321 if (load_float(self) < 0)
4322 break;
4323 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 case BINFLOAT:
4326 if (load_binfloat(self) < 0)
4327 break;
4328 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 case BINSTRING:
4331 if (load_binstring(self) < 0)
4332 break;
4333 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 case SHORT_BINSTRING:
4336 if (load_short_binstring(self) < 0)
4337 break;
4338 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 case STRING:
4341 if (load_string(self) < 0)
4342 break;
4343 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004344
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004345#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 case UNICODE:
4347 if (load_unicode(self) < 0)
4348 break;
4349 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 case BINUNICODE:
4352 if (load_binunicode(self) < 0)
4353 break;
4354 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004355#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004358 if (load_counted_tuple(self, 0) < 0)
4359 break;
4360 continue;
4361
4362 case TUPLE1:
4363 if (load_counted_tuple(self, 1) < 0)
4364 break;
4365 continue;
4366
4367 case TUPLE2:
4368 if (load_counted_tuple(self, 2) < 0)
4369 break;
4370 continue;
4371
4372 case TUPLE3:
4373 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 break;
4375 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 case TUPLE:
4378 if (load_tuple(self) < 0)
4379 break;
4380 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case EMPTY_LIST:
4383 if (load_empty_list(self) < 0)
4384 break;
4385 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case LIST:
4388 if (load_list(self) < 0)
4389 break;
4390 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case EMPTY_DICT:
4393 if (load_empty_dict(self) < 0)
4394 break;
4395 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 case DICT:
4398 if (load_dict(self) < 0)
4399 break;
4400 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 case OBJ:
4403 if (load_obj(self) < 0)
4404 break;
4405 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 case INST:
4408 if (load_inst(self) < 0)
4409 break;
4410 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004411
Tim Peterseab7db32003-02-13 18:24:14 +00004412 case NEWOBJ:
4413 if (load_newobj(self) < 0)
4414 break;
4415 continue;
4416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 case GLOBAL:
4418 if (load_global(self) < 0)
4419 break;
4420 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 case APPEND:
4423 if (load_append(self) < 0)
4424 break;
4425 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 case APPENDS:
4428 if (load_appends(self) < 0)
4429 break;
4430 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 case BUILD:
4433 if (load_build(self) < 0)
4434 break;
4435 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 case DUP:
4438 if (load_dup(self) < 0)
4439 break;
4440 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 case BINGET:
4443 if (load_binget(self) < 0)
4444 break;
4445 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 case LONG_BINGET:
4448 if (load_long_binget(self) < 0)
4449 break;
4450 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 case GET:
4453 if (load_get(self) < 0)
4454 break;
4455 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004456
Tim Peters2d629652003-02-04 05:06:17 +00004457 case EXT1:
4458 if (load_extension(self, 1) < 0)
4459 break;
4460 continue;
4461
4462 case EXT2:
4463 if (load_extension(self, 2) < 0)
4464 break;
4465 continue;
4466
4467 case EXT4:
4468 if (load_extension(self, 4) < 0)
4469 break;
4470 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 case MARK:
4472 if (load_mark(self) < 0)
4473 break;
4474 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 case BINPUT:
4477 if (load_binput(self) < 0)
4478 break;
4479 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 case LONG_BINPUT:
4482 if (load_long_binput(self) < 0)
4483 break;
4484 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 case PUT:
4487 if (load_put(self) < 0)
4488 break;
4489 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 case POP:
4492 if (load_pop(self) < 0)
4493 break;
4494 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 case POP_MARK:
4497 if (load_pop_mark(self) < 0)
4498 break;
4499 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501 case SETITEM:
4502 if (load_setitem(self) < 0)
4503 break;
4504 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 case SETITEMS:
4507 if (load_setitems(self) < 0)
4508 break;
4509 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 case STOP:
4512 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 case PERSID:
4515 if (load_persid(self) < 0)
4516 break;
4517 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 case BINPERSID:
4520 if (load_binpersid(self) < 0)
4521 break;
4522 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 case REDUCE:
4525 if (load_reduce(self) < 0)
4526 break;
4527 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Tim Peters4190fb82003-02-02 16:09:05 +00004529 case PROTO:
4530 if (load_proto(self) < 0)
4531 break;
4532 continue;
4533
Tim Peters3c67d792003-02-02 17:59:11 +00004534 case NEWTRUE:
4535 if (load_bool(self, Py_True) < 0)
4536 break;
4537 continue;
4538
4539 case NEWFALSE:
4540 if (load_bool(self, Py_False) < 0)
4541 break;
4542 continue;
4543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 case '\0':
4545 /* end of file */
4546 PyErr_SetNone(PyExc_EOFError);
4547 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004550 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 "invalid load key, '%s'.",
4552 "c", s[0]);
4553 return NULL;
4554 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 break;
4557 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 if ((err = PyErr_Occurred())) {
4560 if (err == PyExc_EOFError) {
4561 PyErr_SetNone(PyExc_EOFError);
4562 }
4563 return NULL;
4564 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 PDATA_POP(self->stack, val);
4567 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004568}
Tim Peters84e87f32001-03-17 04:50:51 +00004569
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004571/* No-load functions to support noload, which is used to
4572 find persistent references. */
4573
4574static int
Tim Peterscba30e22003-02-01 06:24:36 +00004575noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576{
4577 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 if ((i = marker(self)) < 0) return -1;
4580 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004581}
4582
4583
4584static int
Tim Peterscba30e22003-02-01 06:24:36 +00004585noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586{
4587 int i;
4588 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 if ((i = marker(self)) < 0) return -1;
4591 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004592 if (self->readline_func(self, &s) < 0) return -1;
4593 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004594 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004596}
4597
4598static int
Tim Peterseab7db32003-02-13 18:24:14 +00004599noload_newobj(Unpicklerobject *self)
4600{
4601 PyObject *obj;
4602
4603 PDATA_POP(self->stack, obj); /* pop argtuple */
4604 if (obj == NULL) return -1;
4605 Py_DECREF(obj);
4606
4607 PDATA_POP(self->stack, obj); /* pop cls */
4608 if (obj == NULL) return -1;
4609 Py_DECREF(obj);
4610
4611 PDATA_APPEND(self->stack, Py_None, -1);
4612 return 0;
4613}
4614
4615static int
Tim Peterscba30e22003-02-01 06:24:36 +00004616noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617{
4618 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004619
Tim Peters0bc93f52003-02-02 18:29:33 +00004620 if (self->readline_func(self, &s) < 0) return -1;
4621 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 PDATA_APPEND(self->stack, Py_None,-1);
4623 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004624}
4625
4626static int
Tim Peterscba30e22003-02-01 06:24:36 +00004627noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004630 if (self->stack->length < 2) return stackUnderflow();
4631 Pdata_clear(self->stack, self->stack->length-2);
4632 PDATA_APPEND(self->stack, Py_None,-1);
4633 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004634}
4635
4636static int
4637noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638
Guido van Rossum053b8df1998-11-25 16:18:00 +00004639 if (self->stack->length < 1) return stackUnderflow();
4640 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004641 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004642}
4643
Tim Peters2d629652003-02-04 05:06:17 +00004644static int
4645noload_extension(Unpicklerobject *self, int nbytes)
4646{
4647 char *codebytes;
4648
4649 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4650 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4651 PDATA_APPEND(self->stack, Py_None, -1);
4652 return 0;
4653}
4654
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655
4656static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004657noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658{
4659 PyObject *err = 0, *val = 0;
4660 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662 self->num_marks = 0;
4663 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004666 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 switch (s[0]) {
4670 case NONE:
4671 if (load_none(self) < 0)
4672 break;
4673 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675 case BININT:
4676 if (load_binint(self) < 0)
4677 break;
4678 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 case BININT1:
4681 if (load_binint1(self) < 0)
4682 break;
4683 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 case BININT2:
4686 if (load_binint2(self) < 0)
4687 break;
4688 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 case INT:
4691 if (load_int(self) < 0)
4692 break;
4693 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 case LONG:
4696 if (load_long(self) < 0)
4697 break;
4698 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004699
Tim Peters4190fb82003-02-02 16:09:05 +00004700 case LONG1:
4701 if (load_counted_long(self, 1) < 0)
4702 break;
4703 continue;
4704
4705 case LONG4:
4706 if (load_counted_long(self, 4) < 0)
4707 break;
4708 continue;
4709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 case FLOAT:
4711 if (load_float(self) < 0)
4712 break;
4713 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 case BINFLOAT:
4716 if (load_binfloat(self) < 0)
4717 break;
4718 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case BINSTRING:
4721 if (load_binstring(self) < 0)
4722 break;
4723 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 case SHORT_BINSTRING:
4726 if (load_short_binstring(self) < 0)
4727 break;
4728 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 case STRING:
4731 if (load_string(self) < 0)
4732 break;
4733 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004734
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004735#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 case UNICODE:
4737 if (load_unicode(self) < 0)
4738 break;
4739 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 case BINUNICODE:
4742 if (load_binunicode(self) < 0)
4743 break;
4744 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004745#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004748 if (load_counted_tuple(self, 0) < 0)
4749 break;
4750 continue;
4751
4752 case TUPLE1:
4753 if (load_counted_tuple(self, 1) < 0)
4754 break;
4755 continue;
4756
4757 case TUPLE2:
4758 if (load_counted_tuple(self, 2) < 0)
4759 break;
4760 continue;
4761
4762 case TUPLE3:
4763 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 break;
4765 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 case TUPLE:
4768 if (load_tuple(self) < 0)
4769 break;
4770 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 case EMPTY_LIST:
4773 if (load_empty_list(self) < 0)
4774 break;
4775 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 case LIST:
4778 if (load_list(self) < 0)
4779 break;
4780 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 case EMPTY_DICT:
4783 if (load_empty_dict(self) < 0)
4784 break;
4785 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 case DICT:
4788 if (load_dict(self) < 0)
4789 break;
4790 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 case OBJ:
4793 if (noload_obj(self) < 0)
4794 break;
4795 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004797 case INST:
4798 if (noload_inst(self) < 0)
4799 break;
4800 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004801
Tim Peterseab7db32003-02-13 18:24:14 +00004802 case NEWOBJ:
4803 if (noload_newobj(self) < 0)
4804 break;
4805 continue;
4806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 case GLOBAL:
4808 if (noload_global(self) < 0)
4809 break;
4810 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 case APPEND:
4813 if (load_append(self) < 0)
4814 break;
4815 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 case APPENDS:
4818 if (load_appends(self) < 0)
4819 break;
4820 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 case BUILD:
4823 if (noload_build(self) < 0)
4824 break;
4825 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 case DUP:
4828 if (load_dup(self) < 0)
4829 break;
4830 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 case BINGET:
4833 if (load_binget(self) < 0)
4834 break;
4835 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 case LONG_BINGET:
4838 if (load_long_binget(self) < 0)
4839 break;
4840 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 case GET:
4843 if (load_get(self) < 0)
4844 break;
4845 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004846
Tim Peters2d629652003-02-04 05:06:17 +00004847 case EXT1:
4848 if (noload_extension(self, 1) < 0)
4849 break;
4850 continue;
4851
4852 case EXT2:
4853 if (noload_extension(self, 2) < 0)
4854 break;
4855 continue;
4856
4857 case EXT4:
4858 if (noload_extension(self, 4) < 0)
4859 break;
4860 continue;
4861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case MARK:
4863 if (load_mark(self) < 0)
4864 break;
4865 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case BINPUT:
4868 if (load_binput(self) < 0)
4869 break;
4870 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 case LONG_BINPUT:
4873 if (load_long_binput(self) < 0)
4874 break;
4875 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004877 case PUT:
4878 if (load_put(self) < 0)
4879 break;
4880 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 case POP:
4883 if (load_pop(self) < 0)
4884 break;
4885 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 case POP_MARK:
4888 if (load_pop_mark(self) < 0)
4889 break;
4890 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case SETITEM:
4893 if (load_setitem(self) < 0)
4894 break;
4895 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 case SETITEMS:
4898 if (load_setitems(self) < 0)
4899 break;
4900 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case STOP:
4903 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004905 case PERSID:
4906 if (load_persid(self) < 0)
4907 break;
4908 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 case BINPERSID:
4911 if (load_binpersid(self) < 0)
4912 break;
4913 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 case REDUCE:
4916 if (noload_reduce(self) < 0)
4917 break;
4918 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919
Tim Peters4190fb82003-02-02 16:09:05 +00004920 case PROTO:
4921 if (load_proto(self) < 0)
4922 break;
4923 continue;
4924
Tim Peters3c67d792003-02-02 17:59:11 +00004925 case NEWTRUE:
4926 if (load_bool(self, Py_True) < 0)
4927 break;
4928 continue;
4929
4930 case NEWFALSE:
4931 if (load_bool(self, Py_False) < 0)
4932 break;
4933 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004935 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004936 "invalid load key, '%s'.",
4937 "c", s[0]);
4938 return NULL;
4939 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 break;
4942 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 if ((err = PyErr_Occurred())) {
4945 if (err == PyExc_EOFError) {
4946 PyErr_SetNone(PyExc_EOFError);
4947 }
4948 return NULL;
4949 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 PDATA_POP(self->stack, val);
4952 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004953}
Tim Peters84e87f32001-03-17 04:50:51 +00004954
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004957Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004960}
4961
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004963Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004966}
4967
Guido van Rossum60456fd1997-04-09 17:36:32 +00004968
4969static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004970 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004971 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004972 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004973 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004974 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004975 "noload() -- not load a pickle, but go through most of the motions\n"
4976 "\n"
4977 "This function can be used to read past a pickle without instantiating\n"
4978 "any objects or importing any modules. It can also be used to find all\n"
4979 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004980 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004981 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004982 {NULL, NULL} /* sentinel */
4983};
4984
4985
4986static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004987newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988{
4989 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004990
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004991 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004994 self->file = NULL;
4995 self->arg = NULL;
4996 self->stack = (Pdata*)Pdata_New();
4997 self->pers_func = NULL;
4998 self->last_string = NULL;
4999 self->marks = NULL;
5000 self->num_marks = 0;
5001 self->marks_size = 0;
5002 self->buf_size = 0;
5003 self->read = NULL;
5004 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005005 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005006
Tim Peterscba30e22003-02-01 06:24:36 +00005007 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005009
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005010 if (!self->stack)
5011 goto err;
5012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 Py_INCREF(f);
5014 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 /* Set read, readline based on type of f */
5017 if (PyFile_Check(f)) {
5018 self->fp = PyFile_AsFile(f);
5019 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005020 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 "I/O operation on closed file");
5022 goto err;
5023 }
5024 self->read_func = read_file;
5025 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005026 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005027 else if (PycStringIO_InputCheck(f)) {
5028 self->fp = NULL;
5029 self->read_func = read_cStringIO;
5030 self->readline_func = readline_cStringIO;
5031 }
5032 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005034 self->fp = NULL;
5035 self->read_func = read_other;
5036 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5039 (self->read = PyObject_GetAttr(f, read_str)))) {
5040 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005041 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005042 "argument must have 'read' and "
5043 "'readline' attributes" );
5044 goto err;
5045 }
5046 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005047 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005049 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005051 err:
5052 Py_DECREF((PyObject *)self);
5053 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005054}
5055
5056
5057static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005058get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005060 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005061}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005062
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005063
Guido van Rossum60456fd1997-04-09 17:36:32 +00005064static void
Tim Peterscba30e22003-02-01 06:24:36 +00005065Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005067 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068 Py_XDECREF(self->readline);
5069 Py_XDECREF(self->read);
5070 Py_XDECREF(self->file);
5071 Py_XDECREF(self->memo);
5072 Py_XDECREF(self->stack);
5073 Py_XDECREF(self->pers_func);
5074 Py_XDECREF(self->arg);
5075 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005076 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005078 if (self->marks) {
5079 free(self->marks);
5080 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005082 if (self->buf_size) {
5083 free(self->buf);
5084 }
Tim Peters84e87f32001-03-17 04:50:51 +00005085
Tim Peters3cfe7542003-05-21 21:29:48 +00005086 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005087}
5088
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005089static int
5090Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5091{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005092 Py_VISIT(self->readline);
5093 Py_VISIT(self->read);
5094 Py_VISIT(self->file);
5095 Py_VISIT(self->memo);
5096 Py_VISIT(self->stack);
5097 Py_VISIT(self->pers_func);
5098 Py_VISIT(self->arg);
5099 Py_VISIT(self->last_string);
5100 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005101 return 0;
5102}
5103
5104static int
5105Unpickler_clear(Unpicklerobject *self)
5106{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005107 Py_CLEAR(self->readline);
5108 Py_CLEAR(self->read);
5109 Py_CLEAR(self->file);
5110 Py_CLEAR(self->memo);
5111 Py_CLEAR(self->stack);
5112 Py_CLEAR(self->pers_func);
5113 Py_CLEAR(self->arg);
5114 Py_CLEAR(self->last_string);
5115 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005116 return 0;
5117}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118
5119static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005120Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121{
5122 if (!strcmp(name, "persistent_load")) {
5123 if (!self->pers_func) {
5124 PyErr_SetString(PyExc_AttributeError, name);
5125 return NULL;
5126 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 Py_INCREF(self->pers_func);
5129 return self->pers_func;
5130 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 if (!strcmp(name, "find_global")) {
5133 if (!self->find_class) {
5134 PyErr_SetString(PyExc_AttributeError, name);
5135 return NULL;
5136 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 Py_INCREF(self->find_class);
5139 return self->find_class;
5140 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005142 if (!strcmp(name, "memo")) {
5143 if (!self->memo) {
5144 PyErr_SetString(PyExc_AttributeError, name);
5145 return NULL;
5146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 Py_INCREF(self->memo);
5149 return self->memo;
5150 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 if (!strcmp(name, "UnpicklingError")) {
5153 Py_INCREF(UnpicklingError);
5154 return UnpicklingError;
5155 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005158}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005159
Guido van Rossum60456fd1997-04-09 17:36:32 +00005160
5161static int
Tim Peterscba30e22003-02-01 06:24:36 +00005162Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 if (!strcmp(name, "persistent_load")) {
5166 Py_XDECREF(self->pers_func);
5167 self->pers_func = value;
5168 Py_XINCREF(value);
5169 return 0;
5170 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005172 if (!strcmp(name, "find_global")) {
5173 Py_XDECREF(self->find_class);
5174 self->find_class = value;
5175 Py_XINCREF(value);
5176 return 0;
5177 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 if (! value) {
5180 PyErr_SetString(PyExc_TypeError,
5181 "attribute deletion is not supported");
5182 return -1;
5183 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005185 if (strcmp(name, "memo") == 0) {
5186 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005187 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005188 "memo must be a dictionary");
5189 return -1;
5190 }
5191 Py_XDECREF(self->memo);
5192 self->memo = value;
5193 Py_INCREF(value);
5194 return 0;
5195 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005197 PyErr_SetString(PyExc_AttributeError, name);
5198 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199}
5200
Tim Peters5bd2a792003-02-01 16:45:06 +00005201/* ---------------------------------------------------------------------------
5202 * Module-level functions.
5203 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005204
Martin v. Löwis544f1192004-07-27 05:22:33 +00005205/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005206static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005207cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005209 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005210 PyObject *ob, *file, *res = NULL;
5211 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005212 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005213
Martin v. Löwis544f1192004-07-27 05:22:33 +00005214 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5215 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005216 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005217
Tim Peters5bd2a792003-02-01 16:45:06 +00005218 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 if (dump(pickler, ob) < 0)
5222 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224 Py_INCREF(Py_None);
5225 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005227 finally:
5228 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231}
5232
5233
Martin v. Löwis544f1192004-07-27 05:22:33 +00005234/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005235static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005236cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005237{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005238 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 PyObject *ob, *file = 0, *res = NULL;
5240 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005241 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Martin v. Löwis544f1192004-07-27 05:22:33 +00005243 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5244 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005245 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005246
Tim Peterscba30e22003-02-01 06:24:36 +00005247 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005249
Tim Peters5bd2a792003-02-01 16:45:06 +00005250 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005251 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 if (dump(pickler, ob) < 0)
5254 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 finally:
5259 Py_XDECREF(pickler);
5260 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005262 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005263}
5264
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005265
Tim Peters5bd2a792003-02-01 16:45:06 +00005266/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005267static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005268cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269{
5270 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005271 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005272
Tim Peterscba30e22003-02-01 06:24:36 +00005273 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005276 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005278 finally:
5279 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005281 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005282}
5283
5284
Tim Peters5bd2a792003-02-01 16:45:06 +00005285/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005286static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005287cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005288{
5289 PyObject *ob, *file = 0, *res = NULL;
5290 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005291
Tim Peterscba30e22003-02-01 06:24:36 +00005292 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005293 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005294
Tim Peterscba30e22003-02-01 06:24:36 +00005295 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005296 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005297
Tim Peterscba30e22003-02-01 06:24:36 +00005298 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005299 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005303 finally:
5304 Py_XDECREF(file);
5305 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005307 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005308}
5309
5310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005311PyDoc_STRVAR(Unpicklertype__doc__,
5312"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005313
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005314static PyTypeObject Unpicklertype = {
5315 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005316 0, /*ob_size*/
5317 "cPickle.Unpickler", /*tp_name*/
5318 sizeof(Unpicklerobject), /*tp_basicsize*/
5319 0,
5320 (destructor)Unpickler_dealloc, /* tp_dealloc */
5321 0, /* tp_print */
5322 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5323 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5324 0, /* tp_compare */
5325 0, /* tp_repr */
5326 0, /* tp_as_number */
5327 0, /* tp_as_sequence */
5328 0, /* tp_as_mapping */
5329 0, /* tp_hash */
5330 0, /* tp_call */
5331 0, /* tp_str */
5332 0, /* tp_getattro */
5333 0, /* tp_setattro */
5334 0, /* tp_as_buffer */
5335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5336 Unpicklertype__doc__, /* tp_doc */
5337 (traverseproc)Unpickler_traverse, /* tp_traverse */
5338 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005339};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005340
Guido van Rossum60456fd1997-04-09 17:36:32 +00005341static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005342 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5343 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005344 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005345 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005346 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005347 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005348
Martin v. Löwis544f1192004-07-27 05:22:33 +00005349 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5350 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005351 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005352 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005353 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005354 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005355
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005356 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005357 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005358
Neal Norwitzb0493252002-03-31 14:44:22 +00005359 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005360 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005361
Martin v. Löwis544f1192004-07-27 05:22:33 +00005362 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5363 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005364 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005365 "This takes a file-like object for writing a pickle data stream.\n"
5366 "The optional proto argument tells the pickler to use the given\n"
5367 "protocol; supported protocols are 0, 1, 2. The default\n"
5368 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5369 "only protocol that can be written to a file opened in text\n"
5370 "mode and read back successfully. When using a protocol higher\n"
5371 "than 0, make sure the file is opened in binary mode, both when\n"
5372 "pickling and unpickling.)\n"
5373 "\n"
5374 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5375 "more efficient than protocol 1.\n"
5376 "\n"
5377 "Specifying a negative protocol version selects the highest\n"
5378 "protocol version supported. The higher the protocol used, the\n"
5379 "more recent the version of Python needed to read the pickle\n"
5380 "produced.\n"
5381 "\n"
5382 "The file parameter must have a write() method that accepts a single\n"
5383 "string argument. It can thus be an open file object, a StringIO\n"
5384 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005385 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005386
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005387 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005388 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5389
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005390 { NULL, NULL }
5391};
5392
Guido van Rossum60456fd1997-04-09 17:36:32 +00005393static int
Tim Peterscba30e22003-02-01 06:24:36 +00005394init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395{
5396 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005397
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005398#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005399
Tim Peters3cfe7542003-05-21 21:29:48 +00005400 if (PyType_Ready(&Unpicklertype) < 0)
5401 return -1;
5402 if (PyType_Ready(&Picklertype) < 0)
5403 return -1;
5404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 INIT_STR(__class__);
5406 INIT_STR(__getinitargs__);
5407 INIT_STR(__dict__);
5408 INIT_STR(__getstate__);
5409 INIT_STR(__setstate__);
5410 INIT_STR(__name__);
5411 INIT_STR(__main__);
5412 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005413 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005415 INIT_STR(append);
5416 INIT_STR(read);
5417 INIT_STR(readline);
5418 INIT_STR(copy_reg);
5419 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005420
Tim Peterscba30e22003-02-01 06:24:36 +00005421 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005423
Tim Peters1f1b2d22003-02-01 02:16:37 +00005424 /* This is special because we want to use a different
5425 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005427 if (!dispatch_table) return -1;
5428
5429 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005430 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005431 if (!extension_registry) return -1;
5432
5433 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005434 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005435 if (!inverted_registry) return -1;
5436
5437 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005438 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005439 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005441 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005442
Tim Peters731098b2003-02-04 20:56:09 +00005443 if (!(empty_tuple = PyTuple_New(0)))
5444 return -1;
5445
5446 two_tuple = PyTuple_New(2);
5447 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005448 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005449 /* We use this temp container with no regard to refcounts, or to
5450 * keeping containees alive. Exempt from GC, because we don't
5451 * want anything looking at two_tuple() by magic.
5452 */
5453 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005455 /* Ugh */
5456 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5457 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5458 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005460 if (!( t=PyDict_New())) return -1;
5461 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005462 "def __str__(self):\n"
5463 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5464 Py_file_input,
5465 module_dict, t) )) return -1;
5466 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005469 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005473
Tim Peterscba30e22003-02-01 06:24:36 +00005474 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005476 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005477 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 if (!( t=PyDict_New())) return -1;
5480 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005481 "def __str__(self):\n"
5482 " a=self.args\n"
5483 " a=a and type(a[0]) or '(what)'\n"
5484 " return 'Cannot pickle %s objects' % a\n"
5485 , Py_file_input,
5486 module_dict, t) )) return -1;
5487 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005489 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005490 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005491 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005493 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005495 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005496 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005498
Martin v. Löwis658009a2002-09-16 17:26:24 +00005499 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5500 UnpicklingError, NULL)))
5501 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005503 if (PyDict_SetItemString(module_dict, "PickleError",
5504 PickleError) < 0)
5505 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005507 if (PyDict_SetItemString(module_dict, "PicklingError",
5508 PicklingError) < 0)
5509 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005511 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5512 UnpicklingError) < 0)
5513 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005515 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5516 UnpickleableError) < 0)
5517 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005519 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5520 BadPickleGet) < 0)
5521 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005523 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005525 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005526}
5527
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005528#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5529#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005530#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005531PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005532initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005533{
5534 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005535 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005536 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005537 PyObject *format_version;
5538 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005540 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005541 Unpicklertype.ob_type = &PyType_Type;
5542 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005544 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005545 * so we're forced to use a temporary dictionary. :(
5546 */
5547 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 if (!di) return;
5549 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005551 /* Create the module and add the functions */
5552 m = Py_InitModule4("cPickle", cPickle_methods,
5553 cPickle_module_documentation,
5554 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005555 if (m == NULL)
5556 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005558 /* Add some symbolic constants to the module */
5559 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005560 v = PyString_FromString(rev);
5561 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005562 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005564 /* Copy data from di. Waaa. */
5565 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5566 if (PyObject_SetItem(d, k, v) < 0) {
5567 Py_DECREF(di);
5568 return;
5569 }
5570 }
5571 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005572
Tim Peters8587b3c2003-02-13 15:44:41 +00005573 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5574 if (i < 0)
5575 return;
5576
Tim Peters5b7da392003-02-04 00:21:07 +00005577 /* These are purely informational; no code uses them. */
5578 /* File format version we write. */
5579 format_version = PyString_FromString("2.0");
5580 /* Format versions we can read. */
5581 compatible_formats = Py_BuildValue("[sssss]",
5582 "1.0", /* Original protocol 0 */
5583 "1.1", /* Protocol 0 + INST */
5584 "1.2", /* Original protocol 1 */
5585 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005586 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005587 PyDict_SetItemString(d, "format_version", format_version);
5588 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5589 Py_XDECREF(format_version);
5590 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005591}