blob: 00641d83e8274b75bf7b299dce7226566bd07045 [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) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 char *newbuf = (char *)realloc(self->buf, n);
537 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000541 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = n;
543 }
Tim Peters84e87f32001-03-17 04:50:51 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 Py_BEGIN_ALLOW_THREADS
546 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
547 Py_END_ALLOW_THREADS
548 if (nbytesread != (size_t)n) {
549 if (feof(self->fp)) {
550 PyErr_SetNone(PyExc_EOFError);
551 return -1;
552 }
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 PyErr_SetFromErrno(PyExc_IOError);
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561}
562
563
Martin v. Löwis18e16552006-02-15 17:27:45 +0000564static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000565readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566{
567 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000570 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 PyErr_NoMemory();
572 return -1;
573 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 self->buf_size = 40;
575 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 i = 0;
578 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000579 int bigger;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000580 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000582 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 (self->buf[i] = getc(self->fp)) == '\n') {
584 self->buf[i + 1] = '\0';
585 *s = self->buf;
586 return i + 1;
587 }
588 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000589 bigger = self->buf_size << 1;
590 if (bigger <= 0) { /* overflow */
591 PyErr_NoMemory();
592 return -1;
593 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000594 newbuf = (char *)realloc(self->buf, bigger);
595 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 PyErr_NoMemory();
597 return -1;
598 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000599 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 }
Tim Peters84e87f32001-03-17 04:50:51 +0000602}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000603
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605static Py_ssize_t
606read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607{
608 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
611 PyErr_SetNone(PyExc_EOFError);
612 return -1;
613 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618}
619
620
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000622readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000624 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
628 return -1;
629 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000633 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634}
635
636
Martin v. Löwis18e16552006-02-15 17:27:45 +0000637static Py_ssize_t
638read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639{
640 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 ARG_TUP(self, bytes);
645 if (self->arg) {
646 str = PyObject_Call(self->read, self->arg, NULL);
647 FREE_ARG_TUP(self);
648 }
649 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 Py_XDECREF(self->last_string);
652 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (! (*s = PyString_AsString(str))) return -1;
655 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656}
657
658
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000660readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661{
662 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
666 return -1;
667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 if ((str_size = PyString_Size(str)) < 0)
670 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 Py_XDECREF(self->last_string);
673 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if (! (*s = PyString_AsString(str)))
676 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
Tim Petersee1a53c2003-02-02 02:57:53 +0000681/* Copy the first n bytes from s into newly malloc'ed memory, plus a
682 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
683 * The caller is responsible for free()'ing the return value.
684 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000686pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687{
Tim Petersee1a53c2003-02-02 02:57:53 +0000688 char *r = (char *)malloc(n+1);
689 if (r == NULL)
690 return (char*)PyErr_NoMemory();
691 memcpy(r, s, n);
692 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694}
695
696
697static int
Tim Peterscba30e22003-02-01 06:24:36 +0000698get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699{
700 PyObject *value, *mv;
701 long c_value;
702 char s[30];
703 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if (!( mv = PyDict_GetItem(self->memo, id))) {
706 PyErr_SetObject(PyExc_KeyError, id);
707 return -1;
708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Tim Peterscba30e22003-02-01 06:24:36 +0000710 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( PyInt_Check(value))) {
714 PyErr_SetString(PicklingError, "no int where int expected in memo");
715 return -1;
716 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000717 c_value = PyInt_AsLong(value);
718 if (c_value == -1 && PyErr_Occurred())
719 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 if (!self->bin) {
722 s[0] = GET;
723 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
724 len = strlen(s);
725 }
726 else if (Pdata_Check(self->file)) {
727 if (write_other(self, NULL, 0) < 0) return -1;
728 PDATA_APPEND(self->file, mv, -1);
729 return 0;
730 }
731 else {
732 if (c_value < 256) {
733 s[0] = BINGET;
734 s[1] = (int)(c_value & 0xff);
735 len = 2;
736 }
737 else {
738 s[0] = LONG_BINGET;
739 s[1] = (int)(c_value & 0xff);
740 s[2] = (int)((c_value >> 8) & 0xff);
741 s[3] = (int)((c_value >> 16) & 0xff);
742 s[4] = (int)((c_value >> 24) & 0xff);
743 len = 5;
744 }
745 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000746
Tim Peters0bc93f52003-02-02 18:29:33 +0000747 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000749
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000750 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000752
Guido van Rossum60456fd1997-04-09 17:36:32 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754static int
Tim Peterscba30e22003-02-01 06:24:36 +0000755put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756{
Tim Peterscba30e22003-02-01 06:24:36 +0000757 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000758 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760 return put2(self, ob);
761}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000762
Guido van Rossum053b8df1998-11-25 16:18:00 +0000763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764static int
Tim Peterscba30e22003-02-01 06:24:36 +0000765put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000766{
767 char c_str[30];
768 int p;
769 size_t len;
770 int res = -1;
771 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if (self->fast)
774 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 if ((p = PyDict_Size(self->memo)) < 0)
777 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000780 /* XXX Why?
781 * XXX And does "positive" really mean non-negative?
782 * XXX pickle.py starts with PUT index 0, not 1. This makes for
783 * XXX gratuitous differences between the pickling modules.
784 */
Tim Peterscba30e22003-02-01 06:24:36 +0000785 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000786
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
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 (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000792
Tim Peterscba30e22003-02-01 06:24:36 +0000793 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 PyTuple_SET_ITEM(t, 0, memo_len);
797 Py_INCREF(memo_len);
798 PyTuple_SET_ITEM(t, 1, ob);
799 Py_INCREF(ob);
800
801 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
802 goto finally;
803
804 if (!self->bin) {
805 c_str[0] = PUT;
806 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
807 len = strlen(c_str);
808 }
809 else if (Pdata_Check(self->file)) {
810 if (write_other(self, NULL, 0) < 0) return -1;
811 PDATA_APPEND(self->file, memo_len, -1);
812 res=0; /* Job well done ;) */
813 goto finally;
814 }
815 else {
816 if (p >= 256) {
817 c_str[0] = LONG_BINPUT;
818 c_str[1] = (int)(p & 0xff);
819 c_str[2] = (int)((p >> 8) & 0xff);
820 c_str[3] = (int)((p >> 16) & 0xff);
821 c_str[4] = (int)((p >> 24) & 0xff);
822 len = 5;
823 }
824 else {
825 c_str[0] = BINPUT;
826 c_str[1] = p;
827 len = 2;
828 }
829 }
830
Tim Peters0bc93f52003-02-02 18:29:33 +0000831 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 goto finally;
833
834 res = 0;
835
836 finally:
837 Py_XDECREF(py_ob_id);
838 Py_XDECREF(memo_len);
839 Py_XDECREF(t);
840
841 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000842}
843
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000844static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000845whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 PyObject *module = 0, *modules_dict = 0,
849 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000852 if (module)
853 return module;
854 if (PyErr_ExceptionMatches(PyExc_AttributeError))
855 PyErr_Clear();
856 else
857 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000858
Tim Peterscba30e22003-02-01 06:24:36 +0000859 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 i = 0;
863 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 global_name_attr = PyObject_GetAttr(module, global_name);
868 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
870 PyErr_Clear();
871 else
872 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 continue;
874 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 if (global_name_attr != global) {
877 Py_DECREF(global_name_attr);
878 continue;
879 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 break;
884 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886 /* The following implements the rule in pickle.py added in 1.5
887 that used __main__ if no module is found. I don't actually
888 like this rule. jlf
889 */
890 if (!j) {
891 j=1;
892 name=__main___str;
893 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 Py_INCREF(name);
896 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897}
898
899
Guido van Rossum60456fd1997-04-09 17:36:32 +0000900static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000901fast_save_enter(Picklerobject *self, PyObject *obj)
902{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 /* if fast_container < 0, we're doing an error exit. */
904 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
905 PyObject *key = NULL;
906 if (self->fast_memo == NULL) {
907 self->fast_memo = PyDict_New();
908 if (self->fast_memo == NULL) {
909 self->fast_container = -1;
910 return 0;
911 }
912 }
913 key = PyLong_FromVoidPtr(obj);
914 if (key == NULL)
915 return 0;
916 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000917 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000919 "fast mode: can't pickle cyclic objects "
920 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000921 obj->ob_type->tp_name, obj);
922 self->fast_container = -1;
923 return 0;
924 }
925 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000926 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 self->fast_container = -1;
928 return 0;
929 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000930 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933}
934
Tim Peterscba30e22003-02-01 06:24:36 +0000935int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000936fast_save_leave(Picklerobject *self, PyObject *obj)
937{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000938 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
939 PyObject *key = PyLong_FromVoidPtr(obj);
940 if (key == NULL)
941 return 0;
942 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000943 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000944 return 0;
945 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000946 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000949}
950
951static int
Tim Peterscba30e22003-02-01 06:24:36 +0000952save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953{
954 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000955 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000959}
960
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961static int
Tim Peterscba30e22003-02-01 06:24:36 +0000962save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000963{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000964 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000965 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000966 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967
Tim Peters3c67d792003-02-02 17:59:11 +0000968 if (self->proto >= 2) {
969 char opcode = l ? NEWTRUE : NEWFALSE;
970 if (self->write_func(self, &opcode, 1) < 0)
971 return -1;
972 }
973 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000974 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 return 0;
976}
Tim Peters84e87f32001-03-17 04:50:51 +0000977
Guido van Rossum60456fd1997-04-09 17:36:32 +0000978static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000979save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980{
981 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000984 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000985#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 || l > 0x7fffffffL
987 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000988#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 ) {
990 /* Text-mode pickle, or long too big to fit in the 4-byte
991 * signed BININT format: store as a string.
992 */
993 c_str[0] = INT;
994 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000995 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 return -1;
997 }
998 else {
999 /* Binary pickle and l fits in a signed 4-byte int. */
1000 c_str[1] = (int)( l & 0xff);
1001 c_str[2] = (int)((l >> 8) & 0xff);
1002 c_str[3] = (int)((l >> 16) & 0xff);
1003 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1006 if (c_str[2] == 0) {
1007 c_str[0] = BININT1;
1008 len = 2;
1009 }
1010 else {
1011 c_str[0] = BININT2;
1012 len = 3;
1013 }
1014 }
1015 else {
1016 c_str[0] = BININT;
1017 len = 5;
1018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return -1;
1022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025}
1026
1027
1028static int
Tim Peterscba30e22003-02-01 06:24:36 +00001029save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001032 int res = -1;
1033 PyObject *repr = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001034 int val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Guido van Rossumddefaf32007-01-14 03:31:43 +00001037 if (val == -1 && PyErr_Occurred()) {
1038 /* out of range for int pickling */
1039 PyErr_Clear();
1040 }
1041 else
1042 return save_int(self, val);
1043
Tim Petersee1a53c2003-02-02 02:57:53 +00001044 if (self->proto >= 2) {
1045 /* Linear-time pickling. */
1046 size_t nbits;
1047 size_t nbytes;
1048 unsigned char *pdata;
1049 char c_str[5];
1050 int i;
1051 int sign = _PyLong_Sign(args);
1052
1053 if (sign == 0) {
1054 /* It's 0 -- an empty bytestring. */
1055 c_str[0] = LONG1;
1056 c_str[1] = 0;
1057 i = self->write_func(self, c_str, 2);
1058 if (i < 0) goto finally;
1059 res = 0;
1060 goto finally;
1061 }
1062 nbits = _PyLong_NumBits(args);
1063 if (nbits == (size_t)-1 && PyErr_Occurred())
1064 goto finally;
1065 /* How many bytes do we need? There are nbits >> 3 full
1066 * bytes of data, and nbits & 7 leftover bits. If there
1067 * are any leftover bits, then we clearly need another
1068 * byte. Wnat's not so obvious is that we *probably*
1069 * need another byte even if there aren't any leftovers:
1070 * the most-significant bit of the most-significant byte
1071 * acts like a sign bit, and it's usually got a sense
1072 * opposite of the one we need. The exception is longs
1073 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1074 * its own 256's-complement, so has the right sign bit
1075 * even without the extra byte. That's a pain to check
1076 * for in advance, though, so we always grab an extra
1077 * byte at the start, and cut it back later if possible.
1078 */
1079 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001080 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001081 PyErr_SetString(PyExc_OverflowError, "long too large "
1082 "to pickle");
1083 goto finally;
1084 }
1085 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1086 if (repr == NULL) goto finally;
1087 pdata = (unsigned char *)PyString_AS_STRING(repr);
1088 i = _PyLong_AsByteArray((PyLongObject *)args,
1089 pdata, nbytes,
1090 1 /* little endian */, 1 /* signed */);
1091 if (i < 0) goto finally;
1092 /* If the long is negative, this may be a byte more than
1093 * needed. This is so iff the MSB is all redundant sign
1094 * bits.
1095 */
1096 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1097 (pdata[nbytes - 2] & 0x80) != 0)
1098 --nbytes;
1099
1100 if (nbytes < 256) {
1101 c_str[0] = LONG1;
1102 c_str[1] = (char)nbytes;
1103 size = 2;
1104 }
1105 else {
1106 c_str[0] = LONG4;
1107 size = (int)nbytes;
1108 for (i = 1; i < 5; i++) {
1109 c_str[i] = (char)(size & 0xff);
1110 size >>= 8;
1111 }
1112 size = 5;
1113 }
1114 i = self->write_func(self, c_str, size);
1115 if (i < 0) goto finally;
1116 i = self->write_func(self, (char *)pdata, (int)nbytes);
1117 if (i < 0) goto finally;
1118 res = 0;
1119 goto finally;
1120 }
1121
1122 /* proto < 2: write the repr and newline. This is quadratic-time
1123 * (in the number of digits), in both directions.
1124 */
Tim Peterscba30e22003-02-01 06:24:36 +00001125 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 if ((size = PyString_Size(repr)) < 0)
1129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self,
1135 PyString_AS_STRING((PyStringObject *)repr),
1136 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 finally:
1145 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147}
1148
1149
1150static int
Tim Peterscba30e22003-02-01 06:24:36 +00001151save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152{
1153 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001157 str[0] = BINFLOAT;
1158 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001160 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 return -1;
1162 }
1163 else {
1164 char c_str[250];
1165 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1167 /* Extend the formatted string with a newline character */
1168 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Tim Peters0bc93f52003-02-02 18:29:33 +00001170 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return -1;
1172 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175}
1176
1177
1178static int
Tim Peterscba30e22003-02-01 06:24:36 +00001179save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180{
1181 int size, len;
1182 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if ((size = PyString_Size(args)) < 0)
1185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 if (!self->bin) {
1188 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Tim Peterscba30e22003-02-01 06:24:36 +00001192 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if ((len = PyString_Size(repr)) < 0)
1196 goto err;
1197 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Tim Peters0bc93f52003-02-02 18:29:33 +00001199 if (self->write_func(self, &string, 1) < 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, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Tim Peters0bc93f52003-02-02 18:29:33 +00001205 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 Py_XDECREF(repr);
1209 }
1210 else {
1211 int i;
1212 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if ((size = PyString_Size(args)) < 0)
1215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 if (size < 256) {
1218 c_str[0] = SHORT_BINSTRING;
1219 c_str[1] = size;
1220 len = 2;
1221 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001222 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 c_str[0] = BINSTRING;
1224 for (i = 1; i < 5; i++)
1225 c_str[i] = (int)(size >> ((i - 1) * 8));
1226 len = 5;
1227 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 else
1229 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Tim Peters0bc93f52003-02-02 18:29:33 +00001231 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 if (size > 128 && Pdata_Check(self->file)) {
1235 if (write_other(self, NULL, 0) < 0) return -1;
1236 PDATA_APPEND(self->file, args, -1);
1237 }
1238 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001239 if (self->write_func(self,
1240 PyString_AS_STRING(
1241 (PyStringObject *)args),
1242 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return -1;
1244 }
1245 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 if (doput)
1248 if (put(self, args) < 0)
1249 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 err:
1254 Py_XDECREF(repr);
1255 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256}
1257
1258
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1260 backslash and newline characters to \uXXXX escapes. */
1261static PyObject *
1262modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1263{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264 PyObject *repr;
1265 char *p;
1266 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 repr = PyString_FromStringAndSize(NULL, 6 * size);
1271 if (repr == NULL)
1272 return NULL;
1273 if (size == 0)
1274 return repr;
1275
1276 p = q = PyString_AS_STRING(repr);
1277 while (size-- > 0) {
1278 Py_UNICODE ch = *s++;
1279 /* Map 16-bit characters to '\uxxxx' */
1280 if (ch >= 256 || ch == '\\' || ch == '\n') {
1281 *p++ = '\\';
1282 *p++ = 'u';
1283 *p++ = hexdigit[(ch >> 12) & 0xf];
1284 *p++ = hexdigit[(ch >> 8) & 0xf];
1285 *p++ = hexdigit[(ch >> 4) & 0xf];
1286 *p++ = hexdigit[ch & 15];
1287 }
1288 /* Copy everything else as-is */
1289 else
1290 *p++ = (char) ch;
1291 }
1292 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001293 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001294 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001295}
1296
1297
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298static int
Tim Peterscba30e22003-02-01 06:24:36 +00001299save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001301 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 if (!PyUnicode_Check(args))
1305 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if (!self->bin) {
1308 char *repr_str;
1309 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 repr = modified_EncodeRawUnicodeEscape(
1312 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001313 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if ((len = PyString_Size(repr)) < 0)
1317 goto err;
1318 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001319
Tim Peters0bc93f52003-02-02 18:29:33 +00001320 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Tim Peters0bc93f52003-02-02 18:29:33 +00001323 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Tim Peters0bc93f52003-02-02 18:29:33 +00001326 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 Py_XDECREF(repr);
1330 }
1331 else {
1332 int i;
1333 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Tim Peterscba30e22003-02-01 06:24:36 +00001335 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Guido van Rossum617dbc42007-05-07 23:57:08 +00001338 assert(PyBytes_Check(repr));
1339 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 if (size > INT_MAX)
1342 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 c_str[0] = BINUNICODE;
1345 for (i = 1; i < 5; i++)
1346 c_str[i] = (int)(size >> ((i - 1) * 8));
1347 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001348
Tim Peters0bc93f52003-02-02 18:29:33 +00001349 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if (size > 128 && Pdata_Check(self->file)) {
1353 if (write_other(self, NULL, 0) < 0)
1354 goto err;
1355 PDATA_APPEND(self->file, repr, -1);
1356 }
1357 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001358 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001359 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 goto err;
1361 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 Py_DECREF(repr);
1364 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (doput)
1367 if (put(self, args) < 0)
1368 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372 err:
1373 Py_XDECREF(repr);
1374 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375}
1376
Tim Peters1d63c9f2003-02-02 20:29:39 +00001377/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1378static int
Tim Peters67920142003-02-05 03:46:17 +00001379store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001380{
1381 int i;
1382 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001383
Tim Peters1d63c9f2003-02-02 20:29:39 +00001384 assert(PyTuple_Size(t) == len);
1385
1386 for (i = 0; i < len; i++) {
1387 PyObject *element = PyTuple_GET_ITEM(t, i);
1388
1389 if (element == NULL)
1390 goto finally;
1391 if (save(self, element, 0) < 0)
1392 goto finally;
1393 }
1394 res = 0;
1395
1396 finally:
1397 return res;
1398}
1399
1400/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1401 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001402 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001403 * (a tuple can be reached from itself), and that requires some subtle
1404 * magic so that it works in all cases. IOW, this is a long routine.
1405 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406static int
Tim Peterscba30e22003-02-01 06:24:36 +00001407save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001409 PyObject *py_tuple_id = NULL;
1410 int len, i;
1411 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001414 static char pop = POP;
1415 static char pop_mark = POP_MARK;
1416 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 if ((len = PyTuple_Size(args)) < 0)
1419 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420
Tim Peters1d63c9f2003-02-02 20:29:39 +00001421 if (len == 0) {
1422 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001423
Tim Peters1d63c9f2003-02-02 20:29:39 +00001424 if (self->proto) {
1425 c_str[0] = EMPTY_TUPLE;
1426 len = 1;
1427 }
1428 else {
1429 c_str[0] = MARK;
1430 c_str[1] = TUPLE;
1431 len = 2;
1432 }
1433 if (self->write_func(self, c_str, len) >= 0)
1434 res = 0;
1435 /* Don't memoize an empty tuple. */
1436 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001438
Tim Peters1d63c9f2003-02-02 20:29:39 +00001439 /* A non-empty tuple. */
1440
1441 /* id(tuple) isn't in the memo now. If it shows up there after
1442 * saving the tuple elements, the tuple must be recursive, in
1443 * which case we'll pop everything we put on the stack, and fetch
1444 * its value from the memo.
1445 */
1446 py_tuple_id = PyLong_FromVoidPtr(args);
1447 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
Tim Peters1d63c9f2003-02-02 20:29:39 +00001450 if (len <= 3 && self->proto >= 2) {
1451 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001452 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001453 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001455 /* pop the len elements */
1456 for (i = 0; i < len; ++i)
1457 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001459 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (get(self, py_tuple_id) < 0)
1461 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 res = 0;
1463 goto finally;
1464 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001465 /* Not recursive. */
1466 if (self->write_func(self, len2opcode + len, 1) < 0)
1467 goto finally;
1468 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Tim Peters1d63c9f2003-02-02 20:29:39 +00001471 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1472 * Generate MARK elt1 elt2 ... TUPLE
1473 */
1474 if (self->write_func(self, &MARKv, 1) < 0)
1475 goto finally;
1476
Tim Peters67920142003-02-05 03:46:17 +00001477 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001478 goto finally;
1479
1480 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1481 /* pop the stack stuff we pushed */
1482 if (self->bin) {
1483 if (self->write_func(self, &pop_mark, 1) < 0)
1484 goto finally;
1485 }
1486 else {
1487 /* Note that we pop one more than len, to remove
1488 * the MARK too.
1489 */
1490 for (i = 0; i <= len; i++)
1491 if (self->write_func(self, &pop, 1) < 0)
1492 goto finally;
1493 }
1494 /* fetch from memo */
1495 if (get(self, py_tuple_id) >= 0)
1496 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001497 goto finally;
1498 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499
Tim Peters1d63c9f2003-02-02 20:29:39 +00001500 /* Not recursive. */
1501 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001503
Tim Peters1d63c9f2003-02-02 20:29:39 +00001504 memoize:
1505 if (put(self, args) >= 0)
1506 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 finally:
1509 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511}
1512
Tim Peters1092d642003-02-11 21:06:20 +00001513/* iter is an iterator giving items, and we batch up chunks of
1514 * MARK item item ... item APPENDS
1515 * opcode sequences. Calling code should have arranged to first create an
1516 * empty list, or list-like object, for the APPENDS to operate on.
1517 * Returns 0 on success, <0 on error.
1518 */
1519static int
1520batch_list(Picklerobject *self, PyObject *iter)
1521{
1522 PyObject *obj;
1523 PyObject *slice[BATCHSIZE];
1524 int i, n;
1525
1526 static char append = APPEND;
1527 static char appends = APPENDS;
1528
1529 assert(iter != NULL);
1530
1531 if (self->proto == 0) {
1532 /* APPENDS isn't available; do one at a time. */
1533 for (;;) {
1534 obj = PyIter_Next(iter);
1535 if (obj == NULL) {
1536 if (PyErr_Occurred())
1537 return -1;
1538 break;
1539 }
1540 i = save(self, obj, 0);
1541 Py_DECREF(obj);
1542 if (i < 0)
1543 return -1;
1544 if (self->write_func(self, &append, 1) < 0)
1545 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001546 }
1547 return 0;
1548 }
1549
1550 /* proto > 0: write in batches of BATCHSIZE. */
1551 do {
1552 /* Get next group of (no more than) BATCHSIZE elements. */
1553 for (n = 0; n < BATCHSIZE; ++n) {
1554 obj = PyIter_Next(iter);
1555 if (obj == NULL) {
1556 if (PyErr_Occurred())
1557 goto BatchFailed;
1558 break;
1559 }
1560 slice[n] = obj;
1561 }
1562
1563 if (n > 1) {
1564 /* Pump out MARK, slice[0:n], APPENDS. */
1565 if (self->write_func(self, &MARKv, 1) < 0)
1566 goto BatchFailed;
1567 for (i = 0; i < n; ++i) {
1568 if (save(self, slice[i], 0) < 0)
1569 goto BatchFailed;
1570 }
1571 if (self->write_func(self, &appends, 1) < 0)
1572 goto BatchFailed;
1573 }
1574 else if (n == 1) {
1575 if (save(self, slice[0], 0) < 0)
1576 goto BatchFailed;
1577 if (self->write_func(self, &append, 1) < 0)
1578 goto BatchFailed;
1579 }
1580
1581 for (i = 0; i < n; ++i) {
1582 Py_DECREF(slice[i]);
1583 }
Tim Peters90975f12003-02-12 05:28:58 +00001584 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001585 return 0;
1586
1587BatchFailed:
1588 while (--n >= 0) {
1589 Py_DECREF(slice[n]);
1590 }
1591 return -1;
1592}
1593
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594static int
Tim Peterscba30e22003-02-01 06:24:36 +00001595save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596{
Tim Peters1092d642003-02-11 21:06:20 +00001597 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001599 int len;
1600 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 if (self->fast && !fast_save_enter(self, args))
1603 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001604
Tim Peters1092d642003-02-11 21:06:20 +00001605 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 if (self->bin) {
1607 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001608 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 }
1610 else {
1611 s[0] = MARK;
1612 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001613 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Tim Peters1092d642003-02-11 21:06:20 +00001616 if (self->write_func(self, s, len) < 0)
1617 goto finally;
1618
1619 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 if ((len = PyList_Size(args)) < 0)
1621 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001622
Tim Peters1092d642003-02-11 21:06:20 +00001623 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001625 if (put(self, args) >= 0)
1626 res = 0;
1627 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 }
Tim Peters90975f12003-02-12 05:28:58 +00001629 if (put2(self, args) < 0)
1630 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631
Tim Peters1092d642003-02-11 21:06:20 +00001632 /* Materialize the list elements. */
1633 iter = PyObject_GetIter(args);
1634 if (iter == NULL)
1635 goto finally;
1636 res = batch_list(self, iter);
1637 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 finally:
1640 if (self->fast && !fast_save_leave(self, args))
1641 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001644}
1645
1646
Tim Peters42f08ac2003-02-11 22:43:24 +00001647/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1648 * MARK key value ... key value SETITEMS
1649 * opcode sequences. Calling code should have arranged to first create an
1650 * empty dict, or dict-like object, for the SETITEMS to operate on.
1651 * Returns 0 on success, <0 on error.
1652 *
1653 * This is very much like batch_list(). The difference between saving
1654 * elements directly, and picking apart two-tuples, is so long-winded at
1655 * the C level, though, that attempts to combine these routines were too
1656 * ugly to bear.
1657 */
1658static int
1659batch_dict(Picklerobject *self, PyObject *iter)
1660{
1661 PyObject *p;
1662 PyObject *slice[BATCHSIZE];
1663 int i, n;
1664
1665 static char setitem = SETITEM;
1666 static char setitems = SETITEMS;
1667
1668 assert(iter != NULL);
1669
1670 if (self->proto == 0) {
1671 /* SETITEMS isn't available; do one at a time. */
1672 for (;;) {
1673 p = PyIter_Next(iter);
1674 if (p == NULL) {
1675 if (PyErr_Occurred())
1676 return -1;
1677 break;
1678 }
1679 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1680 PyErr_SetString(PyExc_TypeError, "dict items "
1681 "iterator must return 2-tuples");
1682 return -1;
1683 }
1684 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1685 if (i >= 0)
1686 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1687 Py_DECREF(p);
1688 if (i < 0)
1689 return -1;
1690 if (self->write_func(self, &setitem, 1) < 0)
1691 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001692 }
1693 return 0;
1694 }
1695
1696 /* proto > 0: write in batches of BATCHSIZE. */
1697 do {
1698 /* Get next group of (no more than) BATCHSIZE elements. */
1699 for (n = 0; n < BATCHSIZE; ++n) {
1700 p = PyIter_Next(iter);
1701 if (p == NULL) {
1702 if (PyErr_Occurred())
1703 goto BatchFailed;
1704 break;
1705 }
1706 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1707 PyErr_SetString(PyExc_TypeError, "dict items "
1708 "iterator must return 2-tuples");
1709 goto BatchFailed;
1710 }
1711 slice[n] = p;
1712 }
1713
1714 if (n > 1) {
1715 /* Pump out MARK, slice[0:n], SETITEMS. */
1716 if (self->write_func(self, &MARKv, 1) < 0)
1717 goto BatchFailed;
1718 for (i = 0; i < n; ++i) {
1719 p = slice[i];
1720 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1721 goto BatchFailed;
1722 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1723 goto BatchFailed;
1724 }
1725 if (self->write_func(self, &setitems, 1) < 0)
1726 goto BatchFailed;
1727 }
1728 else if (n == 1) {
1729 p = slice[0];
1730 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1731 goto BatchFailed;
1732 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1733 goto BatchFailed;
1734 if (self->write_func(self, &setitem, 1) < 0)
1735 goto BatchFailed;
1736 }
1737
1738 for (i = 0; i < n; ++i) {
1739 Py_DECREF(slice[i]);
1740 }
Tim Peters90975f12003-02-12 05:28:58 +00001741 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001742 return 0;
1743
1744BatchFailed:
1745 while (--n >= 0) {
1746 Py_DECREF(slice[n]);
1747 }
1748 return -1;
1749}
1750
Guido van Rossum60456fd1997-04-09 17:36:32 +00001751static int
Tim Peterscba30e22003-02-01 06:24:36 +00001752save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753{
Tim Peters42f08ac2003-02-11 22:43:24 +00001754 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001756 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001757 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if (self->fast && !fast_save_enter(self, args))
1760 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001761
Tim Peters42f08ac2003-02-11 22:43:24 +00001762 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if (self->bin) {
1764 s[0] = EMPTY_DICT;
1765 len = 1;
1766 }
1767 else {
1768 s[0] = MARK;
1769 s[1] = DICT;
1770 len = 2;
1771 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Tim Peters0bc93f52003-02-02 18:29:33 +00001773 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Tim Peters42f08ac2003-02-11 22:43:24 +00001776 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 if ((len = PyDict_Size(args)) < 0)
1778 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001781 if (put(self, args) >= 0)
1782 res = 0;
1783 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 }
Tim Peters90975f12003-02-12 05:28:58 +00001785 if (put2(self, args) < 0)
1786 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001787
Tim Peters42f08ac2003-02-11 22:43:24 +00001788 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001789 items = PyObject_CallMethod(args, "items", "()");
1790 if (items == NULL)
1791 goto finally;
1792 iter = PyObject_GetIter(items);
1793 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001794 if (iter == NULL)
1795 goto finally;
1796 res = batch_dict(self, iter);
1797 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 finally:
1800 if (self->fast && !fast_save_leave(self, args))
1801 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804}
1805
1806
Guido van Rossum60456fd1997-04-09 17:36:32 +00001807static int
Tim Peterscba30e22003-02-01 06:24:36 +00001808save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001810 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 char *name_str, *module_str;
1812 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 if (name) {
1817 global_name = name;
1818 Py_INCREF(global_name);
1819 }
1820 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001821 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
1823 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peterscba30e22003-02-01 06:24:36 +00001825 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if ((module_size = PyString_Size(module)) < 0 ||
1829 (name_size = PyString_Size(global_name)) < 0)
1830 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 module_str = PyString_AS_STRING((PyStringObject *)module);
1833 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Guido van Rossum75bfd052002-12-24 18:10:07 +00001835 /* XXX This can be doing a relative import. Clearly it shouldn't,
1836 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 mod = PyImport_ImportModule(module_str);
1838 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001840 "Can't pickle %s: import of module %s "
1841 "failed",
1842 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 goto finally;
1844 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001845 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if (klass == NULL) {
1847 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001848 "Can't pickle %s: attribute lookup %s.%s "
1849 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 "OSS", args, module, global_name);
1851 goto finally;
1852 }
1853 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001854 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001856 "Can't pickle %s: it's not the same object "
1857 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 "OSS", args, module, global_name);
1859 goto finally;
1860 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001861 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001862
Tim Peters731098b2003-02-04 20:56:09 +00001863 if (self->proto >= 2) {
1864 /* See whether this is in the extension registry, and if
1865 * so generate an EXT opcode.
1866 */
1867 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001868 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001869 char c_str[5];
1870 int n;
1871
1872 PyTuple_SET_ITEM(two_tuple, 0, module);
1873 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1874 py_code = PyDict_GetItem(extension_registry, two_tuple);
1875 if (py_code == NULL)
1876 goto gen_global; /* not registered */
1877
1878 /* Verify py_code has the right type and value. */
1879 if (!PyInt_Check(py_code)) {
1880 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001881 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001882 "OO", args, py_code);
1883 goto finally;
1884 }
1885 code = PyInt_AS_LONG(py_code);
1886 if (code <= 0 || code > 0x7fffffffL) {
1887 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1888 "extension code %ld is out of range",
1889 "Ol", args, code);
1890 goto finally;
1891 }
1892
1893 /* Generate an EXT opcode. */
1894 if (code <= 0xff) {
1895 c_str[0] = EXT1;
1896 c_str[1] = (char)code;
1897 n = 2;
1898 }
1899 else if (code <= 0xffff) {
1900 c_str[0] = EXT2;
1901 c_str[1] = (char)(code & 0xff);
1902 c_str[2] = (char)((code >> 8) & 0xff);
1903 n = 3;
1904 }
1905 else {
1906 c_str[0] = EXT4;
1907 c_str[1] = (char)(code & 0xff);
1908 c_str[2] = (char)((code >> 8) & 0xff);
1909 c_str[3] = (char)((code >> 16) & 0xff);
1910 c_str[4] = (char)((code >> 24) & 0xff);
1911 n = 5;
1912 }
1913
1914 if (self->write_func(self, c_str, n) >= 0)
1915 res = 0;
1916 goto finally; /* and don't memoize */
1917 }
1918
1919 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001920 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Tim Peters0bc93f52003-02-02 18:29:33 +00001923 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Tim Peters0bc93f52003-02-02 18:29:33 +00001926 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Tim Peters0bc93f52003-02-02 18:29:33 +00001929 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Tim Peters0bc93f52003-02-02 18:29:33 +00001932 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if (put(self, args) < 0)
1936 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 finally:
1941 Py_XDECREF(module);
1942 Py_XDECREF(global_name);
1943 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946}
1947
Guido van Rossum60456fd1997-04-09 17:36:32 +00001948static int
Tim Peterscba30e22003-02-01 06:24:36 +00001949save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950{
1951 PyObject *pid = 0;
1952 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 Py_INCREF(args);
1957 ARG_TUP(self, args);
1958 if (self->arg) {
1959 pid = PyObject_Call(f, self->arg, NULL);
1960 FREE_ARG_TUP(self);
1961 }
1962 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 if (pid != Py_None) {
1965 if (!self->bin) {
1966 if (!PyString_Check(pid)) {
1967 PyErr_SetString(PicklingError,
1968 "persistent id must be string");
1969 goto finally;
1970 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001971
Tim Peters0bc93f52003-02-02 18:29:33 +00001972 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if ((size = PyString_Size(pid)) < 0)
1976 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Tim Peters0bc93f52003-02-02 18:29:33 +00001978 if (self->write_func(self,
1979 PyString_AS_STRING(
1980 (PyStringObject *)pid),
1981 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001982 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001983
Tim Peters0bc93f52003-02-02 18:29:33 +00001984 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 res = 1;
1988 goto finally;
1989 }
1990 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001991 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 res = -1;
1993 else
1994 res = 1;
1995 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 goto finally;
1998 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 finally:
2003 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002006}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002007
Tim Peters71fcda52003-02-14 23:05:28 +00002008/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2009 * appropriate __reduce__ method for ob.
2010 */
Tim Peters84e87f32001-03-17 04:50:51 +00002011static int
Tim Peters71fcda52003-02-14 23:05:28 +00002012save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013{
Tim Peters71fcda52003-02-14 23:05:28 +00002014 PyObject *callable;
2015 PyObject *argtup;
2016 PyObject *state = NULL;
2017 PyObject *listitems = NULL;
2018 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002019
Tim Peters71fcda52003-02-14 23:05:28 +00002020 int use_newobj = self->proto >= 2;
2021
2022 static char reduce = REDUCE;
2023 static char build = BUILD;
2024 static char newobj = NEWOBJ;
2025
2026 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2027 &callable,
2028 &argtup,
2029 &state,
2030 &listitems,
2031 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002034 if (!PyTuple_Check(argtup)) {
2035 PyErr_SetString(PicklingError,
2036 "args from reduce() should be a tuple");
2037 return -1;
2038 }
2039
Tim Peters71fcda52003-02-14 23:05:28 +00002040 if (state == Py_None)
2041 state = NULL;
2042 if (listitems == Py_None)
2043 listitems = NULL;
2044 if (dictitems == Py_None)
2045 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002046
Tim Peters71fcda52003-02-14 23:05:28 +00002047 /* Protocol 2 special case: if callable's name is __newobj__, use
2048 * NEWOBJ. This consumes a lot of code.
2049 */
2050 if (use_newobj) {
2051 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Tim Peters71fcda52003-02-14 23:05:28 +00002053 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002054 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2055 PyErr_Clear();
2056 else
2057 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002058 use_newobj = 0;
2059 }
2060 else {
2061 use_newobj = PyString_Check(temp) &&
2062 strcmp(PyString_AS_STRING(temp),
2063 "__newobj__") == 0;
2064 Py_DECREF(temp);
2065 }
2066 }
2067 if (use_newobj) {
2068 PyObject *cls;
2069 PyObject *newargtup;
2070 int n, i;
2071
2072 /* Sanity checks. */
2073 n = PyTuple_Size(argtup);
2074 if (n < 1) {
2075 PyErr_SetString(PicklingError, "__newobj__ arglist "
2076 "is empty");
2077 return -1;
2078 }
2079
2080 cls = PyTuple_GET_ITEM(argtup, 0);
2081 if (! PyObject_HasAttrString(cls, "__new__")) {
2082 PyErr_SetString(PicklingError, "args[0] from "
2083 "__newobj__ args has no __new__");
2084 return -1;
2085 }
2086
2087 /* XXX How could ob be NULL? */
2088 if (ob != NULL) {
2089 PyObject *ob_dot_class;
2090
2091 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002092 if (ob_dot_class == NULL) {
2093 if (PyErr_ExceptionMatches(
2094 PyExc_AttributeError))
2095 PyErr_Clear();
2096 else
2097 return -1;
2098 }
Tim Peters71fcda52003-02-14 23:05:28 +00002099 i = ob_dot_class != cls; /* true iff a problem */
2100 Py_XDECREF(ob_dot_class);
2101 if (i) {
2102 PyErr_SetString(PicklingError, "args[0] from "
2103 "__newobj__ args has the wrong class");
2104 return -1;
2105 }
2106 }
2107
2108 /* Save the class and its __new__ arguments. */
2109 if (save(self, cls, 0) < 0)
2110 return -1;
2111
2112 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2113 if (newargtup == NULL)
2114 return -1;
2115 for (i = 1; i < n; ++i) {
2116 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2117 Py_INCREF(temp);
2118 PyTuple_SET_ITEM(newargtup, i-1, temp);
2119 }
2120 i = save(self, newargtup, 0) < 0;
2121 Py_DECREF(newargtup);
2122 if (i < 0)
2123 return -1;
2124
2125 /* Add NEWOBJ opcode. */
2126 if (self->write_func(self, &newobj, 1) < 0)
2127 return -1;
2128 }
2129 else {
2130 /* Not using NEWOBJ. */
2131 if (save(self, callable, 0) < 0 ||
2132 save(self, argtup, 0) < 0 ||
2133 self->write_func(self, &reduce, 1) < 0)
2134 return -1;
2135 }
2136
2137 /* Memoize. */
2138 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 if (ob != NULL) {
2140 if (state && !PyDict_Check(state)) {
2141 if (put2(self, ob) < 0)
2142 return -1;
2143 }
Tim Peters71fcda52003-02-14 23:05:28 +00002144 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 }
Tim Peters84e87f32001-03-17 04:50:51 +00002147
Guido van Rossum60456fd1997-04-09 17:36:32 +00002148
Tim Peters71fcda52003-02-14 23:05:28 +00002149 if (listitems && batch_list(self, listitems) < 0)
2150 return -1;
2151
2152 if (dictitems && batch_dict(self, dictitems) < 0)
2153 return -1;
2154
2155 if (state) {
2156 if (save(self, state, 0) < 0 ||
2157 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 return -1;
2159 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002162}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002163
Guido van Rossum60456fd1997-04-09 17:36:32 +00002164static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002165save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002166{
2167 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002168 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2169 PyObject *arg_tup;
2170 int res = -1;
2171 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002172
Martin v. Löwis5a395302002-08-04 08:20:23 +00002173 if (self->nesting++ > Py_GetRecursionLimit()){
2174 PyErr_SetString(PyExc_RuntimeError,
2175 "maximum recursion depth exceeded");
2176 goto finally;
2177 }
2178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 if (!pers_save && self->pers_func) {
2180 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2181 res = tmp;
2182 goto finally;
2183 }
2184 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 if (args == Py_None) {
2187 res = save_none(self, args);
2188 goto finally;
2189 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002193 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002194 case 'b':
2195 if (args == Py_False || args == Py_True) {
2196 res = save_bool(self, args);
2197 goto finally;
2198 }
2199 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002200 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002201 if (type == &PyLong_Type) {
2202 res = save_long(self, args);
2203 goto finally;
2204 }
2205 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002206
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 if (type == &PyFloat_Type) {
2209 res = save_float(self, args);
2210 goto finally;
2211 }
2212 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002213
Guido van Rossum60456fd1997-04-09 17:36:32 +00002214 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002215 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2216 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002217 goto finally;
2218 }
2219 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002220
Guido van Rossum32c38e72007-05-07 17:15:57 +00002221 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002222 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2223 res = save_string(self, args, 0);
2224 goto finally;
2225 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2227 res = save_unicode(self, args, 0);
2228 goto finally;
2229 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002233 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 if (PyDict_GetItem(self->memo, py_ob_id)) {
2237 if (get(self, py_ob_id) < 0)
2238 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002240 res = 0;
2241 goto finally;
2242 }
2243 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002246 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002247 if (type == &PyString_Type) {
2248 res = save_string(self, args, 1);
2249 goto finally;
2250 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 if (type == &PyUnicode_Type) {
2252 res = save_unicode(self, args, 1);
2253 goto finally;
2254 }
2255 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002256
Guido van Rossum60456fd1997-04-09 17:36:32 +00002257 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 if (type == &PyTuple_Type) {
2259 res = save_tuple(self, args);
2260 goto finally;
2261 }
2262 if (type == &PyType_Type) {
2263 res = save_global(self, args, NULL);
2264 goto finally;
2265 }
2266 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002267
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269 if (type == &PyList_Type) {
2270 res = save_list(self, args);
2271 goto finally;
2272 }
2273 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002274
2275 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276 if (type == &PyDict_Type) {
2277 res = save_dict(self, args);
2278 goto finally;
2279 }
2280 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002282 case 'i':
2283 break;
2284
2285 case 'c':
2286 break;
2287
Guido van Rossum60456fd1997-04-09 17:36:32 +00002288 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 if (type == &PyFunction_Type) {
2290 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002291 if (res && PyErr_ExceptionMatches(PickleError)) {
2292 /* fall back to reduce */
2293 PyErr_Clear();
2294 break;
2295 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 goto finally;
2297 }
2298 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299
2300 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301 if (type == &PyCFunction_Type) {
2302 res = save_global(self, args, NULL);
2303 goto finally;
2304 }
2305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 if (!pers_save && self->inst_pers_func) {
2308 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2309 res = tmp;
2310 goto finally;
2311 }
2312 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313
Jeremy Hylton39c61162002-07-16 19:47:43 +00002314 if (PyType_IsSubtype(type, &PyType_Type)) {
2315 res = save_global(self, args, NULL);
2316 goto finally;
2317 }
2318
Guido van Rossumb289b872003-02-19 01:45:13 +00002319 /* Get a reduction callable, and call it. This may come from
2320 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2321 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002322 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002323 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2324 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002326 Py_INCREF(args);
2327 ARG_TUP(self, args);
2328 if (self->arg) {
2329 t = PyObject_Call(__reduce__, self->arg, NULL);
2330 FREE_ARG_TUP(self);
2331 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 }
2333 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002334 /* Check for a __reduce_ex__ method. */
2335 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2336 if (__reduce__ != NULL) {
2337 t = PyInt_FromLong(self->proto);
2338 if (t != NULL) {
2339 ARG_TUP(self, t);
2340 t = NULL;
2341 if (self->arg) {
2342 t = PyObject_Call(__reduce__,
2343 self->arg, NULL);
2344 FREE_ARG_TUP(self);
2345 }
2346 }
2347 }
2348 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002349 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2350 PyErr_Clear();
2351 else
2352 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002353 /* Check for a __reduce__ method. */
2354 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2355 if (__reduce__ != NULL) {
2356 t = PyObject_Call(__reduce__,
2357 empty_tuple, NULL);
2358 }
2359 else {
2360 PyErr_SetObject(UnpickleableError, args);
2361 goto finally;
2362 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002365
Tim Peters71fcda52003-02-14 23:05:28 +00002366 if (t == NULL)
2367 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002368
Tim Peters71fcda52003-02-14 23:05:28 +00002369 if (PyString_Check(t)) {
2370 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 goto finally;
2372 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002373
Tim Peters71fcda52003-02-14 23:05:28 +00002374 if (! PyTuple_Check(t)) {
2375 cPickle_ErrFormat(PicklingError, "Value returned by "
2376 "%s must be string or tuple",
2377 "O", __reduce__);
2378 goto finally;
2379 }
2380
2381 size = PyTuple_Size(t);
2382 if (size < 2 || size > 5) {
2383 cPickle_ErrFormat(PicklingError, "tuple returned by "
2384 "%s must contain 2 through 5 elements",
2385 "O", __reduce__);
2386 goto finally;
2387 }
2388
2389 arg_tup = PyTuple_GET_ITEM(t, 1);
2390 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2391 cPickle_ErrFormat(PicklingError, "Second element of "
2392 "tuple returned by %s must be a tuple",
2393 "O", __reduce__);
2394 goto finally;
2395 }
2396
2397 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002400 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 Py_XDECREF(py_ob_id);
2402 Py_XDECREF(__reduce__);
2403 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002406}
2407
2408
2409static int
Tim Peterscba30e22003-02-01 06:24:36 +00002410dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411{
2412 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002413
Tim Peters4190fb82003-02-02 16:09:05 +00002414 if (self->proto >= 2) {
2415 char bytes[2];
2416
2417 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002418 assert(self->proto >= 0 && self->proto < 256);
2419 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002420 if (self->write_func(self, bytes, 2) < 0)
2421 return -1;
2422 }
2423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (save(self, args, 0) < 0)
2425 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Tim Peters4190fb82003-02-02 16:09:05 +00002427 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002429
Tim Peters4190fb82003-02-02 16:09:05 +00002430 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002434}
2435
2436static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002437Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438{
Tim Peterscba30e22003-02-01 06:24:36 +00002439 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 PyDict_Clear(self->memo);
2441 Py_INCREF(Py_None);
2442 return Py_None;
2443}
2444
2445static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002446Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447{
2448 int l, i, rsize, ssize, clear=1, lm;
2449 long ik;
2450 PyObject *k, *r;
2451 char *s, *p, *have_get;
2452 Pdata *data;
2453
2454 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002455 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002456 return NULL;
2457
2458 /* Check to make sure we are based on a list */
2459 if (! Pdata_Check(self->file)) {
2460 PyErr_SetString(PicklingError,
2461 "Attempt to getvalue() a non-list-based pickler");
2462 return NULL;
2463 }
2464
2465 /* flush write buffer */
2466 if (write_other(self, NULL, 0) < 0) return NULL;
2467
2468 data=(Pdata*)self->file;
2469 l=data->length;
2470
2471 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002472 lm = PyDict_Size(self->memo);
2473 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002475 have_get = malloc(lm);
2476 if (have_get == NULL) return PyErr_NoMemory();
2477 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478
2479 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002480 for (rsize = 0, i = l; --i >= 0; ) {
2481 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482
Tim Petersac5687a2003-02-02 18:08:34 +00002483 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002484 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485
2486 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002487 ik = PyInt_AsLong(k);
2488 if (ik == -1 && PyErr_Occurred())
2489 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002490 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 PyErr_SetString(PicklingError,
2492 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002493 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 }
Tim Petersac5687a2003-02-02 18:08:34 +00002495 if (have_get[ik]) /* with matching get */
2496 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 }
2498
2499 else if (! (PyTuple_Check(k) &&
2500 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002501 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 ) {
2503 PyErr_SetString(PicklingError,
2504 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002505 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 }
2507
2508 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002509 ik = PyInt_AsLong(k);
2510 if (ik == -1 && PyErr_Occurred())
2511 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002512 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 PyErr_SetString(PicklingError,
2514 "Invalid get data");
2515 return NULL;
2516 }
Tim Petersac5687a2003-02-02 18:08:34 +00002517 have_get[ik] = 1;
2518 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520 }
2521
2522 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002523 r = PyString_FromStringAndSize(NULL, rsize);
2524 if (r == NULL) goto err;
2525 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526
Tim Petersac5687a2003-02-02 18:08:34 +00002527 for (i = 0; i < l; i++) {
2528 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529
2530 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002531 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002533 p=PyString_AS_STRING((PyStringObject *)k);
2534 while (--ssize >= 0)
2535 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 }
2537 }
2538
2539 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002540 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2541 if (ik == -1 && PyErr_Occurred())
2542 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 if (ik < 256) {
2544 *s++ = BINGET;
2545 *s++ = (int)(ik & 0xff);
2546 }
2547 else {
2548 *s++ = LONG_BINGET;
2549 *s++ = (int)(ik & 0xff);
2550 *s++ = (int)((ik >> 8) & 0xff);
2551 *s++ = (int)((ik >> 16) & 0xff);
2552 *s++ = (int)((ik >> 24) & 0xff);
2553 }
2554 }
2555
2556 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002557 ik = PyLong_AsLong(k);
2558 if (ik == -1 && PyErr_Occurred())
2559 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560
2561 if (have_get[ik]) { /* with matching get */
2562 if (ik < 256) {
2563 *s++ = BINPUT;
2564 *s++ = (int)(ik & 0xff);
2565 }
2566 else {
2567 *s++ = LONG_BINPUT;
2568 *s++ = (int)(ik & 0xff);
2569 *s++ = (int)((ik >> 8) & 0xff);
2570 *s++ = (int)((ik >> 16) & 0xff);
2571 *s++ = (int)((ik >> 24) & 0xff);
2572 }
2573 }
2574 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 }
2576
2577 if (clear) {
2578 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002579 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 }
2581
2582 free(have_get);
2583 return r;
2584 err:
2585 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002586 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002587}
2588
2589static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002590Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591{
2592 PyObject *ob;
2593 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002594
Tim Peterscba30e22003-02-01 06:24:36 +00002595 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 if (dump(self, ob) < 0)
2599 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 /* XXX Why does dump() return self? */
2604 Py_INCREF(self);
2605 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606}
2607
2608
Tim Peterscba30e22003-02-01 06:24:36 +00002609static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610{
Neal Norwitzb0493252002-03-31 14:44:22 +00002611 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002612 PyDoc_STR("dump(object) -- "
2613 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002614 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002615 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002616 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002617 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002619};
2620
2621
2622static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002623newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002624{
2625 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002626
Tim Peters5bd2a792003-02-01 16:45:06 +00002627 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002628 proto = HIGHEST_PROTOCOL;
2629 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002630 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2631 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002632 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002634 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002635
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002636 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 if (self == NULL)
2638 return NULL;
2639 self->proto = proto;
2640 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641 self->fp = NULL;
2642 self->write = NULL;
2643 self->memo = NULL;
2644 self->arg = NULL;
2645 self->pers_func = NULL;
2646 self->inst_pers_func = NULL;
2647 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002649 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002650 self->fast_container = 0;
2651 self->fast_memo = NULL;
2652 self->buf_size = 0;
2653 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002654
Tim Peters5bd2a792003-02-01 16:45:06 +00002655 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002656 if (file)
2657 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002658 else {
2659 file = Pdata_New();
2660 if (file == NULL)
2661 goto err;
2662 }
2663 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002664
Tim Peterscba30e22003-02-01 06:24:36 +00002665 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (PyFile_Check(file)) {
2669 self->fp = PyFile_AsFile(file);
2670 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002671 PyErr_SetString(PyExc_ValueError,
2672 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 goto err;
2674 }
2675 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002676 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 else if (PycStringIO_OutputCheck(file)) {
2678 self->write_func = write_cStringIO;
2679 }
2680 else if (file == Py_None) {
2681 self->write_func = write_none;
2682 }
2683 else {
2684 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 if (! Pdata_Check(file)) {
2687 self->write = PyObject_GetAttr(file, write_str);
2688 if (!self->write) {
2689 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002690 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 "argument must have 'write' "
2692 "attribute");
2693 goto err;
2694 }
2695 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002696
Tim Peters5bd2a792003-02-01 16:45:06 +00002697 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2698 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 PyErr_NoMemory();
2700 goto err;
2701 }
2702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 if (PyEval_GetRestricted()) {
2705 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002706 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002707
Tim Peters5b7da392003-02-04 00:21:07 +00002708 if (m == NULL)
2709 goto err;
2710 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002711 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002712 if (self->dispatch_table == NULL)
2713 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 }
2715 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002716 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717 Py_INCREF(dispatch_table);
2718 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002719 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002724 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002726}
2727
2728
2729static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002730get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002732 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002734 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002735
Tim Peters92c8bb32003-02-13 23:00:26 +00002736 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002737 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002738 * accepts Pickler() and Pickler(integer) too. The meaning then
2739 * is clear as mud, undocumented, and not supported by pickle.py.
2740 * I'm told Zope uses this, but I haven't traced into this code
2741 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002742 */
2743 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002745 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002746 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2747 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002748 return NULL;
2749 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002750 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002751}
2752
2753
2754static void
Tim Peterscba30e22003-02-01 06:24:36 +00002755Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002757 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 Py_XDECREF(self->write);
2759 Py_XDECREF(self->memo);
2760 Py_XDECREF(self->fast_memo);
2761 Py_XDECREF(self->arg);
2762 Py_XDECREF(self->file);
2763 Py_XDECREF(self->pers_func);
2764 Py_XDECREF(self->inst_pers_func);
2765 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002766 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002767 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002768}
2769
2770static int
2771Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2772{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002773 Py_VISIT(self->write);
2774 Py_VISIT(self->memo);
2775 Py_VISIT(self->fast_memo);
2776 Py_VISIT(self->arg);
2777 Py_VISIT(self->file);
2778 Py_VISIT(self->pers_func);
2779 Py_VISIT(self->inst_pers_func);
2780 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002781 return 0;
2782}
2783
2784static int
2785Pickler_clear(Picklerobject *self)
2786{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002787 Py_CLEAR(self->write);
2788 Py_CLEAR(self->memo);
2789 Py_CLEAR(self->fast_memo);
2790 Py_CLEAR(self->arg);
2791 Py_CLEAR(self->file);
2792 Py_CLEAR(self->pers_func);
2793 Py_CLEAR(self->inst_pers_func);
2794 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002795 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002796}
2797
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002798static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002799Pickler_get_pers_func(Picklerobject *p)
2800{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 if (p->pers_func == NULL)
2802 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2803 else
2804 Py_INCREF(p->pers_func);
2805 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002806}
2807
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002808static int
2809Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2810{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 if (v == NULL) {
2812 PyErr_SetString(PyExc_TypeError,
2813 "attribute deletion is not supported");
2814 return -1;
2815 }
2816 Py_XDECREF(p->pers_func);
2817 Py_INCREF(v);
2818 p->pers_func = v;
2819 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002820}
2821
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002822static int
2823Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2824{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 if (v == NULL) {
2826 PyErr_SetString(PyExc_TypeError,
2827 "attribute deletion is not supported");
2828 return -1;
2829 }
2830 Py_XDECREF(p->inst_pers_func);
2831 Py_INCREF(v);
2832 p->inst_pers_func = v;
2833 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002834}
2835
2836static PyObject *
2837Pickler_get_memo(Picklerobject *p)
2838{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 if (p->memo == NULL)
2840 PyErr_SetString(PyExc_AttributeError, "memo");
2841 else
2842 Py_INCREF(p->memo);
2843 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002844}
2845
2846static int
2847Pickler_set_memo(Picklerobject *p, PyObject *v)
2848{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 if (v == NULL) {
2850 PyErr_SetString(PyExc_TypeError,
2851 "attribute deletion is not supported");
2852 return -1;
2853 }
2854 if (!PyDict_Check(v)) {
2855 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2856 return -1;
2857 }
2858 Py_XDECREF(p->memo);
2859 Py_INCREF(v);
2860 p->memo = v;
2861 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002862}
2863
2864static PyObject *
2865Pickler_get_error(Picklerobject *p)
2866{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 /* why is this an attribute on the Pickler? */
2868 Py_INCREF(PicklingError);
2869 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002870}
2871
2872static PyMemberDef Pickler_members[] = {
2873 {"binary", T_INT, offsetof(Picklerobject, bin)},
2874 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002875 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002876};
2877
2878static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002879 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002880 (setter)Pickler_set_pers_func},
2881 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2882 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002883 {"PicklingError", (getter)Pickler_get_error, NULL},
2884 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002885};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887PyDoc_STRVAR(Picklertype__doc__,
2888"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002889
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002890static PyTypeObject Picklertype = {
2891 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002892 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002893 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002894 sizeof(Picklerobject), /*tp_basicsize*/
2895 0,
2896 (destructor)Pickler_dealloc, /* tp_dealloc */
2897 0, /* tp_print */
2898 0, /* tp_getattr */
2899 0, /* tp_setattr */
2900 0, /* tp_compare */
2901 0, /* tp_repr */
2902 0, /* tp_as_number */
2903 0, /* tp_as_sequence */
2904 0, /* tp_as_mapping */
2905 0, /* tp_hash */
2906 0, /* tp_call */
2907 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002908 PyObject_GenericGetAttr, /* tp_getattro */
2909 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002910 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002911 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002912 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002913 (traverseproc)Pickler_traverse, /* tp_traverse */
2914 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002915 0, /* tp_richcompare */
2916 0, /* tp_weaklistoffset */
2917 0, /* tp_iter */
2918 0, /* tp_iternext */
2919 Pickler_methods, /* tp_methods */
2920 Pickler_members, /* tp_members */
2921 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002922};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002923
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002924static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002925find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926{
2927 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929 if (fc) {
2930 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002931 PyErr_SetString(UnpicklingError, "Global and instance "
2932 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 return NULL;
2934 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002935 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2936 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 module = PySys_GetObject("modules");
2940 if (module == NULL)
2941 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 module = PyDict_GetItem(module, py_module_name);
2944 if (module == NULL) {
2945 module = PyImport_Import(py_module_name);
2946 if (!module)
2947 return NULL;
2948 global = PyObject_GetAttr(module, py_global_name);
2949 Py_DECREF(module);
2950 }
2951 else
2952 global = PyObject_GetAttr(module, py_global_name);
2953 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002954}
2955
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002956static int
Tim Peterscba30e22003-02-01 06:24:36 +00002957marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958{
2959 if (self->num_marks < 1) {
2960 PyErr_SetString(UnpicklingError, "could not find MARK");
2961 return -1;
2962 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965}
2966
Tim Peters84e87f32001-03-17 04:50:51 +00002967
Guido van Rossum60456fd1997-04-09 17:36:32 +00002968static int
Tim Peterscba30e22003-02-01 06:24:36 +00002969load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970{
2971 PDATA_APPEND(self->stack, Py_None, -1);
2972 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973}
2974
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002975static int
Tim Peterscba30e22003-02-01 06:24:36 +00002976bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002977{
2978 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2979 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002980}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002981
2982static int
Tim Peterscba30e22003-02-01 06:24:36 +00002983load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984{
2985 PyObject *py_int = 0;
2986 char *endptr, *s;
2987 int len, res = -1;
2988 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989
Tim Peters0bc93f52003-02-02 18:29:33 +00002990 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 if (len < 2) return bad_readline();
2992 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 errno = 0;
2995 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2998 /* Hm, maybe we've got something long. Let's try reading
2999 it as a Python long object. */
3000 errno = 0;
3001 py_int = PyLong_FromString(s, NULL, 0);
3002 if (py_int == NULL) {
3003 PyErr_SetString(PyExc_ValueError,
3004 "could not convert string to int");
3005 goto finally;
3006 }
3007 }
3008 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003009 if (len == 3 && (l == 0 || l == 1)) {
3010 if (!( py_int = PyBool_FromLong(l))) goto finally;
3011 }
3012 else {
3013 if (!( py_int = PyInt_FromLong(l))) goto finally;
3014 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003017 free(s);
3018 PDATA_PUSH(self->stack, py_int, -1);
3019 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021 finally:
3022 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025}
3026
Tim Peters3c67d792003-02-02 17:59:11 +00003027static int
3028load_bool(Unpicklerobject *self, PyObject *boolean)
3029{
3030 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003031 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003032 return 0;
3033}
3034
Tim Petersee1a53c2003-02-02 02:57:53 +00003035/* s contains x bytes of a little-endian integer. Return its value as a
3036 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3037 * int, but when x is 4 it's a signed one. This is an historical source
3038 * of x-platform bugs.
3039 */
Tim Peters84e87f32001-03-17 04:50:51 +00003040static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003041calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042{
3043 unsigned char c;
3044 int i;
3045 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003047 for (i = 0, l = 0L; i < x; i++) {
3048 c = (unsigned char)s[i];
3049 l |= (long)c << (i * 8);
3050 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003051#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3053 * is signed, so on a box with longs bigger than 4 bytes we need
3054 * to extend a BININT's sign bit to the full width.
3055 */
3056 if (x == 4 && l & (1L << 31))
3057 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003058#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060}
3061
3062
3063static int
Tim Peterscba30e22003-02-01 06:24:36 +00003064load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065{
3066 PyObject *py_int = 0;
3067 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Tim Peterscba30e22003-02-01 06:24:36 +00003071 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003074 PDATA_PUSH(self->stack, py_int, -1);
3075 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076}
3077
3078
3079static int
Tim Peterscba30e22003-02-01 06:24:36 +00003080load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081{
3082 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083
Tim Peters0bc93f52003-02-02 18:29:33 +00003084 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088}
3089
3090
3091static int
Tim Peterscba30e22003-02-01 06:24:36 +00003092load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093{
3094 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003095
Tim Peters0bc93f52003-02-02 18:29:33 +00003096 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100}
3101
3102
3103static int
Tim Peterscba30e22003-02-01 06:24:36 +00003104load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105{
3106 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Tim Peters0bc93f52003-02-02 18:29:33 +00003108 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112}
Tim Peters84e87f32001-03-17 04:50:51 +00003113
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114static int
Tim Peterscba30e22003-02-01 06:24:36 +00003115load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116{
3117 PyObject *l = 0;
3118 char *end, *s;
3119 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Tim Peters0bc93f52003-02-02 18:29:33 +00003121 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if (len < 2) return bad_readline();
3123 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Tim Peterscba30e22003-02-01 06:24:36 +00003125 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 free(s);
3129 PDATA_PUSH(self->stack, l, -1);
3130 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 finally:
3133 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136}
3137
Tim Petersee1a53c2003-02-02 02:57:53 +00003138/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3139 * data following.
3140 */
3141static int
3142load_counted_long(Unpicklerobject *self, int size)
3143{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003144 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003145 char *nbytes;
3146 unsigned char *pdata;
3147 PyObject *along;
3148
3149 assert(size == 1 || size == 4);
3150 i = self->read_func(self, &nbytes, size);
3151 if (i < 0) return -1;
3152
3153 size = calc_binint(nbytes, size);
3154 if (size < 0) {
3155 /* Corrupt or hostile pickle -- we never write one like
3156 * this.
3157 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003158 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003159 "byte count");
3160 return -1;
3161 }
3162
3163 if (size == 0)
3164 along = PyLong_FromLong(0L);
3165 else {
3166 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003167 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003168 if (i < 0) return -1;
3169 along = _PyLong_FromByteArray(pdata, (size_t)size,
3170 1 /* little endian */, 1 /* signed */);
3171 }
3172 if (along == NULL)
3173 return -1;
3174 PDATA_PUSH(self->stack, along, -1);
3175 return 0;
3176}
Tim Peters84e87f32001-03-17 04:50:51 +00003177
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178static int
Tim Peterscba30e22003-02-01 06:24:36 +00003179load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180{
3181 PyObject *py_float = 0;
3182 char *endptr, *s;
3183 int len, res = -1;
3184 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Tim Peters0bc93f52003-02-02 18:29:33 +00003186 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 if (len < 2) return bad_readline();
3188 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003191 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3194 PyErr_SetString(PyExc_ValueError,
3195 "could not convert string to float");
3196 goto finally;
3197 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198
Tim Peterscba30e22003-02-01 06:24:36 +00003199 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003202 free(s);
3203 PDATA_PUSH(self->stack, py_float, -1);
3204 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 finally:
3207 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210}
3211
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212static int
Tim Peterscba30e22003-02-01 06:24:36 +00003213load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214{
Tim Peters9905b942003-03-20 20:53:32 +00003215 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 double x;
3217 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Tim Peters0bc93f52003-02-02 18:29:33 +00003219 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Tim Peters9905b942003-03-20 20:53:32 +00003222 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3223 if (x == -1.0 && PyErr_Occurred())
3224 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Tim Peters9905b942003-03-20 20:53:32 +00003226 py_float = PyFloat_FromDouble(x);
3227 if (py_float == NULL)
3228 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 PDATA_PUSH(self->stack, py_float, -1);
3231 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233
3234static int
Tim Peterscba30e22003-02-01 06:24:36 +00003235load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236{
3237 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003238 int len, res = -1;
3239 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Tim Peters0bc93f52003-02-02 18:29:33 +00003241 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242 if (len < 2) return bad_readline();
3243 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003245
3246 /* Strip outermost quotes */
3247 while (s[len-1] <= ' ')
3248 len--;
3249 if(s[0]=='"' && s[len-1]=='"'){
3250 s[len-1] = '\0';
3251 p = s + 1 ;
3252 len -= 2;
3253 } else if(s[0]=='\'' && s[len-1]=='\''){
3254 s[len-1] = '\0';
3255 p = s + 1 ;
3256 len -= 2;
3257 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 goto insecure;
3259 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003260
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003261 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003262 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003263 if (str) {
3264 PDATA_PUSH(self->stack, str, -1);
3265 res = 0;
3266 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003269 insecure:
3270 free(s);
3271 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3272 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003273}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003274
3275
3276static int
Tim Peterscba30e22003-02-01 06:24:36 +00003277load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278{
3279 PyObject *py_string = 0;
3280 long l;
3281 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282
Tim Peters0bc93f52003-02-02 18:29:33 +00003283 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003285 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003286
Tim Peters0bc93f52003-02-02 18:29:33 +00003287 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003289
Tim Peterscba30e22003-02-01 06:24:36 +00003290 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 PDATA_PUSH(self->stack, py_string, -1);
3294 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003295}
3296
3297
3298static int
Tim Peterscba30e22003-02-01 06:24:36 +00003299load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003300{
3301 PyObject *py_string = 0;
3302 unsigned char l;
3303 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
Tim Peters0bc93f52003-02-02 18:29:33 +00003305 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003309
Tim Peters0bc93f52003-02-02 18:29:33 +00003310 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003312 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003314 PDATA_PUSH(self->stack, py_string, -1);
3315 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003316}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
3318
3319static int
Tim Peterscba30e22003-02-01 06:24:36 +00003320load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003321{
3322 PyObject *str = 0;
3323 int len, res = -1;
3324 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003325
Tim Peters0bc93f52003-02-02 18:29:33 +00003326 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003328
Tim Peterscba30e22003-02-01 06:24:36 +00003329 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332 PDATA_PUSH(self->stack, str, -1);
3333 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 finally:
3336 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003337}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003338
3339
3340static int
Tim Peterscba30e22003-02-01 06:24:36 +00003341load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342{
3343 PyObject *unicode;
3344 long l;
3345 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003346
Tim Peters0bc93f52003-02-02 18:29:33 +00003347 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003350
Tim Peters0bc93f52003-02-02 18:29:33 +00003351 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003353
Tim Peterscba30e22003-02-01 06:24:36 +00003354 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003357 PDATA_PUSH(self->stack, unicode, -1);
3358 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003359}
3360
3361
3362static int
Tim Peterscba30e22003-02-01 06:24:36 +00003363load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364{
3365 PyObject *tup;
3366 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 if ((i = marker(self)) < 0) return -1;
3369 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3370 PDATA_PUSH(self->stack, tup, -1);
3371 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372}
3373
3374static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003375load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003377 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378
Tim Peters1d63c9f2003-02-02 20:29:39 +00003379 if (tup == NULL)
3380 return -1;
3381
3382 while (--len >= 0) {
3383 PyObject *element;
3384
3385 PDATA_POP(self->stack, element);
3386 if (element == NULL)
3387 return -1;
3388 PyTuple_SET_ITEM(tup, len, element);
3389 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 PDATA_PUSH(self->stack, tup, -1);
3391 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392}
3393
3394static int
Tim Peterscba30e22003-02-01 06:24:36 +00003395load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396{
3397 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 if (!( list=PyList_New(0))) return -1;
3400 PDATA_PUSH(self->stack, list, -1);
3401 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402}
3403
3404static int
Tim Peterscba30e22003-02-01 06:24:36 +00003405load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406{
3407 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003409 if (!( dict=PyDict_New())) return -1;
3410 PDATA_PUSH(self->stack, dict, -1);
3411 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412}
3413
3414
3415static int
Tim Peterscba30e22003-02-01 06:24:36 +00003416load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417{
3418 PyObject *list = 0;
3419 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421 if ((i = marker(self)) < 0) return -1;
3422 if (!( list=Pdata_popList(self->stack, i))) return -1;
3423 PDATA_PUSH(self->stack, list, -1);
3424 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003425}
3426
3427static int
Tim Peterscba30e22003-02-01 06:24:36 +00003428load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003429{
3430 PyObject *dict, *key, *value;
3431 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 if ((i = marker(self)) < 0) return -1;
3434 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003438 for (k = i+1; k < j; k += 2) {
3439 key =self->stack->data[k-1];
3440 value=self->stack->data[k ];
3441 if (PyDict_SetItem(dict, key, value) < 0) {
3442 Py_DECREF(dict);
3443 return -1;
3444 }
3445 }
3446 Pdata_clear(self->stack, i);
3447 PDATA_PUSH(self->stack, dict, -1);
3448 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449}
3450
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003451static PyObject *
3452Instance_New(PyObject *cls, PyObject *args)
3453{
3454 PyObject *r = 0;
3455
3456 if ((r=PyObject_CallObject(cls, args))) return r;
3457
3458 {
3459 PyObject *tp, *v, *tb, *tmp_value;
3460
3461 PyErr_Fetch(&tp, &v, &tb);
3462 tmp_value = v;
3463 /* NULL occurs when there was a KeyboardInterrupt */
3464 if (tmp_value == NULL)
3465 tmp_value = Py_None;
3466 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3467 Py_XDECREF(v);
3468 v=r;
3469 }
3470 PyErr_Restore(tp,v,tb);
3471 }
3472 return NULL;
3473}
3474
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
3476static int
Tim Peterscba30e22003-02-01 06:24:36 +00003477load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478{
3479 PyObject *class, *tup, *obj=0;
3480 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003482 if ((i = marker(self)) < 0) return -1;
3483 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3484 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003485 if (class) {
3486 obj = Instance_New(class, tup);
3487 Py_DECREF(class);
3488 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if (! obj) return -1;
3492 PDATA_PUSH(self->stack, obj, -1);
3493 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003494}
3495
3496
3497static int
Tim Peterscba30e22003-02-01 06:24:36 +00003498load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499{
3500 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3501 int i, len;
3502 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003505
Tim Peters0bc93f52003-02-02 18:29:33 +00003506 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003507 if (len < 2) return bad_readline();
3508 module_name = PyString_FromStringAndSize(s, len - 1);
3509 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003510
Tim Peters0bc93f52003-02-02 18:29:33 +00003511 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512 if (len < 2) return bad_readline();
3513 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003514 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003515 self->find_class);
3516 Py_DECREF(class_name);
3517 }
3518 }
3519 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003524 obj = Instance_New(class, tup);
3525 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526 }
3527 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531 PDATA_PUSH(self->stack, obj, -1);
3532 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003533}
3534
Tim Peterseab7db32003-02-13 18:24:14 +00003535static int
3536load_newobj(Unpicklerobject *self)
3537{
3538 PyObject *args = NULL;
3539 PyObject *clsraw = NULL;
3540 PyTypeObject *cls; /* clsraw cast to its true type */
3541 PyObject *obj;
3542
3543 /* Stack is ... cls argtuple, and we want to call
3544 * cls.__new__(cls, *argtuple).
3545 */
3546 PDATA_POP(self->stack, args);
3547 if (args == NULL) goto Fail;
3548 if (! PyTuple_Check(args)) {
3549 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3550 "tuple.");
3551 goto Fail;
3552 }
3553
3554 PDATA_POP(self->stack, clsraw);
3555 cls = (PyTypeObject *)clsraw;
3556 if (cls == NULL) goto Fail;
3557 if (! PyType_Check(cls)) {
3558 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3559 "isn't a type object");
3560 goto Fail;
3561 }
3562 if (cls->tp_new == NULL) {
3563 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3564 "has NULL tp_new");
3565 goto Fail;
3566 }
3567
3568 /* Call __new__. */
3569 obj = cls->tp_new(cls, args, NULL);
3570 if (obj == NULL) goto Fail;
3571
3572 Py_DECREF(args);
3573 Py_DECREF(clsraw);
3574 PDATA_PUSH(self->stack, obj, -1);
3575 return 0;
3576
3577 Fail:
3578 Py_XDECREF(args);
3579 Py_XDECREF(clsraw);
3580 return -1;
3581}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003582
3583static int
Tim Peterscba30e22003-02-01 06:24:36 +00003584load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585{
3586 PyObject *class = 0, *module_name = 0, *class_name = 0;
3587 int len;
3588 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589
Tim Peters0bc93f52003-02-02 18:29:33 +00003590 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591 if (len < 2) return bad_readline();
3592 module_name = PyString_FromStringAndSize(s, len - 1);
3593 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594
Tim Peters0bc93f52003-02-02 18:29:33 +00003595 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003596 if (len < 2) {
3597 Py_DECREF(module_name);
3598 return bad_readline();
3599 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003600 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003601 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 self->find_class);
3603 Py_DECREF(class_name);
3604 }
3605 }
3606 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (! class) return -1;
3609 PDATA_PUSH(self->stack, class, -1);
3610 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611}
3612
3613
3614static int
Tim Peterscba30e22003-02-01 06:24:36 +00003615load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616{
3617 PyObject *pid = 0;
3618 int len;
3619 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003622 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623 if (len < 2) return bad_readline();
3624
3625 pid = PyString_FromStringAndSize(s, len - 1);
3626 if (!pid) return -1;
3627
3628 if (PyList_Check(self->pers_func)) {
3629 if (PyList_Append(self->pers_func, pid) < 0) {
3630 Py_DECREF(pid);
3631 return -1;
3632 }
3633 }
3634 else {
3635 ARG_TUP(self, pid);
3636 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003637 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638 NULL);
3639 FREE_ARG_TUP(self);
3640 }
3641 }
3642
3643 if (! pid) return -1;
3644
3645 PDATA_PUSH(self->stack, pid, -1);
3646 return 0;
3647 }
3648 else {
3649 PyErr_SetString(UnpicklingError,
3650 "A load persistent id instruction was encountered,\n"
3651 "but no persistent_load function was specified.");
3652 return -1;
3653 }
3654}
3655
3656static int
Tim Peterscba30e22003-02-01 06:24:36 +00003657load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658{
3659 PyObject *pid = 0;
3660
3661 if (self->pers_func) {
3662 PDATA_POP(self->stack, pid);
3663 if (! pid) return -1;
3664
3665 if (PyList_Check(self->pers_func)) {
3666 if (PyList_Append(self->pers_func, pid) < 0) {
3667 Py_DECREF(pid);
3668 return -1;
3669 }
3670 }
3671 else {
3672 ARG_TUP(self, pid);
3673 if (self->arg) {
3674 pid = PyObject_Call(self->pers_func, self->arg,
3675 NULL);
3676 FREE_ARG_TUP(self);
3677 }
3678 if (! pid) return -1;
3679 }
3680
3681 PDATA_PUSH(self->stack, pid, -1);
3682 return 0;
3683 }
3684 else {
3685 PyErr_SetString(UnpicklingError,
3686 "A load persistent id instruction was encountered,\n"
3687 "but no persistent_load function was specified.");
3688 return -1;
3689 }
3690}
3691
3692
3693static int
Tim Peterscba30e22003-02-01 06:24:36 +00003694load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695{
3696 int len;
3697
3698 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3699
3700 /* Note that we split the (pickle.py) stack into two stacks,
3701 an object stack and a mark stack. We have to be clever and
3702 pop the right one. We do this by looking at the top of the
3703 mark stack.
3704 */
3705
3706 if ((self->num_marks > 0) &&
3707 (self->marks[self->num_marks - 1] == len))
3708 self->num_marks--;
3709 else {
3710 len--;
3711 Py_DECREF(self->stack->data[len]);
3712 self->stack->length=len;
3713 }
3714
3715 return 0;
3716}
3717
3718
3719static int
Tim Peterscba30e22003-02-01 06:24:36 +00003720load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003721{
3722 int i;
3723
3724 if ((i = marker(self)) < 0)
3725 return -1;
3726
3727 Pdata_clear(self->stack, i);
3728
3729 return 0;
3730}
3731
3732
3733static int
Tim Peterscba30e22003-02-01 06:24:36 +00003734load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735{
3736 PyObject *last;
3737 int len;
3738
3739 if ((len = self->stack->length) <= 0) return stackUnderflow();
3740 last=self->stack->data[len-1];
3741 Py_INCREF(last);
3742 PDATA_PUSH(self->stack, last, -1);
3743 return 0;
3744}
3745
3746
3747static int
Tim Peterscba30e22003-02-01 06:24:36 +00003748load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749{
3750 PyObject *py_str = 0, *value = 0;
3751 int len;
3752 char *s;
3753 int rc;
3754
Tim Peters0bc93f52003-02-02 18:29:33 +00003755 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003756 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 value = PyDict_GetItem(self->memo, py_str);
3761 if (! value) {
3762 PyErr_SetObject(BadPickleGet, py_str);
3763 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003764 }
3765 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003766 PDATA_APPEND(self->stack, value, -1);
3767 rc = 0;
3768 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 Py_DECREF(py_str);
3771 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003772}
3773
3774
3775static int
Tim Peterscba30e22003-02-01 06:24:36 +00003776load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777{
3778 PyObject *py_key = 0, *value = 0;
3779 unsigned char key;
3780 char *s;
3781 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Tim Peters0bc93f52003-02-02 18:29:33 +00003783 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 key = (unsigned char)s[0];
3786 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788 value = PyDict_GetItem(self->memo, py_key);
3789 if (! value) {
3790 PyErr_SetObject(BadPickleGet, py_key);
3791 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003792 }
3793 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 PDATA_APPEND(self->stack, value, -1);
3795 rc = 0;
3796 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 Py_DECREF(py_key);
3799 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800}
3801
3802
3803static int
Tim Peterscba30e22003-02-01 06:24:36 +00003804load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805{
3806 PyObject *py_key = 0, *value = 0;
3807 unsigned char c;
3808 char *s;
3809 long key;
3810 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Tim Peters0bc93f52003-02-02 18:29:33 +00003812 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003814 c = (unsigned char)s[0];
3815 key = (long)c;
3816 c = (unsigned char)s[1];
3817 key |= (long)c << 8;
3818 c = (unsigned char)s[2];
3819 key |= (long)c << 16;
3820 c = (unsigned char)s[3];
3821 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003823 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3824
3825 value = PyDict_GetItem(self->memo, py_key);
3826 if (! value) {
3827 PyErr_SetObject(BadPickleGet, py_key);
3828 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003829 }
3830 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003831 PDATA_APPEND(self->stack, value, -1);
3832 rc = 0;
3833 }
3834
3835 Py_DECREF(py_key);
3836 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003837}
3838
Tim Peters2d629652003-02-04 05:06:17 +00003839/* Push an object from the extension registry (EXT[124]). nbytes is
3840 * the number of bytes following the opcode, holding the index (code) value.
3841 */
3842static int
3843load_extension(Unpicklerobject *self, int nbytes)
3844{
3845 char *codebytes; /* the nbytes bytes after the opcode */
3846 long code; /* calc_binint returns long */
3847 PyObject *py_code; /* code as a Python int */
3848 PyObject *obj; /* the object to push */
3849 PyObject *pair; /* (module_name, class_name) */
3850 PyObject *module_name, *class_name;
3851
3852 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3853 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3854 code = calc_binint(codebytes, nbytes);
3855 if (code <= 0) { /* note that 0 is forbidden */
3856 /* Corrupt or hostile pickle. */
3857 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3858 return -1;
3859 }
3860
3861 /* Look for the code in the cache. */
3862 py_code = PyInt_FromLong(code);
3863 if (py_code == NULL) return -1;
3864 obj = PyDict_GetItem(extension_cache, py_code);
3865 if (obj != NULL) {
3866 /* Bingo. */
3867 Py_DECREF(py_code);
3868 PDATA_APPEND(self->stack, obj, -1);
3869 return 0;
3870 }
3871
3872 /* Look up the (module_name, class_name) pair. */
3873 pair = PyDict_GetItem(inverted_registry, py_code);
3874 if (pair == NULL) {
3875 Py_DECREF(py_code);
3876 PyErr_Format(PyExc_ValueError, "unregistered extension "
3877 "code %ld", code);
3878 return -1;
3879 }
3880 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003881 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003882 */
3883 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3884 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3885 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3886 Py_DECREF(py_code);
3887 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3888 "isn't a 2-tuple of strings", code);
3889 return -1;
3890 }
3891 /* Load the object. */
3892 obj = find_class(module_name, class_name, self->find_class);
3893 if (obj == NULL) {
3894 Py_DECREF(py_code);
3895 return -1;
3896 }
3897 /* Cache code -> obj. */
3898 code = PyDict_SetItem(extension_cache, py_code, obj);
3899 Py_DECREF(py_code);
3900 if (code < 0) {
3901 Py_DECREF(obj);
3902 return -1;
3903 }
3904 PDATA_PUSH(self->stack, obj, -1);
3905 return 0;
3906}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907
3908static int
Tim Peterscba30e22003-02-01 06:24:36 +00003909load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910{
3911 PyObject *py_str = 0, *value = 0;
3912 int len, l;
3913 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914
Tim Peters0bc93f52003-02-02 18:29:33 +00003915 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 if (l < 2) return bad_readline();
3917 if (!( len=self->stack->length )) return stackUnderflow();
3918 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3919 value=self->stack->data[len-1];
3920 l=PyDict_SetItem(self->memo, py_str, value);
3921 Py_DECREF(py_str);
3922 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923}
3924
3925
3926static int
Tim Peterscba30e22003-02-01 06:24:36 +00003927load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928{
3929 PyObject *py_key = 0, *value = 0;
3930 unsigned char key;
3931 char *s;
3932 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003933
Tim Peters0bc93f52003-02-02 18:29:33 +00003934 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3940 value=self->stack->data[len-1];
3941 len=PyDict_SetItem(self->memo, py_key, value);
3942 Py_DECREF(py_key);
3943 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944}
3945
3946
3947static int
Tim Peterscba30e22003-02-01 06:24:36 +00003948load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949{
3950 PyObject *py_key = 0, *value = 0;
3951 long key;
3952 unsigned char c;
3953 char *s;
3954 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955
Tim Peters0bc93f52003-02-02 18:29:33 +00003956 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003957 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003959 c = (unsigned char)s[0];
3960 key = (long)c;
3961 c = (unsigned char)s[1];
3962 key |= (long)c << 8;
3963 c = (unsigned char)s[2];
3964 key |= (long)c << 16;
3965 c = (unsigned char)s[3];
3966 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003968 if (!( py_key = PyInt_FromLong(key))) return -1;
3969 value=self->stack->data[len-1];
3970 len=PyDict_SetItem(self->memo, py_key, value);
3971 Py_DECREF(py_key);
3972 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973}
3974
3975
3976static int
Tim Peterscba30e22003-02-01 06:24:36 +00003977do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003978{
3979 PyObject *value = 0, *list = 0, *append_method = 0;
3980 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 len=self->stack->length;
3983 if (!( len >= x && x > 0 )) return stackUnderflow();
3984 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003985 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989 if (PyList_Check(list)) {
3990 PyObject *slice;
3991 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003994 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 list_len = PyList_GET_SIZE(list);
3996 i=PyList_SetSlice(list, list_len, list_len, slice);
3997 Py_DECREF(slice);
3998 return i;
3999 }
4000 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004001
Tim Peterscba30e22003-02-01 06:24:36 +00004002 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003 return -1;
4004
4005 for (i = x; i < len; i++) {
4006 PyObject *junk;
4007
4008 value=self->stack->data[i];
4009 junk=0;
4010 ARG_TUP(self, value);
4011 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004012 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004013 NULL);
4014 FREE_ARG_TUP(self);
4015 }
4016 if (! junk) {
4017 Pdata_clear(self->stack, i+1);
4018 self->stack->length=x;
4019 Py_DECREF(append_method);
4020 return -1;
4021 }
4022 Py_DECREF(junk);
4023 }
4024 self->stack->length=x;
4025 Py_DECREF(append_method);
4026 }
4027
4028 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004029}
4030
4031
4032static int
Tim Peterscba30e22003-02-01 06:24:36 +00004033load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034{
4035 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004036}
4037
4038
4039static int
Tim Peterscba30e22003-02-01 06:24:36 +00004040load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041{
4042 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043}
4044
4045
4046static int
Tim Peterscba30e22003-02-01 06:24:36 +00004047do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048{
4049 PyObject *value = 0, *key = 0, *dict = 0;
4050 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 if (!( (len=self->stack->length) >= x
4053 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 for (i = x+1; i < len; i += 2) {
4058 key =self->stack->data[i-1];
4059 value=self->stack->data[i ];
4060 if (PyObject_SetItem(dict, key, value) < 0) {
4061 r=-1;
4062 break;
4063 }
4064 }
4065
4066 Pdata_clear(self->stack, x);
4067
4068 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069}
4070
4071
Tim Peters84e87f32001-03-17 04:50:51 +00004072static int
Tim Peterscba30e22003-02-01 06:24:36 +00004073load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074{
4075 return do_setitems(self, self->stack->length - 2);
4076}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078static int
Tim Peterscba30e22003-02-01 06:24:36 +00004079load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080{
4081 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004082}
4083
Tim Peters84e87f32001-03-17 04:50:51 +00004084
Guido van Rossum60456fd1997-04-09 17:36:32 +00004085static int
Tim Peterscba30e22003-02-01 06:24:36 +00004086load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087{
Tim Peters080c88b2003-02-15 03:01:11 +00004088 PyObject *state, *inst, *slotstate;
4089 PyObject *__setstate__;
4090 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004091 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004092 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093
Tim Peters080c88b2003-02-15 03:01:11 +00004094 /* Stack is ... instance, state. We want to leave instance at
4095 * the stack top, possibly mutated via instance.__setstate__(state).
4096 */
4097 if (self->stack->length < 2)
4098 return stackUnderflow();
4099 PDATA_POP(self->stack, state);
4100 if (state == NULL)
4101 return -1;
4102 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103
Tim Peters080c88b2003-02-15 03:01:11 +00004104 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4105 if (__setstate__ != NULL) {
4106 PyObject *junk = NULL;
4107
4108 /* The explicit __setstate__ is responsible for everything. */
4109 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110 if (self->arg) {
4111 junk = PyObject_Call(__setstate__, self->arg, NULL);
4112 FREE_ARG_TUP(self);
4113 }
4114 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004115 if (junk == NULL)
4116 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 Py_DECREF(junk);
4118 return 0;
4119 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004120 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4121 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004123
4124 /* A default __setstate__. First see whether state embeds a
4125 * slot state dict too (a proto 2 addition).
4126 */
4127 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4128 PyObject *temp = state;
4129 state = PyTuple_GET_ITEM(temp, 0);
4130 slotstate = PyTuple_GET_ITEM(temp, 1);
4131 Py_INCREF(state);
4132 Py_INCREF(slotstate);
4133 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 }
Tim Peters080c88b2003-02-15 03:01:11 +00004135 else
4136 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137
Tim Peters080c88b2003-02-15 03:01:11 +00004138 /* Set inst.__dict__ from the state dict (if any). */
4139 if (state != Py_None) {
4140 PyObject *dict;
4141 if (! PyDict_Check(state)) {
4142 PyErr_SetString(UnpicklingError, "state is not a "
4143 "dictionary");
4144 goto finally;
4145 }
4146 dict = PyObject_GetAttr(inst, __dict___str);
4147 if (dict == NULL)
4148 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149
Tim Peters080c88b2003-02-15 03:01:11 +00004150 i = 0;
4151 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4152 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4153 goto finally;
4154 }
4155 Py_DECREF(dict);
4156 }
4157
4158 /* Also set instance attributes from the slotstate dict (if any). */
4159 if (slotstate != NULL) {
4160 if (! PyDict_Check(slotstate)) {
4161 PyErr_SetString(UnpicklingError, "slot state is not "
4162 "a dictionary");
4163 goto finally;
4164 }
4165 i = 0;
4166 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4167 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4168 goto finally;
4169 }
4170 }
4171 res = 0;
4172
4173 finally:
4174 Py_DECREF(state);
4175 Py_XDECREF(slotstate);
4176 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177}
4178
4179
4180static int
Tim Peterscba30e22003-02-01 06:24:36 +00004181load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182{
4183 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 /* Note that we split the (pickle.py) stack into two stacks, an
4186 object stack and a mark stack. Here we push a mark onto the
4187 mark stack.
4188 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004191 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 s=self->marks_size+20;
4193 if (s <= self->num_marks) s=self->num_marks + 1;
4194 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004197 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 PyErr_NoMemory();
4201 return -1;
4202 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 self->marks_size = s;
4205 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004207 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004210}
4211
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212static int
Tim Peterscba30e22003-02-01 06:24:36 +00004213load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214{
4215 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004217 PDATA_POP(self->stack, arg_tup);
4218 if (! arg_tup) return -1;
4219 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004220 if (callable) {
4221 ob = Instance_New(callable, arg_tup);
4222 Py_DECREF(callable);
4223 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004224 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 PDATA_PUSH(self->stack, ob, -1);
4229 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230}
Tim Peters84e87f32001-03-17 04:50:51 +00004231
Tim Peters4190fb82003-02-02 16:09:05 +00004232/* Just raises an error if we don't know the protocol specified. PROTO
4233 * is the first opcode for protocols >= 2.
4234 */
4235static int
4236load_proto(Unpicklerobject *self)
4237{
4238 int i;
4239 char *protobyte;
4240
4241 i = self->read_func(self, &protobyte, 1);
4242 if (i < 0)
4243 return -1;
4244
4245 i = calc_binint(protobyte, 1);
4246 /* No point checking for < 0, since calc_binint returns an unsigned
4247 * int when chewing on 1 byte.
4248 */
4249 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004250 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004251 return 0;
4252
4253 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4254 return -1;
4255}
4256
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004258load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259{
4260 PyObject *err = 0, *val = 0;
4261 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 self->num_marks = 0;
4264 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004267 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 switch (s[0]) {
4271 case NONE:
4272 if (load_none(self) < 0)
4273 break;
4274 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276 case BININT:
4277 if (load_binint(self) < 0)
4278 break;
4279 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 case BININT1:
4282 if (load_binint1(self) < 0)
4283 break;
4284 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 case BININT2:
4287 if (load_binint2(self) < 0)
4288 break;
4289 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 case INT:
4292 if (load_int(self) < 0)
4293 break;
4294 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 case LONG:
4297 if (load_long(self) < 0)
4298 break;
4299 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004300
Tim Petersee1a53c2003-02-02 02:57:53 +00004301 case LONG1:
4302 if (load_counted_long(self, 1) < 0)
4303 break;
4304 continue;
4305
4306 case LONG4:
4307 if (load_counted_long(self, 4) < 0)
4308 break;
4309 continue;
4310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case FLOAT:
4312 if (load_float(self) < 0)
4313 break;
4314 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case BINFLOAT:
4317 if (load_binfloat(self) < 0)
4318 break;
4319 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 case BINSTRING:
4322 if (load_binstring(self) < 0)
4323 break;
4324 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 case SHORT_BINSTRING:
4327 if (load_short_binstring(self) < 0)
4328 break;
4329 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case STRING:
4332 if (load_string(self) < 0)
4333 break;
4334 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case UNICODE:
4337 if (load_unicode(self) < 0)
4338 break;
4339 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 case BINUNICODE:
4342 if (load_binunicode(self) < 0)
4343 break;
4344 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004347 if (load_counted_tuple(self, 0) < 0)
4348 break;
4349 continue;
4350
4351 case TUPLE1:
4352 if (load_counted_tuple(self, 1) < 0)
4353 break;
4354 continue;
4355
4356 case TUPLE2:
4357 if (load_counted_tuple(self, 2) < 0)
4358 break;
4359 continue;
4360
4361 case TUPLE3:
4362 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 break;
4364 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 case TUPLE:
4367 if (load_tuple(self) < 0)
4368 break;
4369 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 case EMPTY_LIST:
4372 if (load_empty_list(self) < 0)
4373 break;
4374 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 case LIST:
4377 if (load_list(self) < 0)
4378 break;
4379 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 case EMPTY_DICT:
4382 if (load_empty_dict(self) < 0)
4383 break;
4384 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 case DICT:
4387 if (load_dict(self) < 0)
4388 break;
4389 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 case OBJ:
4392 if (load_obj(self) < 0)
4393 break;
4394 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 case INST:
4397 if (load_inst(self) < 0)
4398 break;
4399 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400
Tim Peterseab7db32003-02-13 18:24:14 +00004401 case NEWOBJ:
4402 if (load_newobj(self) < 0)
4403 break;
4404 continue;
4405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 case GLOBAL:
4407 if (load_global(self) < 0)
4408 break;
4409 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 case APPEND:
4412 if (load_append(self) < 0)
4413 break;
4414 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 case APPENDS:
4417 if (load_appends(self) < 0)
4418 break;
4419 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 case BUILD:
4422 if (load_build(self) < 0)
4423 break;
4424 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 case DUP:
4427 if (load_dup(self) < 0)
4428 break;
4429 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 case BINGET:
4432 if (load_binget(self) < 0)
4433 break;
4434 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 case LONG_BINGET:
4437 if (load_long_binget(self) < 0)
4438 break;
4439 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 case GET:
4442 if (load_get(self) < 0)
4443 break;
4444 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004445
Tim Peters2d629652003-02-04 05:06:17 +00004446 case EXT1:
4447 if (load_extension(self, 1) < 0)
4448 break;
4449 continue;
4450
4451 case EXT2:
4452 if (load_extension(self, 2) < 0)
4453 break;
4454 continue;
4455
4456 case EXT4:
4457 if (load_extension(self, 4) < 0)
4458 break;
4459 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 case MARK:
4461 if (load_mark(self) < 0)
4462 break;
4463 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 case BINPUT:
4466 if (load_binput(self) < 0)
4467 break;
4468 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 case LONG_BINPUT:
4471 if (load_long_binput(self) < 0)
4472 break;
4473 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 case PUT:
4476 if (load_put(self) < 0)
4477 break;
4478 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004480 case POP:
4481 if (load_pop(self) < 0)
4482 break;
4483 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485 case POP_MARK:
4486 if (load_pop_mark(self) < 0)
4487 break;
4488 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 case SETITEM:
4491 if (load_setitem(self) < 0)
4492 break;
4493 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 case SETITEMS:
4496 if (load_setitems(self) < 0)
4497 break;
4498 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 case STOP:
4501 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004503 case PERSID:
4504 if (load_persid(self) < 0)
4505 break;
4506 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004508 case BINPERSID:
4509 if (load_binpersid(self) < 0)
4510 break;
4511 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 case REDUCE:
4514 if (load_reduce(self) < 0)
4515 break;
4516 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Tim Peters4190fb82003-02-02 16:09:05 +00004518 case PROTO:
4519 if (load_proto(self) < 0)
4520 break;
4521 continue;
4522
Tim Peters3c67d792003-02-02 17:59:11 +00004523 case NEWTRUE:
4524 if (load_bool(self, Py_True) < 0)
4525 break;
4526 continue;
4527
4528 case NEWFALSE:
4529 if (load_bool(self, Py_False) < 0)
4530 break;
4531 continue;
4532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 case '\0':
4534 /* end of file */
4535 PyErr_SetNone(PyExc_EOFError);
4536 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004539 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 "invalid load key, '%s'.",
4541 "c", s[0]);
4542 return NULL;
4543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 break;
4546 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 if ((err = PyErr_Occurred())) {
4549 if (err == PyExc_EOFError) {
4550 PyErr_SetNone(PyExc_EOFError);
4551 }
4552 return NULL;
4553 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 PDATA_POP(self->stack, val);
4556 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557}
Tim Peters84e87f32001-03-17 04:50:51 +00004558
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004560/* No-load functions to support noload, which is used to
4561 find persistent references. */
4562
4563static int
Tim Peterscba30e22003-02-01 06:24:36 +00004564noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004565{
4566 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 if ((i = marker(self)) < 0) return -1;
4569 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004570}
4571
4572
4573static int
Tim Peterscba30e22003-02-01 06:24:36 +00004574noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575{
4576 int i;
4577 char *s;
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 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004581 if (self->readline_func(self, &s) < 0) return -1;
4582 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004583 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004585}
4586
4587static int
Tim Peterseab7db32003-02-13 18:24:14 +00004588noload_newobj(Unpicklerobject *self)
4589{
4590 PyObject *obj;
4591
4592 PDATA_POP(self->stack, obj); /* pop argtuple */
4593 if (obj == NULL) return -1;
4594 Py_DECREF(obj);
4595
4596 PDATA_POP(self->stack, obj); /* pop cls */
4597 if (obj == NULL) return -1;
4598 Py_DECREF(obj);
4599
4600 PDATA_APPEND(self->stack, Py_None, -1);
4601 return 0;
4602}
4603
4604static int
Tim Peterscba30e22003-02-01 06:24:36 +00004605noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606{
4607 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004608
Tim Peters0bc93f52003-02-02 18:29:33 +00004609 if (self->readline_func(self, &s) < 0) return -1;
4610 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 PDATA_APPEND(self->stack, Py_None,-1);
4612 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004613}
4614
4615static int
Tim Peterscba30e22003-02-01 06:24:36 +00004616noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 if (self->stack->length < 2) return stackUnderflow();
4620 Pdata_clear(self->stack, self->stack->length-2);
4621 PDATA_APPEND(self->stack, Py_None,-1);
4622 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004623}
4624
4625static int
4626noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004627
Guido van Rossum053b8df1998-11-25 16:18:00 +00004628 if (self->stack->length < 1) return stackUnderflow();
4629 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004630 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631}
4632
Tim Peters2d629652003-02-04 05:06:17 +00004633static int
4634noload_extension(Unpicklerobject *self, int nbytes)
4635{
4636 char *codebytes;
4637
4638 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4639 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4640 PDATA_APPEND(self->stack, Py_None, -1);
4641 return 0;
4642}
4643
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004644
4645static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004646noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004647{
4648 PyObject *err = 0, *val = 0;
4649 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 self->num_marks = 0;
4652 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004655 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 switch (s[0]) {
4659 case NONE:
4660 if (load_none(self) < 0)
4661 break;
4662 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 case BININT:
4665 if (load_binint(self) < 0)
4666 break;
4667 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669 case BININT1:
4670 if (load_binint1(self) < 0)
4671 break;
4672 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 case BININT2:
4675 if (load_binint2(self) < 0)
4676 break;
4677 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 case INT:
4680 if (load_int(self) < 0)
4681 break;
4682 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 case LONG:
4685 if (load_long(self) < 0)
4686 break;
4687 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004688
Tim Peters4190fb82003-02-02 16:09:05 +00004689 case LONG1:
4690 if (load_counted_long(self, 1) < 0)
4691 break;
4692 continue;
4693
4694 case LONG4:
4695 if (load_counted_long(self, 4) < 0)
4696 break;
4697 continue;
4698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004699 case FLOAT:
4700 if (load_float(self) < 0)
4701 break;
4702 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 case BINFLOAT:
4705 if (load_binfloat(self) < 0)
4706 break;
4707 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 case BINSTRING:
4710 if (load_binstring(self) < 0)
4711 break;
4712 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 case SHORT_BINSTRING:
4715 if (load_short_binstring(self) < 0)
4716 break;
4717 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 case STRING:
4720 if (load_string(self) < 0)
4721 break;
4722 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004724 case UNICODE:
4725 if (load_unicode(self) < 0)
4726 break;
4727 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 case BINUNICODE:
4730 if (load_binunicode(self) < 0)
4731 break;
4732 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004735 if (load_counted_tuple(self, 0) < 0)
4736 break;
4737 continue;
4738
4739 case TUPLE1:
4740 if (load_counted_tuple(self, 1) < 0)
4741 break;
4742 continue;
4743
4744 case TUPLE2:
4745 if (load_counted_tuple(self, 2) < 0)
4746 break;
4747 continue;
4748
4749 case TUPLE3:
4750 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 break;
4752 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 case TUPLE:
4755 if (load_tuple(self) < 0)
4756 break;
4757 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 case EMPTY_LIST:
4760 if (load_empty_list(self) < 0)
4761 break;
4762 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 case LIST:
4765 if (load_list(self) < 0)
4766 break;
4767 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 case EMPTY_DICT:
4770 if (load_empty_dict(self) < 0)
4771 break;
4772 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 case DICT:
4775 if (load_dict(self) < 0)
4776 break;
4777 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 case OBJ:
4780 if (noload_obj(self) < 0)
4781 break;
4782 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 case INST:
4785 if (noload_inst(self) < 0)
4786 break;
4787 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004788
Tim Peterseab7db32003-02-13 18:24:14 +00004789 case NEWOBJ:
4790 if (noload_newobj(self) < 0)
4791 break;
4792 continue;
4793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794 case GLOBAL:
4795 if (noload_global(self) < 0)
4796 break;
4797 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 case APPEND:
4800 if (load_append(self) < 0)
4801 break;
4802 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 case APPENDS:
4805 if (load_appends(self) < 0)
4806 break;
4807 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case BUILD:
4810 if (noload_build(self) < 0)
4811 break;
4812 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case DUP:
4815 if (load_dup(self) < 0)
4816 break;
4817 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case BINGET:
4820 if (load_binget(self) < 0)
4821 break;
4822 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case LONG_BINGET:
4825 if (load_long_binget(self) < 0)
4826 break;
4827 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case GET:
4830 if (load_get(self) < 0)
4831 break;
4832 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004833
Tim Peters2d629652003-02-04 05:06:17 +00004834 case EXT1:
4835 if (noload_extension(self, 1) < 0)
4836 break;
4837 continue;
4838
4839 case EXT2:
4840 if (noload_extension(self, 2) < 0)
4841 break;
4842 continue;
4843
4844 case EXT4:
4845 if (noload_extension(self, 4) < 0)
4846 break;
4847 continue;
4848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case MARK:
4850 if (load_mark(self) < 0)
4851 break;
4852 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 case BINPUT:
4855 if (load_binput(self) < 0)
4856 break;
4857 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 case LONG_BINPUT:
4860 if (load_long_binput(self) < 0)
4861 break;
4862 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 case PUT:
4865 if (load_put(self) < 0)
4866 break;
4867 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 case POP:
4870 if (load_pop(self) < 0)
4871 break;
4872 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004874 case POP_MARK:
4875 if (load_pop_mark(self) < 0)
4876 break;
4877 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 case SETITEM:
4880 if (load_setitem(self) < 0)
4881 break;
4882 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 case SETITEMS:
4885 if (load_setitems(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 case STOP:
4890 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case PERSID:
4893 if (load_persid(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 BINPERSID:
4898 if (load_binpersid(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 REDUCE:
4903 if (noload_reduce(self) < 0)
4904 break;
4905 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004906
Tim Peters4190fb82003-02-02 16:09:05 +00004907 case PROTO:
4908 if (load_proto(self) < 0)
4909 break;
4910 continue;
4911
Tim Peters3c67d792003-02-02 17:59:11 +00004912 case NEWTRUE:
4913 if (load_bool(self, Py_True) < 0)
4914 break;
4915 continue;
4916
4917 case NEWFALSE:
4918 if (load_bool(self, Py_False) < 0)
4919 break;
4920 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004922 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004923 "invalid load key, '%s'.",
4924 "c", s[0]);
4925 return NULL;
4926 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928 break;
4929 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 if ((err = PyErr_Occurred())) {
4932 if (err == PyExc_EOFError) {
4933 PyErr_SetNone(PyExc_EOFError);
4934 }
4935 return NULL;
4936 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 PDATA_POP(self->stack, val);
4939 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004940}
Tim Peters84e87f32001-03-17 04:50:51 +00004941
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004942
Guido van Rossum60456fd1997-04-09 17:36:32 +00004943static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004944Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004945{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004947}
4948
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004949static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004950Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004953}
4954
Guido van Rossum60456fd1997-04-09 17:36:32 +00004955
4956static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004957 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004958 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004959 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004960 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004961 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962 "noload() -- not load a pickle, but go through most of the motions\n"
4963 "\n"
4964 "This function can be used to read past a pickle without instantiating\n"
4965 "any objects or importing any modules. It can also be used to find all\n"
4966 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004967 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004969 {NULL, NULL} /* sentinel */
4970};
4971
4972
4973static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004974newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975{
4976 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004977
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004978 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 self->file = NULL;
4982 self->arg = NULL;
4983 self->stack = (Pdata*)Pdata_New();
4984 self->pers_func = NULL;
4985 self->last_string = NULL;
4986 self->marks = NULL;
4987 self->num_marks = 0;
4988 self->marks_size = 0;
4989 self->buf_size = 0;
4990 self->read = NULL;
4991 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004993
Tim Peterscba30e22003-02-01 06:24:36 +00004994 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004995 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004996
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004997 if (!self->stack)
4998 goto err;
4999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000 Py_INCREF(f);
5001 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 /* Set read, readline based on type of f */
5004 if (PyFile_Check(f)) {
5005 self->fp = PyFile_AsFile(f);
5006 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005007 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 "I/O operation on closed file");
5009 goto err;
5010 }
5011 self->read_func = read_file;
5012 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005013 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 else if (PycStringIO_InputCheck(f)) {
5015 self->fp = NULL;
5016 self->read_func = read_cStringIO;
5017 self->readline_func = readline_cStringIO;
5018 }
5019 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 self->fp = NULL;
5022 self->read_func = read_other;
5023 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5026 (self->read = PyObject_GetAttr(f, read_str)))) {
5027 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005028 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 "argument must have 'read' and "
5030 "'readline' attributes" );
5031 goto err;
5032 }
5033 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005034 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 err:
5039 Py_DECREF((PyObject *)self);
5040 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005041}
5042
5043
5044static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005045get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005046{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005048}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005049
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005050
Guido van Rossum60456fd1997-04-09 17:36:32 +00005051static void
Tim Peterscba30e22003-02-01 06:24:36 +00005052Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005054 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055 Py_XDECREF(self->readline);
5056 Py_XDECREF(self->read);
5057 Py_XDECREF(self->file);
5058 Py_XDECREF(self->memo);
5059 Py_XDECREF(self->stack);
5060 Py_XDECREF(self->pers_func);
5061 Py_XDECREF(self->arg);
5062 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005063 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005065 if (self->marks) {
5066 free(self->marks);
5067 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 if (self->buf_size) {
5070 free(self->buf);
5071 }
Tim Peters84e87f32001-03-17 04:50:51 +00005072
Tim Peters3cfe7542003-05-21 21:29:48 +00005073 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005074}
5075
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005076static int
5077Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5078{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005079 Py_VISIT(self->readline);
5080 Py_VISIT(self->read);
5081 Py_VISIT(self->file);
5082 Py_VISIT(self->memo);
5083 Py_VISIT(self->stack);
5084 Py_VISIT(self->pers_func);
5085 Py_VISIT(self->arg);
5086 Py_VISIT(self->last_string);
5087 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005088 return 0;
5089}
5090
5091static int
5092Unpickler_clear(Unpicklerobject *self)
5093{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005094 Py_CLEAR(self->readline);
5095 Py_CLEAR(self->read);
5096 Py_CLEAR(self->file);
5097 Py_CLEAR(self->memo);
5098 Py_CLEAR(self->stack);
5099 Py_CLEAR(self->pers_func);
5100 Py_CLEAR(self->arg);
5101 Py_CLEAR(self->last_string);
5102 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005103 return 0;
5104}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005105
5106static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005107Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005108{
5109 if (!strcmp(name, "persistent_load")) {
5110 if (!self->pers_func) {
5111 PyErr_SetString(PyExc_AttributeError, name);
5112 return NULL;
5113 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005115 Py_INCREF(self->pers_func);
5116 return self->pers_func;
5117 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 if (!strcmp(name, "find_global")) {
5120 if (!self->find_class) {
5121 PyErr_SetString(PyExc_AttributeError, name);
5122 return NULL;
5123 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 Py_INCREF(self->find_class);
5126 return self->find_class;
5127 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 if (!strcmp(name, "memo")) {
5130 if (!self->memo) {
5131 PyErr_SetString(PyExc_AttributeError, name);
5132 return NULL;
5133 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 Py_INCREF(self->memo);
5136 return self->memo;
5137 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005139 if (!strcmp(name, "UnpicklingError")) {
5140 Py_INCREF(UnpicklingError);
5141 return UnpicklingError;
5142 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005145}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005146
Guido van Rossum60456fd1997-04-09 17:36:32 +00005147
5148static int
Tim Peterscba30e22003-02-01 06:24:36 +00005149Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005150{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 if (!strcmp(name, "persistent_load")) {
5153 Py_XDECREF(self->pers_func);
5154 self->pers_func = value;
5155 Py_XINCREF(value);
5156 return 0;
5157 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 if (!strcmp(name, "find_global")) {
5160 Py_XDECREF(self->find_class);
5161 self->find_class = value;
5162 Py_XINCREF(value);
5163 return 0;
5164 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005166 if (! value) {
5167 PyErr_SetString(PyExc_TypeError,
5168 "attribute deletion is not supported");
5169 return -1;
5170 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005172 if (strcmp(name, "memo") == 0) {
5173 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005174 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 "memo must be a dictionary");
5176 return -1;
5177 }
5178 Py_XDECREF(self->memo);
5179 self->memo = value;
5180 Py_INCREF(value);
5181 return 0;
5182 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 PyErr_SetString(PyExc_AttributeError, name);
5185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005186}
5187
Tim Peters5bd2a792003-02-01 16:45:06 +00005188/* ---------------------------------------------------------------------------
5189 * Module-level functions.
5190 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005191
Martin v. Löwis544f1192004-07-27 05:22:33 +00005192/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005193static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005194cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005196 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005197 PyObject *ob, *file, *res = NULL;
5198 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005199 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005200
Martin v. Löwis544f1192004-07-27 05:22:33 +00005201 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5202 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005203 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005204
Tim Peters5bd2a792003-02-01 16:45:06 +00005205 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005206 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 if (dump(pickler, ob) < 0)
5209 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005211 Py_INCREF(Py_None);
5212 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 finally:
5215 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005217 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005218}
5219
5220
Martin v. Löwis544f1192004-07-27 05:22:33 +00005221/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005222static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005223cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005225 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005226 PyObject *ob, *file = 0, *res = NULL;
5227 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005228 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005229
Martin v. Löwis544f1192004-07-27 05:22:33 +00005230 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5231 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005233
Tim Peterscba30e22003-02-01 06:24:36 +00005234 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005236
Tim Peters5bd2a792003-02-01 16:45:06 +00005237 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005238 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005240 if (dump(pickler, ob) < 0)
5241 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005245 finally:
5246 Py_XDECREF(pickler);
5247 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005250}
5251
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005252
Tim Peters5bd2a792003-02-01 16:45:06 +00005253/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005254static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005255cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256{
5257 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005258 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005259
Tim Peterscba30e22003-02-01 06:24:36 +00005260 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005261 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005263 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 finally:
5266 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005268 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005269}
5270
5271
Tim Peters5bd2a792003-02-01 16:45:06 +00005272/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005273static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005274cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275{
5276 PyObject *ob, *file = 0, *res = NULL;
5277 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005278
Guido van Rossum617dbc42007-05-07 23:57:08 +00005279 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5280 PyErr_Clear();
5281 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5282 goto finally;
5283 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005284
Tim Peterscba30e22003-02-01 06:24:36 +00005285 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005286 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005287
Tim Peterscba30e22003-02-01 06:24:36 +00005288 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005289 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005291 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005293 finally:
5294 Py_XDECREF(file);
5295 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005297 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005298}
5299
5300
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005301PyDoc_STRVAR(Unpicklertype__doc__,
5302"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005303
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005304static PyTypeObject Unpicklertype = {
5305 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005306 0, /*ob_size*/
5307 "cPickle.Unpickler", /*tp_name*/
5308 sizeof(Unpicklerobject), /*tp_basicsize*/
5309 0,
5310 (destructor)Unpickler_dealloc, /* tp_dealloc */
5311 0, /* tp_print */
5312 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5313 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5314 0, /* tp_compare */
5315 0, /* tp_repr */
5316 0, /* tp_as_number */
5317 0, /* tp_as_sequence */
5318 0, /* tp_as_mapping */
5319 0, /* tp_hash */
5320 0, /* tp_call */
5321 0, /* tp_str */
5322 0, /* tp_getattro */
5323 0, /* tp_setattro */
5324 0, /* tp_as_buffer */
5325 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5326 Unpicklertype__doc__, /* tp_doc */
5327 (traverseproc)Unpickler_traverse, /* tp_traverse */
5328 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005329};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005330
Guido van Rossum60456fd1997-04-09 17:36:32 +00005331static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005332 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5333 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005334 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005335 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005336 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005337 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005338
Martin v. Löwis544f1192004-07-27 05:22:33 +00005339 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5340 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005341 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005342 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005343 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005344 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005345
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005346 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005347 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005348
Neal Norwitzb0493252002-03-31 14:44:22 +00005349 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005350 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005351
Martin v. Löwis544f1192004-07-27 05:22:33 +00005352 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5353 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005354 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005355 "This takes a file-like object for writing a pickle data stream.\n"
5356 "The optional proto argument tells the pickler to use the given\n"
5357 "protocol; supported protocols are 0, 1, 2. The default\n"
5358 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5359 "only protocol that can be written to a file opened in text\n"
5360 "mode and read back successfully. When using a protocol higher\n"
5361 "than 0, make sure the file is opened in binary mode, both when\n"
5362 "pickling and unpickling.)\n"
5363 "\n"
5364 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5365 "more efficient than protocol 1.\n"
5366 "\n"
5367 "Specifying a negative protocol version selects the highest\n"
5368 "protocol version supported. The higher the protocol used, the\n"
5369 "more recent the version of Python needed to read the pickle\n"
5370 "produced.\n"
5371 "\n"
5372 "The file parameter must have a write() method that accepts a single\n"
5373 "string argument. It can thus be an open file object, a StringIO\n"
5374 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005375 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005376
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005377 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005378 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5379
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005380 { NULL, NULL }
5381};
5382
Guido van Rossum60456fd1997-04-09 17:36:32 +00005383static int
Tim Peterscba30e22003-02-01 06:24:36 +00005384init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385{
5386 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005387
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005388#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005389
Tim Peters3cfe7542003-05-21 21:29:48 +00005390 if (PyType_Ready(&Unpicklertype) < 0)
5391 return -1;
5392 if (PyType_Ready(&Picklertype) < 0)
5393 return -1;
5394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395 INIT_STR(__class__);
5396 INIT_STR(__getinitargs__);
5397 INIT_STR(__dict__);
5398 INIT_STR(__getstate__);
5399 INIT_STR(__setstate__);
5400 INIT_STR(__name__);
5401 INIT_STR(__main__);
5402 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005403 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005404 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 INIT_STR(append);
5406 INIT_STR(read);
5407 INIT_STR(readline);
5408 INIT_STR(copy_reg);
5409 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005410
Tim Peterscba30e22003-02-01 06:24:36 +00005411 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005412 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005413
Tim Peters1f1b2d22003-02-01 02:16:37 +00005414 /* This is special because we want to use a different
5415 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005416 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005417 if (!dispatch_table) return -1;
5418
5419 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005420 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005421 if (!extension_registry) return -1;
5422
5423 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005424 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005425 if (!inverted_registry) return -1;
5426
5427 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005428 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005429 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005431 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005432
Tim Peters731098b2003-02-04 20:56:09 +00005433 if (!(empty_tuple = PyTuple_New(0)))
5434 return -1;
5435
5436 two_tuple = PyTuple_New(2);
5437 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005438 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005439 /* We use this temp container with no regard to refcounts, or to
5440 * keeping containees alive. Exempt from GC, because we don't
5441 * want anything looking at two_tuple() by magic.
5442 */
5443 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005445 /* Ugh */
5446 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5447 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5448 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 if (!( t=PyDict_New())) return -1;
5451 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 "def __str__(self):\n"
5453 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5454 Py_file_input,
5455 module_dict, t) )) return -1;
5456 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005459 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005460 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005462 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005463
Tim Peterscba30e22003-02-01 06:24:36 +00005464 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005466 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005467 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005469 if (!( t=PyDict_New())) return -1;
5470 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005471 "def __str__(self):\n"
5472 " a=self.args\n"
5473 " a=a and type(a[0]) or '(what)'\n"
5474 " return 'Cannot pickle %s objects' % a\n"
5475 , Py_file_input,
5476 module_dict, t) )) return -1;
5477 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005480 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005481 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005482
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005483 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005486 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005488
Martin v. Löwis658009a2002-09-16 17:26:24 +00005489 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5490 UnpicklingError, NULL)))
5491 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005493 if (PyDict_SetItemString(module_dict, "PickleError",
5494 PickleError) < 0)
5495 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 if (PyDict_SetItemString(module_dict, "PicklingError",
5498 PicklingError) < 0)
5499 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005501 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5502 UnpicklingError) < 0)
5503 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005505 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5506 UnpickleableError) < 0)
5507 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005509 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5510 BadPickleGet) < 0)
5511 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005513 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005515 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005516}
5517
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005518#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5519#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005520#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005521PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005522initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005523{
5524 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005525 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005526 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005527 PyObject *format_version;
5528 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005530 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005531 Unpicklertype.ob_type = &PyType_Type;
5532 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005535 * so we're forced to use a temporary dictionary. :(
5536 */
5537 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005538 if (!di) return;
5539 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005541 /* Create the module and add the functions */
5542 m = Py_InitModule4("cPickle", cPickle_methods,
5543 cPickle_module_documentation,
5544 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005545 if (m == NULL)
5546 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 /* Add some symbolic constants to the module */
5549 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005550 v = PyString_FromString(rev);
5551 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005552 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005554 /* Copy data from di. Waaa. */
5555 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5556 if (PyObject_SetItem(d, k, v) < 0) {
5557 Py_DECREF(di);
5558 return;
5559 }
5560 }
5561 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005562
Tim Peters8587b3c2003-02-13 15:44:41 +00005563 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5564 if (i < 0)
5565 return;
5566
Tim Peters5b7da392003-02-04 00:21:07 +00005567 /* These are purely informational; no code uses them. */
5568 /* File format version we write. */
5569 format_version = PyString_FromString("2.0");
5570 /* Format versions we can read. */
5571 compatible_formats = Py_BuildValue("[sssss]",
5572 "1.0", /* Original protocol 0 */
5573 "1.1", /* Protocol 0 + INST */
5574 "1.2", /* Original protocol 1 */
5575 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005576 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005577 PyDict_SetItemString(d, "format_version", format_version);
5578 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5579 Py_XDECREF(format_version);
5580 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005581}