blob: 7b8ed66fdbd85885953e041b92d38f6ea4b9274c [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
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001259#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001260/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1261 backslash and newline characters to \uXXXX escapes. */
1262static PyObject *
1263modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1264{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 PyObject *repr;
1266 char *p;
1267 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 repr = PyString_FromStringAndSize(NULL, 6 * size);
1272 if (repr == NULL)
1273 return NULL;
1274 if (size == 0)
1275 return repr;
1276
1277 p = q = PyString_AS_STRING(repr);
1278 while (size-- > 0) {
1279 Py_UNICODE ch = *s++;
1280 /* Map 16-bit characters to '\uxxxx' */
1281 if (ch >= 256 || ch == '\\' || ch == '\n') {
1282 *p++ = '\\';
1283 *p++ = 'u';
1284 *p++ = hexdigit[(ch >> 12) & 0xf];
1285 *p++ = hexdigit[(ch >> 8) & 0xf];
1286 *p++ = hexdigit[(ch >> 4) & 0xf];
1287 *p++ = hexdigit[ch & 15];
1288 }
1289 /* Copy everything else as-is */
1290 else
1291 *p++ = (char) ch;
1292 }
1293 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001294 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001295 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001296}
1297
1298
Guido van Rossum60456fd1997-04-09 17:36:32 +00001299static int
Tim Peterscba30e22003-02-01 06:24:36 +00001300save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001302 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001303 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (!PyUnicode_Check(args))
1306 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001308 if (!self->bin) {
1309 char *repr_str;
1310 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 repr = modified_EncodeRawUnicodeEscape(
1313 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001314 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001315 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 if ((len = PyString_Size(repr)) < 0)
1318 goto err;
1319 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Tim Peters0bc93f52003-02-02 18:29:33 +00001321 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Tim Peters0bc93f52003-02-02 18:29:33 +00001324 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001326
Tim Peters0bc93f52003-02-02 18:29:33 +00001327 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 Py_XDECREF(repr);
1331 }
1332 else {
1333 int i;
1334 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Tim Peterscba30e22003-02-01 06:24:36 +00001336 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001337 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 if ((size = PyString_Size(repr)) < 0)
1340 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 {
Tim Peters0bc93f52003-02-02 18:29:33 +00001358 if (self->write_func(self, PyString_AS_STRING(repr),
1359 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}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001376#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001377
Tim Peters1d63c9f2003-02-02 20:29:39 +00001378/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1379static int
Tim Peters67920142003-02-05 03:46:17 +00001380store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001381{
1382 int i;
1383 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001384
Tim Peters1d63c9f2003-02-02 20:29:39 +00001385 assert(PyTuple_Size(t) == len);
1386
1387 for (i = 0; i < len; i++) {
1388 PyObject *element = PyTuple_GET_ITEM(t, i);
1389
1390 if (element == NULL)
1391 goto finally;
1392 if (save(self, element, 0) < 0)
1393 goto finally;
1394 }
1395 res = 0;
1396
1397 finally:
1398 return res;
1399}
1400
1401/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1402 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001403 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001404 * (a tuple can be reached from itself), and that requires some subtle
1405 * magic so that it works in all cases. IOW, this is a long routine.
1406 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001407static int
Tim Peterscba30e22003-02-01 06:24:36 +00001408save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001409{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001410 PyObject *py_tuple_id = NULL;
1411 int len, i;
1412 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001414 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001415 static char pop = POP;
1416 static char pop_mark = POP_MARK;
1417 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if ((len = PyTuple_Size(args)) < 0)
1420 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001421
Tim Peters1d63c9f2003-02-02 20:29:39 +00001422 if (len == 0) {
1423 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001424
Tim Peters1d63c9f2003-02-02 20:29:39 +00001425 if (self->proto) {
1426 c_str[0] = EMPTY_TUPLE;
1427 len = 1;
1428 }
1429 else {
1430 c_str[0] = MARK;
1431 c_str[1] = TUPLE;
1432 len = 2;
1433 }
1434 if (self->write_func(self, c_str, len) >= 0)
1435 res = 0;
1436 /* Don't memoize an empty tuple. */
1437 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001438 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Tim Peters1d63c9f2003-02-02 20:29:39 +00001440 /* A non-empty tuple. */
1441
1442 /* id(tuple) isn't in the memo now. If it shows up there after
1443 * saving the tuple elements, the tuple must be recursive, in
1444 * which case we'll pop everything we put on the stack, and fetch
1445 * its value from the memo.
1446 */
1447 py_tuple_id = PyLong_FromVoidPtr(args);
1448 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001449 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001450
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 if (len <= 3 && self->proto >= 2) {
1452 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001453 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001454 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001456 /* pop the len elements */
1457 for (i = 0; i < len; ++i)
1458 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001460 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 if (get(self, py_tuple_id) < 0)
1462 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001463 res = 0;
1464 goto finally;
1465 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001466 /* Not recursive. */
1467 if (self->write_func(self, len2opcode + len, 1) < 0)
1468 goto finally;
1469 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001470 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001471
Tim Peters1d63c9f2003-02-02 20:29:39 +00001472 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1473 * Generate MARK elt1 elt2 ... TUPLE
1474 */
1475 if (self->write_func(self, &MARKv, 1) < 0)
1476 goto finally;
1477
Tim Peters67920142003-02-05 03:46:17 +00001478 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001479 goto finally;
1480
1481 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1482 /* pop the stack stuff we pushed */
1483 if (self->bin) {
1484 if (self->write_func(self, &pop_mark, 1) < 0)
1485 goto finally;
1486 }
1487 else {
1488 /* Note that we pop one more than len, to remove
1489 * the MARK too.
1490 */
1491 for (i = 0; i <= len; i++)
1492 if (self->write_func(self, &pop, 1) < 0)
1493 goto finally;
1494 }
1495 /* fetch from memo */
1496 if (get(self, py_tuple_id) >= 0)
1497 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001498 goto finally;
1499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500
Tim Peters1d63c9f2003-02-02 20:29:39 +00001501 /* Not recursive. */
1502 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001504
Tim Peters1d63c9f2003-02-02 20:29:39 +00001505 memoize:
1506 if (put(self, args) >= 0)
1507 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 finally:
1510 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001511 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001512}
1513
Tim Peters1092d642003-02-11 21:06:20 +00001514/* iter is an iterator giving items, and we batch up chunks of
1515 * MARK item item ... item APPENDS
1516 * opcode sequences. Calling code should have arranged to first create an
1517 * empty list, or list-like object, for the APPENDS to operate on.
1518 * Returns 0 on success, <0 on error.
1519 */
1520static int
1521batch_list(Picklerobject *self, PyObject *iter)
1522{
1523 PyObject *obj;
1524 PyObject *slice[BATCHSIZE];
1525 int i, n;
1526
1527 static char append = APPEND;
1528 static char appends = APPENDS;
1529
1530 assert(iter != NULL);
1531
1532 if (self->proto == 0) {
1533 /* APPENDS isn't available; do one at a time. */
1534 for (;;) {
1535 obj = PyIter_Next(iter);
1536 if (obj == NULL) {
1537 if (PyErr_Occurred())
1538 return -1;
1539 break;
1540 }
1541 i = save(self, obj, 0);
1542 Py_DECREF(obj);
1543 if (i < 0)
1544 return -1;
1545 if (self->write_func(self, &append, 1) < 0)
1546 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001547 }
1548 return 0;
1549 }
1550
1551 /* proto > 0: write in batches of BATCHSIZE. */
1552 do {
1553 /* Get next group of (no more than) BATCHSIZE elements. */
1554 for (n = 0; n < BATCHSIZE; ++n) {
1555 obj = PyIter_Next(iter);
1556 if (obj == NULL) {
1557 if (PyErr_Occurred())
1558 goto BatchFailed;
1559 break;
1560 }
1561 slice[n] = obj;
1562 }
1563
1564 if (n > 1) {
1565 /* Pump out MARK, slice[0:n], APPENDS. */
1566 if (self->write_func(self, &MARKv, 1) < 0)
1567 goto BatchFailed;
1568 for (i = 0; i < n; ++i) {
1569 if (save(self, slice[i], 0) < 0)
1570 goto BatchFailed;
1571 }
1572 if (self->write_func(self, &appends, 1) < 0)
1573 goto BatchFailed;
1574 }
1575 else if (n == 1) {
1576 if (save(self, slice[0], 0) < 0)
1577 goto BatchFailed;
1578 if (self->write_func(self, &append, 1) < 0)
1579 goto BatchFailed;
1580 }
1581
1582 for (i = 0; i < n; ++i) {
1583 Py_DECREF(slice[i]);
1584 }
Tim Peters90975f12003-02-12 05:28:58 +00001585 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001586 return 0;
1587
1588BatchFailed:
1589 while (--n >= 0) {
1590 Py_DECREF(slice[n]);
1591 }
1592 return -1;
1593}
1594
Guido van Rossum60456fd1997-04-09 17:36:32 +00001595static int
Tim Peterscba30e22003-02-01 06:24:36 +00001596save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597{
Tim Peters1092d642003-02-11 21:06:20 +00001598 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001600 int len;
1601 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001603 if (self->fast && !fast_save_enter(self, args))
1604 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001605
Tim Peters1092d642003-02-11 21:06:20 +00001606 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 if (self->bin) {
1608 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001609 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 }
1611 else {
1612 s[0] = MARK;
1613 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001614 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001615 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001616
Tim Peters1092d642003-02-11 21:06:20 +00001617 if (self->write_func(self, s, len) < 0)
1618 goto finally;
1619
1620 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 if ((len = PyList_Size(args)) < 0)
1622 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001623
Tim Peters1092d642003-02-11 21:06:20 +00001624 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001625 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001626 if (put(self, args) >= 0)
1627 res = 0;
1628 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 }
Tim Peters90975f12003-02-12 05:28:58 +00001630 if (put2(self, args) < 0)
1631 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001632
Tim Peters1092d642003-02-11 21:06:20 +00001633 /* Materialize the list elements. */
1634 iter = PyObject_GetIter(args);
1635 if (iter == NULL)
1636 goto finally;
1637 res = batch_list(self, iter);
1638 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 finally:
1641 if (self->fast && !fast_save_leave(self, args))
1642 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001645}
1646
1647
Tim Peters42f08ac2003-02-11 22:43:24 +00001648/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1649 * MARK key value ... key value SETITEMS
1650 * opcode sequences. Calling code should have arranged to first create an
1651 * empty dict, or dict-like object, for the SETITEMS to operate on.
1652 * Returns 0 on success, <0 on error.
1653 *
1654 * This is very much like batch_list(). The difference between saving
1655 * elements directly, and picking apart two-tuples, is so long-winded at
1656 * the C level, though, that attempts to combine these routines were too
1657 * ugly to bear.
1658 */
1659static int
1660batch_dict(Picklerobject *self, PyObject *iter)
1661{
1662 PyObject *p;
1663 PyObject *slice[BATCHSIZE];
1664 int i, n;
1665
1666 static char setitem = SETITEM;
1667 static char setitems = SETITEMS;
1668
1669 assert(iter != NULL);
1670
1671 if (self->proto == 0) {
1672 /* SETITEMS isn't available; do one at a time. */
1673 for (;;) {
1674 p = PyIter_Next(iter);
1675 if (p == NULL) {
1676 if (PyErr_Occurred())
1677 return -1;
1678 break;
1679 }
1680 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1681 PyErr_SetString(PyExc_TypeError, "dict items "
1682 "iterator must return 2-tuples");
1683 return -1;
1684 }
1685 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1686 if (i >= 0)
1687 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1688 Py_DECREF(p);
1689 if (i < 0)
1690 return -1;
1691 if (self->write_func(self, &setitem, 1) < 0)
1692 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001693 }
1694 return 0;
1695 }
1696
1697 /* proto > 0: write in batches of BATCHSIZE. */
1698 do {
1699 /* Get next group of (no more than) BATCHSIZE elements. */
1700 for (n = 0; n < BATCHSIZE; ++n) {
1701 p = PyIter_Next(iter);
1702 if (p == NULL) {
1703 if (PyErr_Occurred())
1704 goto BatchFailed;
1705 break;
1706 }
1707 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1708 PyErr_SetString(PyExc_TypeError, "dict items "
1709 "iterator must return 2-tuples");
1710 goto BatchFailed;
1711 }
1712 slice[n] = p;
1713 }
1714
1715 if (n > 1) {
1716 /* Pump out MARK, slice[0:n], SETITEMS. */
1717 if (self->write_func(self, &MARKv, 1) < 0)
1718 goto BatchFailed;
1719 for (i = 0; i < n; ++i) {
1720 p = slice[i];
1721 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1722 goto BatchFailed;
1723 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1724 goto BatchFailed;
1725 }
1726 if (self->write_func(self, &setitems, 1) < 0)
1727 goto BatchFailed;
1728 }
1729 else if (n == 1) {
1730 p = slice[0];
1731 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1732 goto BatchFailed;
1733 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1734 goto BatchFailed;
1735 if (self->write_func(self, &setitem, 1) < 0)
1736 goto BatchFailed;
1737 }
1738
1739 for (i = 0; i < n; ++i) {
1740 Py_DECREF(slice[i]);
1741 }
Tim Peters90975f12003-02-12 05:28:58 +00001742 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001743 return 0;
1744
1745BatchFailed:
1746 while (--n >= 0) {
1747 Py_DECREF(slice[n]);
1748 }
1749 return -1;
1750}
1751
Guido van Rossum60456fd1997-04-09 17:36:32 +00001752static int
Tim Peterscba30e22003-02-01 06:24:36 +00001753save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754{
Tim Peters42f08ac2003-02-11 22:43:24 +00001755 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001757 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001758 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001760 if (self->fast && !fast_save_enter(self, args))
1761 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001762
Tim Peters42f08ac2003-02-11 22:43:24 +00001763 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 if (self->bin) {
1765 s[0] = EMPTY_DICT;
1766 len = 1;
1767 }
1768 else {
1769 s[0] = MARK;
1770 s[1] = DICT;
1771 len = 2;
1772 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Tim Peters0bc93f52003-02-02 18:29:33 +00001774 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001776
Tim Peters42f08ac2003-02-11 22:43:24 +00001777 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 if ((len = PyDict_Size(args)) < 0)
1779 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001781 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001782 if (put(self, args) >= 0)
1783 res = 0;
1784 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 }
Tim Peters90975f12003-02-12 05:28:58 +00001786 if (put2(self, args) < 0)
1787 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001788
Tim Peters42f08ac2003-02-11 22:43:24 +00001789 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001790 items = PyObject_CallMethod(args, "items", "()");
1791 if (items == NULL)
1792 goto finally;
1793 iter = PyObject_GetIter(items);
1794 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001795 if (iter == NULL)
1796 goto finally;
1797 res = batch_dict(self, iter);
1798 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 finally:
1801 if (self->fast && !fast_save_leave(self, args))
1802 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805}
1806
1807
Guido van Rossum60456fd1997-04-09 17:36:32 +00001808static int
Tim Peterscba30e22003-02-01 06:24:36 +00001809save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001811 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 char *name_str, *module_str;
1813 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 if (name) {
1818 global_name = name;
1819 Py_INCREF(global_name);
1820 }
1821 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001822 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 goto finally;
1824 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001825
Tim Peterscba30e22003-02-01 06:24:36 +00001826 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001829 if ((module_size = PyString_Size(module)) < 0 ||
1830 (name_size = PyString_Size(global_name)) < 0)
1831 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 module_str = PyString_AS_STRING((PyStringObject *)module);
1834 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Guido van Rossum75bfd052002-12-24 18:10:07 +00001836 /* XXX This can be doing a relative import. Clearly it shouldn't,
1837 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 mod = PyImport_ImportModule(module_str);
1839 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001841 "Can't pickle %s: import of module %s "
1842 "failed",
1843 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 goto finally;
1845 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001846 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 if (klass == NULL) {
1848 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001849 "Can't pickle %s: attribute lookup %s.%s "
1850 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 "OSS", args, module, global_name);
1852 goto finally;
1853 }
1854 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001855 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001856 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001857 "Can't pickle %s: it's not the same object "
1858 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 "OSS", args, module, global_name);
1860 goto finally;
1861 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001862 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001863
Tim Peters731098b2003-02-04 20:56:09 +00001864 if (self->proto >= 2) {
1865 /* See whether this is in the extension registry, and if
1866 * so generate an EXT opcode.
1867 */
1868 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001869 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001870 char c_str[5];
1871 int n;
1872
1873 PyTuple_SET_ITEM(two_tuple, 0, module);
1874 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1875 py_code = PyDict_GetItem(extension_registry, two_tuple);
1876 if (py_code == NULL)
1877 goto gen_global; /* not registered */
1878
1879 /* Verify py_code has the right type and value. */
1880 if (!PyInt_Check(py_code)) {
1881 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001882 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001883 "OO", args, py_code);
1884 goto finally;
1885 }
1886 code = PyInt_AS_LONG(py_code);
1887 if (code <= 0 || code > 0x7fffffffL) {
1888 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1889 "extension code %ld is out of range",
1890 "Ol", args, code);
1891 goto finally;
1892 }
1893
1894 /* Generate an EXT opcode. */
1895 if (code <= 0xff) {
1896 c_str[0] = EXT1;
1897 c_str[1] = (char)code;
1898 n = 2;
1899 }
1900 else if (code <= 0xffff) {
1901 c_str[0] = EXT2;
1902 c_str[1] = (char)(code & 0xff);
1903 c_str[2] = (char)((code >> 8) & 0xff);
1904 n = 3;
1905 }
1906 else {
1907 c_str[0] = EXT4;
1908 c_str[1] = (char)(code & 0xff);
1909 c_str[2] = (char)((code >> 8) & 0xff);
1910 c_str[3] = (char)((code >> 16) & 0xff);
1911 c_str[4] = (char)((code >> 24) & 0xff);
1912 n = 5;
1913 }
1914
1915 if (self->write_func(self, c_str, n) >= 0)
1916 res = 0;
1917 goto finally; /* and don't memoize */
1918 }
1919
1920 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001921 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Tim Peters0bc93f52003-02-02 18:29:33 +00001924 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001926
Tim Peters0bc93f52003-02-02 18:29:33 +00001927 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Tim Peters0bc93f52003-02-02 18:29:33 +00001930 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001931 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Tim Peters0bc93f52003-02-02 18:29:33 +00001933 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if (put(self, args) < 0)
1937 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 finally:
1942 Py_XDECREF(module);
1943 Py_XDECREF(global_name);
1944 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947}
1948
Guido van Rossum60456fd1997-04-09 17:36:32 +00001949static int
Tim Peterscba30e22003-02-01 06:24:36 +00001950save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951{
1952 PyObject *pid = 0;
1953 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 Py_INCREF(args);
1958 ARG_TUP(self, args);
1959 if (self->arg) {
1960 pid = PyObject_Call(f, self->arg, NULL);
1961 FREE_ARG_TUP(self);
1962 }
1963 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001965 if (pid != Py_None) {
1966 if (!self->bin) {
1967 if (!PyString_Check(pid)) {
1968 PyErr_SetString(PicklingError,
1969 "persistent id must be string");
1970 goto finally;
1971 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001972
Tim Peters0bc93f52003-02-02 18:29:33 +00001973 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 if ((size = PyString_Size(pid)) < 0)
1977 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001978
Tim Peters0bc93f52003-02-02 18:29:33 +00001979 if (self->write_func(self,
1980 PyString_AS_STRING(
1981 (PyStringObject *)pid),
1982 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001983 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001984
Tim Peters0bc93f52003-02-02 18:29:33 +00001985 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001988 res = 1;
1989 goto finally;
1990 }
1991 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001992 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001993 res = -1;
1994 else
1995 res = 1;
1996 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 goto finally;
1999 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002001 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002003 finally:
2004 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002007}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002008
Tim Peters71fcda52003-02-14 23:05:28 +00002009/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2010 * appropriate __reduce__ method for ob.
2011 */
Tim Peters84e87f32001-03-17 04:50:51 +00002012static int
Tim Peters71fcda52003-02-14 23:05:28 +00002013save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002014{
Tim Peters71fcda52003-02-14 23:05:28 +00002015 PyObject *callable;
2016 PyObject *argtup;
2017 PyObject *state = NULL;
2018 PyObject *listitems = NULL;
2019 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002020
Tim Peters71fcda52003-02-14 23:05:28 +00002021 int use_newobj = self->proto >= 2;
2022
2023 static char reduce = REDUCE;
2024 static char build = BUILD;
2025 static char newobj = NEWOBJ;
2026
2027 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2028 &callable,
2029 &argtup,
2030 &state,
2031 &listitems,
2032 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002034
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002035 if (!PyTuple_Check(argtup)) {
2036 PyErr_SetString(PicklingError,
2037 "args from reduce() should be a tuple");
2038 return -1;
2039 }
2040
Tim Peters71fcda52003-02-14 23:05:28 +00002041 if (state == Py_None)
2042 state = NULL;
2043 if (listitems == Py_None)
2044 listitems = NULL;
2045 if (dictitems == Py_None)
2046 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Tim Peters71fcda52003-02-14 23:05:28 +00002048 /* Protocol 2 special case: if callable's name is __newobj__, use
2049 * NEWOBJ. This consumes a lot of code.
2050 */
2051 if (use_newobj) {
2052 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002053
Tim Peters71fcda52003-02-14 23:05:28 +00002054 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002055 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2056 PyErr_Clear();
2057 else
2058 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002059 use_newobj = 0;
2060 }
2061 else {
2062 use_newobj = PyString_Check(temp) &&
2063 strcmp(PyString_AS_STRING(temp),
2064 "__newobj__") == 0;
2065 Py_DECREF(temp);
2066 }
2067 }
2068 if (use_newobj) {
2069 PyObject *cls;
2070 PyObject *newargtup;
2071 int n, i;
2072
2073 /* Sanity checks. */
2074 n = PyTuple_Size(argtup);
2075 if (n < 1) {
2076 PyErr_SetString(PicklingError, "__newobj__ arglist "
2077 "is empty");
2078 return -1;
2079 }
2080
2081 cls = PyTuple_GET_ITEM(argtup, 0);
2082 if (! PyObject_HasAttrString(cls, "__new__")) {
2083 PyErr_SetString(PicklingError, "args[0] from "
2084 "__newobj__ args has no __new__");
2085 return -1;
2086 }
2087
2088 /* XXX How could ob be NULL? */
2089 if (ob != NULL) {
2090 PyObject *ob_dot_class;
2091
2092 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002093 if (ob_dot_class == NULL) {
2094 if (PyErr_ExceptionMatches(
2095 PyExc_AttributeError))
2096 PyErr_Clear();
2097 else
2098 return -1;
2099 }
Tim Peters71fcda52003-02-14 23:05:28 +00002100 i = ob_dot_class != cls; /* true iff a problem */
2101 Py_XDECREF(ob_dot_class);
2102 if (i) {
2103 PyErr_SetString(PicklingError, "args[0] from "
2104 "__newobj__ args has the wrong class");
2105 return -1;
2106 }
2107 }
2108
2109 /* Save the class and its __new__ arguments. */
2110 if (save(self, cls, 0) < 0)
2111 return -1;
2112
2113 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2114 if (newargtup == NULL)
2115 return -1;
2116 for (i = 1; i < n; ++i) {
2117 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2118 Py_INCREF(temp);
2119 PyTuple_SET_ITEM(newargtup, i-1, temp);
2120 }
2121 i = save(self, newargtup, 0) < 0;
2122 Py_DECREF(newargtup);
2123 if (i < 0)
2124 return -1;
2125
2126 /* Add NEWOBJ opcode. */
2127 if (self->write_func(self, &newobj, 1) < 0)
2128 return -1;
2129 }
2130 else {
2131 /* Not using NEWOBJ. */
2132 if (save(self, callable, 0) < 0 ||
2133 save(self, argtup, 0) < 0 ||
2134 self->write_func(self, &reduce, 1) < 0)
2135 return -1;
2136 }
2137
2138 /* Memoize. */
2139 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (ob != NULL) {
2141 if (state && !PyDict_Check(state)) {
2142 if (put2(self, ob) < 0)
2143 return -1;
2144 }
Tim Peters71fcda52003-02-14 23:05:28 +00002145 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 }
Tim Peters84e87f32001-03-17 04:50:51 +00002148
Guido van Rossum60456fd1997-04-09 17:36:32 +00002149
Tim Peters71fcda52003-02-14 23:05:28 +00002150 if (listitems && batch_list(self, listitems) < 0)
2151 return -1;
2152
2153 if (dictitems && batch_dict(self, dictitems) < 0)
2154 return -1;
2155
2156 if (state) {
2157 if (save(self, state, 0) < 0 ||
2158 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002159 return -1;
2160 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002162 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002164
Guido van Rossum60456fd1997-04-09 17:36:32 +00002165static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002166save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002167{
2168 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002169 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2170 PyObject *arg_tup;
2171 int res = -1;
2172 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002173
Martin v. Löwis5a395302002-08-04 08:20:23 +00002174 if (self->nesting++ > Py_GetRecursionLimit()){
2175 PyErr_SetString(PyExc_RuntimeError,
2176 "maximum recursion depth exceeded");
2177 goto finally;
2178 }
2179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002180 if (!pers_save && self->pers_func) {
2181 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2182 res = tmp;
2183 goto finally;
2184 }
2185 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002187 if (args == Py_None) {
2188 res = save_none(self, args);
2189 goto finally;
2190 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002195 case 'b':
2196 if (args == Py_False || args == Py_True) {
2197 res = save_bool(self, args);
2198 goto finally;
2199 }
2200 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002201 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 if (type == &PyLong_Type) {
2203 res = save_long(self, args);
2204 goto finally;
2205 }
2206 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002207
Guido van Rossum60456fd1997-04-09 17:36:32 +00002208 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002209 if (type == &PyFloat_Type) {
2210 res = save_float(self, args);
2211 goto finally;
2212 }
2213 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002214
Guido van Rossum60456fd1997-04-09 17:36:32 +00002215 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002216 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2217 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218 goto finally;
2219 }
2220 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002221
Guido van Rossum60456fd1997-04-09 17:36:32 +00002222 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002223 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2224 res = save_string(self, args, 0);
2225 goto finally;
2226 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002227
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002228#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002229 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2231 res = save_unicode(self, args, 0);
2232 goto finally;
2233 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002234#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002237 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002238 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 if (PyDict_GetItem(self->memo, py_ob_id)) {
2242 if (get(self, py_ob_id) < 0)
2243 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 res = 0;
2246 goto finally;
2247 }
2248 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002250 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002251 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002252 if (type == &PyString_Type) {
2253 res = save_string(self, args, 1);
2254 goto finally;
2255 }
2256 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002257
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002258#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002259 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002260 if (type == &PyUnicode_Type) {
2261 res = save_unicode(self, args, 1);
2262 goto finally;
2263 }
2264 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002265#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002266
Guido van Rossum60456fd1997-04-09 17:36:32 +00002267 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 if (type == &PyTuple_Type) {
2269 res = save_tuple(self, args);
2270 goto finally;
2271 }
2272 if (type == &PyType_Type) {
2273 res = save_global(self, args, NULL);
2274 goto finally;
2275 }
2276 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Guido van Rossum60456fd1997-04-09 17:36:32 +00002278 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 if (type == &PyList_Type) {
2280 res = save_list(self, args);
2281 goto finally;
2282 }
2283 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002284
2285 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 if (type == &PyDict_Type) {
2287 res = save_dict(self, args);
2288 goto finally;
2289 }
2290 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002291
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002292 case 'i':
2293 break;
2294
2295 case 'c':
2296 break;
2297
Guido van Rossum60456fd1997-04-09 17:36:32 +00002298 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 if (type == &PyFunction_Type) {
2300 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002301 if (res && PyErr_ExceptionMatches(PickleError)) {
2302 /* fall back to reduce */
2303 PyErr_Clear();
2304 break;
2305 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002306 goto finally;
2307 }
2308 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002309
2310 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 if (type == &PyCFunction_Type) {
2312 res = save_global(self, args, NULL);
2313 goto finally;
2314 }
2315 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 if (!pers_save && self->inst_pers_func) {
2318 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2319 res = tmp;
2320 goto finally;
2321 }
2322 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002323
Jeremy Hylton39c61162002-07-16 19:47:43 +00002324 if (PyType_IsSubtype(type, &PyType_Type)) {
2325 res = save_global(self, args, NULL);
2326 goto finally;
2327 }
2328
Guido van Rossumb289b872003-02-19 01:45:13 +00002329 /* Get a reduction callable, and call it. This may come from
2330 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2331 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002332 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002333 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2334 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002336 Py_INCREF(args);
2337 ARG_TUP(self, args);
2338 if (self->arg) {
2339 t = PyObject_Call(__reduce__, self->arg, NULL);
2340 FREE_ARG_TUP(self);
2341 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 }
2343 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002344 /* Check for a __reduce_ex__ method. */
2345 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2346 if (__reduce__ != NULL) {
2347 t = PyInt_FromLong(self->proto);
2348 if (t != NULL) {
2349 ARG_TUP(self, t);
2350 t = NULL;
2351 if (self->arg) {
2352 t = PyObject_Call(__reduce__,
2353 self->arg, NULL);
2354 FREE_ARG_TUP(self);
2355 }
2356 }
2357 }
2358 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002359 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2360 PyErr_Clear();
2361 else
2362 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002363 /* Check for a __reduce__ method. */
2364 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2365 if (__reduce__ != NULL) {
2366 t = PyObject_Call(__reduce__,
2367 empty_tuple, NULL);
2368 }
2369 else {
2370 PyErr_SetObject(UnpickleableError, args);
2371 goto finally;
2372 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002375
Tim Peters71fcda52003-02-14 23:05:28 +00002376 if (t == NULL)
2377 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002378
Tim Peters71fcda52003-02-14 23:05:28 +00002379 if (PyString_Check(t)) {
2380 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002381 goto finally;
2382 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002383
Tim Peters71fcda52003-02-14 23:05:28 +00002384 if (! PyTuple_Check(t)) {
2385 cPickle_ErrFormat(PicklingError, "Value returned by "
2386 "%s must be string or tuple",
2387 "O", __reduce__);
2388 goto finally;
2389 }
2390
2391 size = PyTuple_Size(t);
2392 if (size < 2 || size > 5) {
2393 cPickle_ErrFormat(PicklingError, "tuple returned by "
2394 "%s must contain 2 through 5 elements",
2395 "O", __reduce__);
2396 goto finally;
2397 }
2398
2399 arg_tup = PyTuple_GET_ITEM(t, 1);
2400 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2401 cPickle_ErrFormat(PicklingError, "Second element of "
2402 "tuple returned by %s must be a tuple",
2403 "O", __reduce__);
2404 goto finally;
2405 }
2406
2407 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002410 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411 Py_XDECREF(py_ob_id);
2412 Py_XDECREF(__reduce__);
2413 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002416}
2417
2418
2419static int
Tim Peterscba30e22003-02-01 06:24:36 +00002420dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421{
2422 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002423
Tim Peters4190fb82003-02-02 16:09:05 +00002424 if (self->proto >= 2) {
2425 char bytes[2];
2426
2427 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002428 assert(self->proto >= 0 && self->proto < 256);
2429 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002430 if (self->write_func(self, bytes, 2) < 0)
2431 return -1;
2432 }
2433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002434 if (save(self, args, 0) < 0)
2435 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
Tim Peters4190fb82003-02-02 16:09:05 +00002437 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002439
Tim Peters4190fb82003-02-02 16:09:05 +00002440 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002444}
2445
2446static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002447Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002448{
Tim Peterscba30e22003-02-01 06:24:36 +00002449 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002450 PyDict_Clear(self->memo);
2451 Py_INCREF(Py_None);
2452 return Py_None;
2453}
2454
2455static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002456Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002457{
2458 int l, i, rsize, ssize, clear=1, lm;
2459 long ik;
2460 PyObject *k, *r;
2461 char *s, *p, *have_get;
2462 Pdata *data;
2463
2464 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002465 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002466 return NULL;
2467
2468 /* Check to make sure we are based on a list */
2469 if (! Pdata_Check(self->file)) {
2470 PyErr_SetString(PicklingError,
2471 "Attempt to getvalue() a non-list-based pickler");
2472 return NULL;
2473 }
2474
2475 /* flush write buffer */
2476 if (write_other(self, NULL, 0) < 0) return NULL;
2477
2478 data=(Pdata*)self->file;
2479 l=data->length;
2480
2481 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002482 lm = PyDict_Size(self->memo);
2483 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002484 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002485 have_get = malloc(lm);
2486 if (have_get == NULL) return PyErr_NoMemory();
2487 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488
2489 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002490 for (rsize = 0, i = l; --i >= 0; ) {
2491 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492
Tim Petersac5687a2003-02-02 18:08:34 +00002493 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495
2496 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002497 ik = PyInt_AsLong(k);
2498 if (ik == -1 && PyErr_Occurred())
2499 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002500 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 PyErr_SetString(PicklingError,
2502 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002503 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 }
Tim Petersac5687a2003-02-02 18:08:34 +00002505 if (have_get[ik]) /* with matching get */
2506 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002507 }
2508
2509 else if (! (PyTuple_Check(k) &&
2510 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002511 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002512 ) {
2513 PyErr_SetString(PicklingError,
2514 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002515 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 }
2517
2518 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002519 ik = PyInt_AsLong(k);
2520 if (ik == -1 && PyErr_Occurred())
2521 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002522 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 PyErr_SetString(PicklingError,
2524 "Invalid get data");
2525 return NULL;
2526 }
Tim Petersac5687a2003-02-02 18:08:34 +00002527 have_get[ik] = 1;
2528 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530 }
2531
2532 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002533 r = PyString_FromStringAndSize(NULL, rsize);
2534 if (r == NULL) goto err;
2535 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536
Tim Petersac5687a2003-02-02 18:08:34 +00002537 for (i = 0; i < l; i++) {
2538 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539
2540 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002541 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002543 p=PyString_AS_STRING((PyStringObject *)k);
2544 while (--ssize >= 0)
2545 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546 }
2547 }
2548
2549 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002550 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2551 if (ik == -1 && PyErr_Occurred())
2552 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002553 if (ik < 256) {
2554 *s++ = BINGET;
2555 *s++ = (int)(ik & 0xff);
2556 }
2557 else {
2558 *s++ = LONG_BINGET;
2559 *s++ = (int)(ik & 0xff);
2560 *s++ = (int)((ik >> 8) & 0xff);
2561 *s++ = (int)((ik >> 16) & 0xff);
2562 *s++ = (int)((ik >> 24) & 0xff);
2563 }
2564 }
2565
2566 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002567 ik = PyLong_AsLong(k);
2568 if (ik == -1 && PyErr_Occurred())
2569 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570
2571 if (have_get[ik]) { /* with matching get */
2572 if (ik < 256) {
2573 *s++ = BINPUT;
2574 *s++ = (int)(ik & 0xff);
2575 }
2576 else {
2577 *s++ = LONG_BINPUT;
2578 *s++ = (int)(ik & 0xff);
2579 *s++ = (int)((ik >> 8) & 0xff);
2580 *s++ = (int)((ik >> 16) & 0xff);
2581 *s++ = (int)((ik >> 24) & 0xff);
2582 }
2583 }
2584 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 }
2586
2587 if (clear) {
2588 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002589 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 }
2591
2592 free(have_get);
2593 return r;
2594 err:
2595 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002596 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002597}
2598
2599static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002600Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601{
2602 PyObject *ob;
2603 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002604
Tim Peterscba30e22003-02-01 06:24:36 +00002605 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 if (dump(self, ob) < 0)
2609 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002611 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613 /* XXX Why does dump() return self? */
2614 Py_INCREF(self);
2615 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002616}
2617
2618
Tim Peterscba30e22003-02-01 06:24:36 +00002619static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002620{
Neal Norwitzb0493252002-03-31 14:44:22 +00002621 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002622 PyDoc_STR("dump(object) -- "
2623 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002624 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002625 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002626 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002627 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002628 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002629};
2630
2631
2632static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002633newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634{
2635 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002636
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002638 proto = HIGHEST_PROTOCOL;
2639 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002640 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2641 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002642 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002643 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002644 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002645
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002646 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002647 if (self == NULL)
2648 return NULL;
2649 self->proto = proto;
2650 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 self->fp = NULL;
2652 self->write = NULL;
2653 self->memo = NULL;
2654 self->arg = NULL;
2655 self->pers_func = NULL;
2656 self->inst_pers_func = NULL;
2657 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002659 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 self->fast_container = 0;
2661 self->fast_memo = NULL;
2662 self->buf_size = 0;
2663 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002664
Tim Peters5bd2a792003-02-01 16:45:06 +00002665 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 if (file)
2667 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002668 else {
2669 file = Pdata_New();
2670 if (file == NULL)
2671 goto err;
2672 }
2673 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002674
Tim Peterscba30e22003-02-01 06:24:36 +00002675 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 if (PyFile_Check(file)) {
2679 self->fp = PyFile_AsFile(file);
2680 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002681 PyErr_SetString(PyExc_ValueError,
2682 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002683 goto err;
2684 }
2685 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002686 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002687 else if (PycStringIO_OutputCheck(file)) {
2688 self->write_func = write_cStringIO;
2689 }
2690 else if (file == Py_None) {
2691 self->write_func = write_none;
2692 }
2693 else {
2694 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002696 if (! Pdata_Check(file)) {
2697 self->write = PyObject_GetAttr(file, write_str);
2698 if (!self->write) {
2699 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002700 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 "argument must have 'write' "
2702 "attribute");
2703 goto err;
2704 }
2705 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002706
Tim Peters5bd2a792003-02-01 16:45:06 +00002707 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2708 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709 PyErr_NoMemory();
2710 goto err;
2711 }
2712 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 if (PyEval_GetRestricted()) {
2715 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002716 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002717
Tim Peters5b7da392003-02-04 00:21:07 +00002718 if (m == NULL)
2719 goto err;
2720 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002722 if (self->dispatch_table == NULL)
2723 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 }
2725 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002726 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 Py_INCREF(dispatch_table);
2728 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002729 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002734 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002736}
2737
2738
2739static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002740get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002741{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002742 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002744 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002745
Tim Peters92c8bb32003-02-13 23:00:26 +00002746 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002747 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002748 * accepts Pickler() and Pickler(integer) too. The meaning then
2749 * is clear as mud, undocumented, and not supported by pickle.py.
2750 * I'm told Zope uses this, but I haven't traced into this code
2751 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002752 */
2753 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002755 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002756 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2757 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002758 return NULL;
2759 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002760 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002761}
2762
2763
2764static void
Tim Peterscba30e22003-02-01 06:24:36 +00002765Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002767 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002768 Py_XDECREF(self->write);
2769 Py_XDECREF(self->memo);
2770 Py_XDECREF(self->fast_memo);
2771 Py_XDECREF(self->arg);
2772 Py_XDECREF(self->file);
2773 Py_XDECREF(self->pers_func);
2774 Py_XDECREF(self->inst_pers_func);
2775 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002776 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002777 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002778}
2779
2780static int
2781Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2782{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002783 Py_VISIT(self->write);
2784 Py_VISIT(self->memo);
2785 Py_VISIT(self->fast_memo);
2786 Py_VISIT(self->arg);
2787 Py_VISIT(self->file);
2788 Py_VISIT(self->pers_func);
2789 Py_VISIT(self->inst_pers_func);
2790 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002791 return 0;
2792}
2793
2794static int
2795Pickler_clear(Picklerobject *self)
2796{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002797 Py_CLEAR(self->write);
2798 Py_CLEAR(self->memo);
2799 Py_CLEAR(self->fast_memo);
2800 Py_CLEAR(self->arg);
2801 Py_CLEAR(self->file);
2802 Py_CLEAR(self->pers_func);
2803 Py_CLEAR(self->inst_pers_func);
2804 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002805 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002806}
2807
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002808static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002809Pickler_get_pers_func(Picklerobject *p)
2810{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 if (p->pers_func == NULL)
2812 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2813 else
2814 Py_INCREF(p->pers_func);
2815 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002816}
2817
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002818static int
2819Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2820{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 if (v == NULL) {
2822 PyErr_SetString(PyExc_TypeError,
2823 "attribute deletion is not supported");
2824 return -1;
2825 }
2826 Py_XDECREF(p->pers_func);
2827 Py_INCREF(v);
2828 p->pers_func = v;
2829 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002830}
2831
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002832static int
2833Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2834{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 if (v == NULL) {
2836 PyErr_SetString(PyExc_TypeError,
2837 "attribute deletion is not supported");
2838 return -1;
2839 }
2840 Py_XDECREF(p->inst_pers_func);
2841 Py_INCREF(v);
2842 p->inst_pers_func = v;
2843 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002844}
2845
2846static PyObject *
2847Pickler_get_memo(Picklerobject *p)
2848{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 if (p->memo == NULL)
2850 PyErr_SetString(PyExc_AttributeError, "memo");
2851 else
2852 Py_INCREF(p->memo);
2853 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002854}
2855
2856static int
2857Pickler_set_memo(Picklerobject *p, PyObject *v)
2858{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 if (v == NULL) {
2860 PyErr_SetString(PyExc_TypeError,
2861 "attribute deletion is not supported");
2862 return -1;
2863 }
2864 if (!PyDict_Check(v)) {
2865 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2866 return -1;
2867 }
2868 Py_XDECREF(p->memo);
2869 Py_INCREF(v);
2870 p->memo = v;
2871 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002872}
2873
2874static PyObject *
2875Pickler_get_error(Picklerobject *p)
2876{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 /* why is this an attribute on the Pickler? */
2878 Py_INCREF(PicklingError);
2879 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002880}
2881
2882static PyMemberDef Pickler_members[] = {
2883 {"binary", T_INT, offsetof(Picklerobject, bin)},
2884 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002885 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002886};
2887
2888static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002889 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002890 (setter)Pickler_set_pers_func},
2891 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2892 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002893 {"PicklingError", (getter)Pickler_get_error, NULL},
2894 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002895};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002896
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002897PyDoc_STRVAR(Picklertype__doc__,
2898"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002899
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002900static PyTypeObject Picklertype = {
2901 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002902 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002903 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002904 sizeof(Picklerobject), /*tp_basicsize*/
2905 0,
2906 (destructor)Pickler_dealloc, /* tp_dealloc */
2907 0, /* tp_print */
2908 0, /* tp_getattr */
2909 0, /* tp_setattr */
2910 0, /* tp_compare */
2911 0, /* tp_repr */
2912 0, /* tp_as_number */
2913 0, /* tp_as_sequence */
2914 0, /* tp_as_mapping */
2915 0, /* tp_hash */
2916 0, /* tp_call */
2917 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002918 PyObject_GenericGetAttr, /* tp_getattro */
2919 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002920 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002921 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002922 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002923 (traverseproc)Pickler_traverse, /* tp_traverse */
2924 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002925 0, /* tp_richcompare */
2926 0, /* tp_weaklistoffset */
2927 0, /* tp_iter */
2928 0, /* tp_iternext */
2929 Pickler_methods, /* tp_methods */
2930 Pickler_members, /* tp_members */
2931 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002932};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002933
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002934static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002935find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936{
2937 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002939 if (fc) {
2940 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002941 PyErr_SetString(UnpicklingError, "Global and instance "
2942 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 return NULL;
2944 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002945 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2946 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002949 module = PySys_GetObject("modules");
2950 if (module == NULL)
2951 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 module = PyDict_GetItem(module, py_module_name);
2954 if (module == NULL) {
2955 module = PyImport_Import(py_module_name);
2956 if (!module)
2957 return NULL;
2958 global = PyObject_GetAttr(module, py_global_name);
2959 Py_DECREF(module);
2960 }
2961 else
2962 global = PyObject_GetAttr(module, py_global_name);
2963 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002964}
2965
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002966static int
Tim Peterscba30e22003-02-01 06:24:36 +00002967marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968{
2969 if (self->num_marks < 1) {
2970 PyErr_SetString(UnpicklingError, "could not find MARK");
2971 return -1;
2972 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975}
2976
Tim Peters84e87f32001-03-17 04:50:51 +00002977
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978static int
Tim Peterscba30e22003-02-01 06:24:36 +00002979load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980{
2981 PDATA_APPEND(self->stack, Py_None, -1);
2982 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983}
2984
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002985static int
Tim Peterscba30e22003-02-01 06:24:36 +00002986bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987{
2988 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2989 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002990}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002991
2992static int
Tim Peterscba30e22003-02-01 06:24:36 +00002993load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994{
2995 PyObject *py_int = 0;
2996 char *endptr, *s;
2997 int len, res = -1;
2998 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999
Tim Peters0bc93f52003-02-02 18:29:33 +00003000 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 if (len < 2) return bad_readline();
3002 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 errno = 0;
3005 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3008 /* Hm, maybe we've got something long. Let's try reading
3009 it as a Python long object. */
3010 errno = 0;
3011 py_int = PyLong_FromString(s, NULL, 0);
3012 if (py_int == NULL) {
3013 PyErr_SetString(PyExc_ValueError,
3014 "could not convert string to int");
3015 goto finally;
3016 }
3017 }
3018 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003019 if (len == 3 && (l == 0 || l == 1)) {
3020 if (!( py_int = PyBool_FromLong(l))) goto finally;
3021 }
3022 else {
3023 if (!( py_int = PyInt_FromLong(l))) goto finally;
3024 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 free(s);
3028 PDATA_PUSH(self->stack, py_int, -1);
3029 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031 finally:
3032 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035}
3036
Tim Peters3c67d792003-02-02 17:59:11 +00003037static int
3038load_bool(Unpicklerobject *self, PyObject *boolean)
3039{
3040 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003041 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003042 return 0;
3043}
3044
Tim Petersee1a53c2003-02-02 02:57:53 +00003045/* s contains x bytes of a little-endian integer. Return its value as a
3046 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3047 * int, but when x is 4 it's a signed one. This is an historical source
3048 * of x-platform bugs.
3049 */
Tim Peters84e87f32001-03-17 04:50:51 +00003050static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003051calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052{
3053 unsigned char c;
3054 int i;
3055 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003057 for (i = 0, l = 0L; i < x; i++) {
3058 c = (unsigned char)s[i];
3059 l |= (long)c << (i * 8);
3060 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003061#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3063 * is signed, so on a box with longs bigger than 4 bytes we need
3064 * to extend a BININT's sign bit to the full width.
3065 */
3066 if (x == 4 && l & (1L << 31))
3067 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003068#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070}
3071
3072
3073static int
Tim Peterscba30e22003-02-01 06:24:36 +00003074load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075{
3076 PyObject *py_int = 0;
3077 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Tim Peterscba30e22003-02-01 06:24:36 +00003081 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 PDATA_PUSH(self->stack, py_int, -1);
3085 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086}
3087
3088
3089static int
Tim Peterscba30e22003-02-01 06:24:36 +00003090load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091{
3092 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Tim Peters0bc93f52003-02-02 18:29:33 +00003094 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098}
3099
3100
3101static int
Tim Peterscba30e22003-02-01 06:24:36 +00003102load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103{
3104 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Tim Peters0bc93f52003-02-02 18:29:33 +00003106 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110}
3111
3112
3113static int
Tim Peterscba30e22003-02-01 06:24:36 +00003114load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115{
3116 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117
Tim Peters0bc93f52003-02-02 18:29:33 +00003118 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122}
Tim Peters84e87f32001-03-17 04:50:51 +00003123
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124static int
Tim Peterscba30e22003-02-01 06:24:36 +00003125load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126{
3127 PyObject *l = 0;
3128 char *end, *s;
3129 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
Tim Peters0bc93f52003-02-02 18:29:33 +00003131 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 if (len < 2) return bad_readline();
3133 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Tim Peterscba30e22003-02-01 06:24:36 +00003135 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 free(s);
3139 PDATA_PUSH(self->stack, l, -1);
3140 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 finally:
3143 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003146}
3147
Tim Petersee1a53c2003-02-02 02:57:53 +00003148/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3149 * data following.
3150 */
3151static int
3152load_counted_long(Unpicklerobject *self, int size)
3153{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003154 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003155 char *nbytes;
3156 unsigned char *pdata;
3157 PyObject *along;
3158
3159 assert(size == 1 || size == 4);
3160 i = self->read_func(self, &nbytes, size);
3161 if (i < 0) return -1;
3162
3163 size = calc_binint(nbytes, size);
3164 if (size < 0) {
3165 /* Corrupt or hostile pickle -- we never write one like
3166 * this.
3167 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003168 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003169 "byte count");
3170 return -1;
3171 }
3172
3173 if (size == 0)
3174 along = PyLong_FromLong(0L);
3175 else {
3176 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003177 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003178 if (i < 0) return -1;
3179 along = _PyLong_FromByteArray(pdata, (size_t)size,
3180 1 /* little endian */, 1 /* signed */);
3181 }
3182 if (along == NULL)
3183 return -1;
3184 PDATA_PUSH(self->stack, along, -1);
3185 return 0;
3186}
Tim Peters84e87f32001-03-17 04:50:51 +00003187
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188static int
Tim Peterscba30e22003-02-01 06:24:36 +00003189load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190{
3191 PyObject *py_float = 0;
3192 char *endptr, *s;
3193 int len, res = -1;
3194 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Tim Peters0bc93f52003-02-02 18:29:33 +00003196 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if (len < 2) return bad_readline();
3198 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003201 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3204 PyErr_SetString(PyExc_ValueError,
3205 "could not convert string to float");
3206 goto finally;
3207 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Tim Peterscba30e22003-02-01 06:24:36 +00003209 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 free(s);
3213 PDATA_PUSH(self->stack, py_float, -1);
3214 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 finally:
3217 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220}
3221
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222static int
Tim Peterscba30e22003-02-01 06:24:36 +00003223load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224{
Tim Peters9905b942003-03-20 20:53:32 +00003225 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 double x;
3227 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
Tim Peters0bc93f52003-02-02 18:29:33 +00003229 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Tim Peters9905b942003-03-20 20:53:32 +00003232 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3233 if (x == -1.0 && PyErr_Occurred())
3234 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235
Tim Peters9905b942003-03-20 20:53:32 +00003236 py_float = PyFloat_FromDouble(x);
3237 if (py_float == NULL)
3238 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240 PDATA_PUSH(self->stack, py_float, -1);
3241 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
3244static int
Tim Peterscba30e22003-02-01 06:24:36 +00003245load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246{
3247 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003248 int len, res = -1;
3249 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250
Tim Peters0bc93f52003-02-02 18:29:33 +00003251 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003252 if (len < 2) return bad_readline();
3253 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003255
3256 /* Strip outermost quotes */
3257 while (s[len-1] <= ' ')
3258 len--;
3259 if(s[0]=='"' && s[len-1]=='"'){
3260 s[len-1] = '\0';
3261 p = s + 1 ;
3262 len -= 2;
3263 } else if(s[0]=='\'' && s[len-1]=='\''){
3264 s[len-1] = '\0';
3265 p = s + 1 ;
3266 len -= 2;
3267 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 goto insecure;
3269 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003270
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003271 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003272 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003273 if (str) {
3274 PDATA_PUSH(self->stack, str, -1);
3275 res = 0;
3276 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003279 insecure:
3280 free(s);
3281 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3282 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003283}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284
3285
3286static int
Tim Peterscba30e22003-02-01 06:24:36 +00003287load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288{
3289 PyObject *py_string = 0;
3290 long l;
3291 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292
Tim Peters0bc93f52003-02-02 18:29:33 +00003293 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003295 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296
Tim Peters0bc93f52003-02-02 18:29:33 +00003297 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
Tim Peterscba30e22003-02-01 06:24:36 +00003300 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003301 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303 PDATA_PUSH(self->stack, py_string, -1);
3304 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305}
3306
3307
3308static int
Tim Peterscba30e22003-02-01 06:24:36 +00003309load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310{
3311 PyObject *py_string = 0;
3312 unsigned char l;
3313 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
Tim Peters0bc93f52003-02-02 18:29:33 +00003315 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003316 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003318 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003319
Tim Peters0bc93f52003-02-02 18:29:33 +00003320 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003324 PDATA_PUSH(self->stack, py_string, -1);
3325 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003326}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327
3328
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003329#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003330static int
Tim Peterscba30e22003-02-01 06:24:36 +00003331load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003332{
3333 PyObject *str = 0;
3334 int len, res = -1;
3335 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003336
Tim Peters0bc93f52003-02-02 18:29:33 +00003337 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003339
Tim Peterscba30e22003-02-01 06:24:36 +00003340 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003343 PDATA_PUSH(self->stack, str, -1);
3344 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 finally:
3347 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003348}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003349#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003350
3351
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003352#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003353static int
Tim Peterscba30e22003-02-01 06:24:36 +00003354load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355{
3356 PyObject *unicode;
3357 long l;
3358 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003359
Tim Peters0bc93f52003-02-02 18:29:33 +00003360 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003363
Tim Peters0bc93f52003-02-02 18:29:33 +00003364 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003366
Tim Peterscba30e22003-02-01 06:24:36 +00003367 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370 PDATA_PUSH(self->stack, unicode, -1);
3371 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003372}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003373#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003374
3375
3376static int
Tim Peterscba30e22003-02-01 06:24:36 +00003377load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378{
3379 PyObject *tup;
3380 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 if ((i = marker(self)) < 0) return -1;
3383 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3384 PDATA_PUSH(self->stack, tup, -1);
3385 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386}
3387
3388static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003389load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003391 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Tim Peters1d63c9f2003-02-02 20:29:39 +00003393 if (tup == NULL)
3394 return -1;
3395
3396 while (--len >= 0) {
3397 PyObject *element;
3398
3399 PDATA_POP(self->stack, element);
3400 if (element == NULL)
3401 return -1;
3402 PyTuple_SET_ITEM(tup, len, element);
3403 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 PDATA_PUSH(self->stack, tup, -1);
3405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406}
3407
3408static int
Tim Peterscba30e22003-02-01 06:24:36 +00003409load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410{
3411 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 if (!( list=PyList_New(0))) return -1;
3414 PDATA_PUSH(self->stack, list, -1);
3415 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416}
3417
3418static int
Tim Peterscba30e22003-02-01 06:24:36 +00003419load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420{
3421 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 if (!( dict=PyDict_New())) return -1;
3424 PDATA_PUSH(self->stack, dict, -1);
3425 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003426}
3427
3428
3429static int
Tim Peterscba30e22003-02-01 06:24:36 +00003430load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003431{
3432 PyObject *list = 0;
3433 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435 if ((i = marker(self)) < 0) return -1;
3436 if (!( list=Pdata_popList(self->stack, i))) return -1;
3437 PDATA_PUSH(self->stack, list, -1);
3438 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439}
3440
3441static int
Tim Peterscba30e22003-02-01 06:24:36 +00003442load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003443{
3444 PyObject *dict, *key, *value;
3445 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003447 if ((i = marker(self)) < 0) return -1;
3448 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 for (k = i+1; k < j; k += 2) {
3453 key =self->stack->data[k-1];
3454 value=self->stack->data[k ];
3455 if (PyDict_SetItem(dict, key, value) < 0) {
3456 Py_DECREF(dict);
3457 return -1;
3458 }
3459 }
3460 Pdata_clear(self->stack, i);
3461 PDATA_PUSH(self->stack, dict, -1);
3462 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463}
3464
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003465static PyObject *
3466Instance_New(PyObject *cls, PyObject *args)
3467{
3468 PyObject *r = 0;
3469
3470 if ((r=PyObject_CallObject(cls, args))) return r;
3471
3472 {
3473 PyObject *tp, *v, *tb, *tmp_value;
3474
3475 PyErr_Fetch(&tp, &v, &tb);
3476 tmp_value = v;
3477 /* NULL occurs when there was a KeyboardInterrupt */
3478 if (tmp_value == NULL)
3479 tmp_value = Py_None;
3480 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3481 Py_XDECREF(v);
3482 v=r;
3483 }
3484 PyErr_Restore(tp,v,tb);
3485 }
3486 return NULL;
3487}
3488
Guido van Rossum60456fd1997-04-09 17:36:32 +00003489
3490static int
Tim Peterscba30e22003-02-01 06:24:36 +00003491load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492{
3493 PyObject *class, *tup, *obj=0;
3494 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 if ((i = marker(self)) < 0) return -1;
3497 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3498 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003499 if (class) {
3500 obj = Instance_New(class, tup);
3501 Py_DECREF(class);
3502 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 if (! obj) return -1;
3506 PDATA_PUSH(self->stack, obj, -1);
3507 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003508}
3509
3510
3511static int
Tim Peterscba30e22003-02-01 06:24:36 +00003512load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513{
3514 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3515 int i, len;
3516 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003519
Tim Peters0bc93f52003-02-02 18:29:33 +00003520 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003521 if (len < 2) return bad_readline();
3522 module_name = PyString_FromStringAndSize(s, len - 1);
3523 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003524
Tim Peters0bc93f52003-02-02 18:29:33 +00003525 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526 if (len < 2) return bad_readline();
3527 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003528 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003529 self->find_class);
3530 Py_DECREF(class_name);
3531 }
3532 }
3533 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003538 obj = Instance_New(class, tup);
3539 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 }
3541 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003543 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545 PDATA_PUSH(self->stack, obj, -1);
3546 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547}
3548
Tim Peterseab7db32003-02-13 18:24:14 +00003549static int
3550load_newobj(Unpicklerobject *self)
3551{
3552 PyObject *args = NULL;
3553 PyObject *clsraw = NULL;
3554 PyTypeObject *cls; /* clsraw cast to its true type */
3555 PyObject *obj;
3556
3557 /* Stack is ... cls argtuple, and we want to call
3558 * cls.__new__(cls, *argtuple).
3559 */
3560 PDATA_POP(self->stack, args);
3561 if (args == NULL) goto Fail;
3562 if (! PyTuple_Check(args)) {
3563 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3564 "tuple.");
3565 goto Fail;
3566 }
3567
3568 PDATA_POP(self->stack, clsraw);
3569 cls = (PyTypeObject *)clsraw;
3570 if (cls == NULL) goto Fail;
3571 if (! PyType_Check(cls)) {
3572 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3573 "isn't a type object");
3574 goto Fail;
3575 }
3576 if (cls->tp_new == NULL) {
3577 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3578 "has NULL tp_new");
3579 goto Fail;
3580 }
3581
3582 /* Call __new__. */
3583 obj = cls->tp_new(cls, args, NULL);
3584 if (obj == NULL) goto Fail;
3585
3586 Py_DECREF(args);
3587 Py_DECREF(clsraw);
3588 PDATA_PUSH(self->stack, obj, -1);
3589 return 0;
3590
3591 Fail:
3592 Py_XDECREF(args);
3593 Py_XDECREF(clsraw);
3594 return -1;
3595}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
3597static int
Tim Peterscba30e22003-02-01 06:24:36 +00003598load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003599{
3600 PyObject *class = 0, *module_name = 0, *class_name = 0;
3601 int len;
3602 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003603
Tim Peters0bc93f52003-02-02 18:29:33 +00003604 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 if (len < 2) return bad_readline();
3606 module_name = PyString_FromStringAndSize(s, len - 1);
3607 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Tim Peters0bc93f52003-02-02 18:29:33 +00003609 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003610 if (len < 2) {
3611 Py_DECREF(module_name);
3612 return bad_readline();
3613 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003614 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003615 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616 self->find_class);
3617 Py_DECREF(class_name);
3618 }
3619 }
3620 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622 if (! class) return -1;
3623 PDATA_PUSH(self->stack, class, -1);
3624 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625}
3626
3627
3628static int
Tim Peterscba30e22003-02-01 06:24:36 +00003629load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630{
3631 PyObject *pid = 0;
3632 int len;
3633 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003636 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637 if (len < 2) return bad_readline();
3638
3639 pid = PyString_FromStringAndSize(s, len - 1);
3640 if (!pid) return -1;
3641
3642 if (PyList_Check(self->pers_func)) {
3643 if (PyList_Append(self->pers_func, pid) < 0) {
3644 Py_DECREF(pid);
3645 return -1;
3646 }
3647 }
3648 else {
3649 ARG_TUP(self, pid);
3650 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003651 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652 NULL);
3653 FREE_ARG_TUP(self);
3654 }
3655 }
3656
3657 if (! pid) return -1;
3658
3659 PDATA_PUSH(self->stack, pid, -1);
3660 return 0;
3661 }
3662 else {
3663 PyErr_SetString(UnpicklingError,
3664 "A load persistent id instruction was encountered,\n"
3665 "but no persistent_load function was specified.");
3666 return -1;
3667 }
3668}
3669
3670static int
Tim Peterscba30e22003-02-01 06:24:36 +00003671load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003672{
3673 PyObject *pid = 0;
3674
3675 if (self->pers_func) {
3676 PDATA_POP(self->stack, pid);
3677 if (! pid) return -1;
3678
3679 if (PyList_Check(self->pers_func)) {
3680 if (PyList_Append(self->pers_func, pid) < 0) {
3681 Py_DECREF(pid);
3682 return -1;
3683 }
3684 }
3685 else {
3686 ARG_TUP(self, pid);
3687 if (self->arg) {
3688 pid = PyObject_Call(self->pers_func, self->arg,
3689 NULL);
3690 FREE_ARG_TUP(self);
3691 }
3692 if (! pid) return -1;
3693 }
3694
3695 PDATA_PUSH(self->stack, pid, -1);
3696 return 0;
3697 }
3698 else {
3699 PyErr_SetString(UnpicklingError,
3700 "A load persistent id instruction was encountered,\n"
3701 "but no persistent_load function was specified.");
3702 return -1;
3703 }
3704}
3705
3706
3707static int
Tim Peterscba30e22003-02-01 06:24:36 +00003708load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003709{
3710 int len;
3711
3712 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3713
3714 /* Note that we split the (pickle.py) stack into two stacks,
3715 an object stack and a mark stack. We have to be clever and
3716 pop the right one. We do this by looking at the top of the
3717 mark stack.
3718 */
3719
3720 if ((self->num_marks > 0) &&
3721 (self->marks[self->num_marks - 1] == len))
3722 self->num_marks--;
3723 else {
3724 len--;
3725 Py_DECREF(self->stack->data[len]);
3726 self->stack->length=len;
3727 }
3728
3729 return 0;
3730}
3731
3732
3733static int
Tim Peterscba30e22003-02-01 06:24:36 +00003734load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003735{
3736 int i;
3737
3738 if ((i = marker(self)) < 0)
3739 return -1;
3740
3741 Pdata_clear(self->stack, i);
3742
3743 return 0;
3744}
3745
3746
3747static int
Tim Peterscba30e22003-02-01 06:24:36 +00003748load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003749{
3750 PyObject *last;
3751 int len;
3752
3753 if ((len = self->stack->length) <= 0) return stackUnderflow();
3754 last=self->stack->data[len-1];
3755 Py_INCREF(last);
3756 PDATA_PUSH(self->stack, last, -1);
3757 return 0;
3758}
3759
3760
3761static int
Tim Peterscba30e22003-02-01 06:24:36 +00003762load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003763{
3764 PyObject *py_str = 0, *value = 0;
3765 int len;
3766 char *s;
3767 int rc;
3768
Tim Peters0bc93f52003-02-02 18:29:33 +00003769 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003770 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 value = PyDict_GetItem(self->memo, py_str);
3775 if (! value) {
3776 PyErr_SetObject(BadPickleGet, py_str);
3777 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003778 }
3779 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 PDATA_APPEND(self->stack, value, -1);
3781 rc = 0;
3782 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784 Py_DECREF(py_str);
3785 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786}
3787
3788
3789static int
Tim Peterscba30e22003-02-01 06:24:36 +00003790load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791{
3792 PyObject *py_key = 0, *value = 0;
3793 unsigned char key;
3794 char *s;
3795 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003796
Tim Peters0bc93f52003-02-02 18:29:33 +00003797 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003799 key = (unsigned char)s[0];
3800 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 value = PyDict_GetItem(self->memo, py_key);
3803 if (! value) {
3804 PyErr_SetObject(BadPickleGet, py_key);
3805 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003806 }
3807 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003808 PDATA_APPEND(self->stack, value, -1);
3809 rc = 0;
3810 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812 Py_DECREF(py_key);
3813 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003814}
3815
3816
3817static int
Tim Peterscba30e22003-02-01 06:24:36 +00003818load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819{
3820 PyObject *py_key = 0, *value = 0;
3821 unsigned char c;
3822 char *s;
3823 long key;
3824 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003825
Tim Peters0bc93f52003-02-02 18:29:33 +00003826 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003828 c = (unsigned char)s[0];
3829 key = (long)c;
3830 c = (unsigned char)s[1];
3831 key |= (long)c << 8;
3832 c = (unsigned char)s[2];
3833 key |= (long)c << 16;
3834 c = (unsigned char)s[3];
3835 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3838
3839 value = PyDict_GetItem(self->memo, py_key);
3840 if (! value) {
3841 PyErr_SetObject(BadPickleGet, py_key);
3842 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003843 }
3844 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003845 PDATA_APPEND(self->stack, value, -1);
3846 rc = 0;
3847 }
3848
3849 Py_DECREF(py_key);
3850 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003851}
3852
Tim Peters2d629652003-02-04 05:06:17 +00003853/* Push an object from the extension registry (EXT[124]). nbytes is
3854 * the number of bytes following the opcode, holding the index (code) value.
3855 */
3856static int
3857load_extension(Unpicklerobject *self, int nbytes)
3858{
3859 char *codebytes; /* the nbytes bytes after the opcode */
3860 long code; /* calc_binint returns long */
3861 PyObject *py_code; /* code as a Python int */
3862 PyObject *obj; /* the object to push */
3863 PyObject *pair; /* (module_name, class_name) */
3864 PyObject *module_name, *class_name;
3865
3866 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3867 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3868 code = calc_binint(codebytes, nbytes);
3869 if (code <= 0) { /* note that 0 is forbidden */
3870 /* Corrupt or hostile pickle. */
3871 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3872 return -1;
3873 }
3874
3875 /* Look for the code in the cache. */
3876 py_code = PyInt_FromLong(code);
3877 if (py_code == NULL) return -1;
3878 obj = PyDict_GetItem(extension_cache, py_code);
3879 if (obj != NULL) {
3880 /* Bingo. */
3881 Py_DECREF(py_code);
3882 PDATA_APPEND(self->stack, obj, -1);
3883 return 0;
3884 }
3885
3886 /* Look up the (module_name, class_name) pair. */
3887 pair = PyDict_GetItem(inverted_registry, py_code);
3888 if (pair == NULL) {
3889 Py_DECREF(py_code);
3890 PyErr_Format(PyExc_ValueError, "unregistered extension "
3891 "code %ld", code);
3892 return -1;
3893 }
3894 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003895 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003896 */
3897 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3898 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3899 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3900 Py_DECREF(py_code);
3901 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3902 "isn't a 2-tuple of strings", code);
3903 return -1;
3904 }
3905 /* Load the object. */
3906 obj = find_class(module_name, class_name, self->find_class);
3907 if (obj == NULL) {
3908 Py_DECREF(py_code);
3909 return -1;
3910 }
3911 /* Cache code -> obj. */
3912 code = PyDict_SetItem(extension_cache, py_code, obj);
3913 Py_DECREF(py_code);
3914 if (code < 0) {
3915 Py_DECREF(obj);
3916 return -1;
3917 }
3918 PDATA_PUSH(self->stack, obj, -1);
3919 return 0;
3920}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
3922static int
Tim Peterscba30e22003-02-01 06:24:36 +00003923load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924{
3925 PyObject *py_str = 0, *value = 0;
3926 int len, l;
3927 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Tim Peters0bc93f52003-02-02 18:29:33 +00003929 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003930 if (l < 2) return bad_readline();
3931 if (!( len=self->stack->length )) return stackUnderflow();
3932 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3933 value=self->stack->data[len-1];
3934 l=PyDict_SetItem(self->memo, py_str, value);
3935 Py_DECREF(py_str);
3936 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937}
3938
3939
3940static int
Tim Peterscba30e22003-02-01 06:24:36 +00003941load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942{
3943 PyObject *py_key = 0, *value = 0;
3944 unsigned char key;
3945 char *s;
3946 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003947
Tim Peters0bc93f52003-02-02 18:29:33 +00003948 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003951 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3954 value=self->stack->data[len-1];
3955 len=PyDict_SetItem(self->memo, py_key, value);
3956 Py_DECREF(py_key);
3957 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003958}
3959
3960
3961static int
Tim Peterscba30e22003-02-01 06:24:36 +00003962load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963{
3964 PyObject *py_key = 0, *value = 0;
3965 long key;
3966 unsigned char c;
3967 char *s;
3968 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Tim Peters0bc93f52003-02-02 18:29:33 +00003970 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 c = (unsigned char)s[0];
3974 key = (long)c;
3975 c = (unsigned char)s[1];
3976 key |= (long)c << 8;
3977 c = (unsigned char)s[2];
3978 key |= (long)c << 16;
3979 c = (unsigned char)s[3];
3980 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 if (!( py_key = PyInt_FromLong(key))) return -1;
3983 value=self->stack->data[len-1];
3984 len=PyDict_SetItem(self->memo, py_key, value);
3985 Py_DECREF(py_key);
3986 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987}
3988
3989
3990static int
Tim Peterscba30e22003-02-01 06:24:36 +00003991do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003992{
3993 PyObject *value = 0, *list = 0, *append_method = 0;
3994 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 len=self->stack->length;
3997 if (!( len >= x && x > 0 )) return stackUnderflow();
3998 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003999 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003 if (PyList_Check(list)) {
4004 PyObject *slice;
4005 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004008 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 list_len = PyList_GET_SIZE(list);
4010 i=PyList_SetSlice(list, list_len, list_len, slice);
4011 Py_DECREF(slice);
4012 return i;
4013 }
4014 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004015
Tim Peterscba30e22003-02-01 06:24:36 +00004016 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 return -1;
4018
4019 for (i = x; i < len; i++) {
4020 PyObject *junk;
4021
4022 value=self->stack->data[i];
4023 junk=0;
4024 ARG_TUP(self, value);
4025 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004026 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 NULL);
4028 FREE_ARG_TUP(self);
4029 }
4030 if (! junk) {
4031 Pdata_clear(self->stack, i+1);
4032 self->stack->length=x;
4033 Py_DECREF(append_method);
4034 return -1;
4035 }
4036 Py_DECREF(junk);
4037 }
4038 self->stack->length=x;
4039 Py_DECREF(append_method);
4040 }
4041
4042 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043}
4044
4045
4046static int
Tim Peterscba30e22003-02-01 06:24:36 +00004047load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048{
4049 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050}
4051
4052
4053static int
Tim Peterscba30e22003-02-01 06:24:36 +00004054load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055{
4056 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004057}
4058
4059
4060static int
Tim Peterscba30e22003-02-01 06:24:36 +00004061do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062{
4063 PyObject *value = 0, *key = 0, *dict = 0;
4064 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004066 if (!( (len=self->stack->length) >= x
4067 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004071 for (i = x+1; i < len; i += 2) {
4072 key =self->stack->data[i-1];
4073 value=self->stack->data[i ];
4074 if (PyObject_SetItem(dict, key, value) < 0) {
4075 r=-1;
4076 break;
4077 }
4078 }
4079
4080 Pdata_clear(self->stack, x);
4081
4082 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083}
4084
4085
Tim Peters84e87f32001-03-17 04:50:51 +00004086static int
Tim Peterscba30e22003-02-01 06:24:36 +00004087load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088{
4089 return do_setitems(self, self->stack->length - 2);
4090}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092static int
Tim Peterscba30e22003-02-01 06:24:36 +00004093load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094{
4095 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004096}
4097
Tim Peters84e87f32001-03-17 04:50:51 +00004098
Guido van Rossum60456fd1997-04-09 17:36:32 +00004099static int
Tim Peterscba30e22003-02-01 06:24:36 +00004100load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004101{
Tim Peters080c88b2003-02-15 03:01:11 +00004102 PyObject *state, *inst, *slotstate;
4103 PyObject *__setstate__;
4104 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004105 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004106 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107
Tim Peters080c88b2003-02-15 03:01:11 +00004108 /* Stack is ... instance, state. We want to leave instance at
4109 * the stack top, possibly mutated via instance.__setstate__(state).
4110 */
4111 if (self->stack->length < 2)
4112 return stackUnderflow();
4113 PDATA_POP(self->stack, state);
4114 if (state == NULL)
4115 return -1;
4116 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117
Tim Peters080c88b2003-02-15 03:01:11 +00004118 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4119 if (__setstate__ != NULL) {
4120 PyObject *junk = NULL;
4121
4122 /* The explicit __setstate__ is responsible for everything. */
4123 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 if (self->arg) {
4125 junk = PyObject_Call(__setstate__, self->arg, NULL);
4126 FREE_ARG_TUP(self);
4127 }
4128 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004129 if (junk == NULL)
4130 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 Py_DECREF(junk);
4132 return 0;
4133 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004134 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4135 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004137
4138 /* A default __setstate__. First see whether state embeds a
4139 * slot state dict too (a proto 2 addition).
4140 */
4141 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4142 PyObject *temp = state;
4143 state = PyTuple_GET_ITEM(temp, 0);
4144 slotstate = PyTuple_GET_ITEM(temp, 1);
4145 Py_INCREF(state);
4146 Py_INCREF(slotstate);
4147 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 }
Tim Peters080c88b2003-02-15 03:01:11 +00004149 else
4150 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004151
Tim Peters080c88b2003-02-15 03:01:11 +00004152 /* Set inst.__dict__ from the state dict (if any). */
4153 if (state != Py_None) {
4154 PyObject *dict;
4155 if (! PyDict_Check(state)) {
4156 PyErr_SetString(UnpicklingError, "state is not a "
4157 "dictionary");
4158 goto finally;
4159 }
4160 dict = PyObject_GetAttr(inst, __dict___str);
4161 if (dict == NULL)
4162 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163
Tim Peters080c88b2003-02-15 03:01:11 +00004164 i = 0;
4165 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4166 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4167 goto finally;
4168 }
4169 Py_DECREF(dict);
4170 }
4171
4172 /* Also set instance attributes from the slotstate dict (if any). */
4173 if (slotstate != NULL) {
4174 if (! PyDict_Check(slotstate)) {
4175 PyErr_SetString(UnpicklingError, "slot state is not "
4176 "a dictionary");
4177 goto finally;
4178 }
4179 i = 0;
4180 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4181 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4182 goto finally;
4183 }
4184 }
4185 res = 0;
4186
4187 finally:
4188 Py_DECREF(state);
4189 Py_XDECREF(slotstate);
4190 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191}
4192
4193
4194static int
Tim Peterscba30e22003-02-01 06:24:36 +00004195load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196{
4197 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 /* Note that we split the (pickle.py) stack into two stacks, an
4200 object stack and a mark stack. Here we push a mark onto the
4201 mark stack.
4202 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004205 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 s=self->marks_size+20;
4207 if (s <= self->num_marks) s=self->num_marks + 1;
4208 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004209 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004211 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004213 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 PyErr_NoMemory();
4215 return -1;
4216 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004217 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218 self->marks_size = s;
4219 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004221 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004223 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004224}
4225
Guido van Rossum60456fd1997-04-09 17:36:32 +00004226static int
Tim Peterscba30e22003-02-01 06:24:36 +00004227load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228{
4229 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 PDATA_POP(self->stack, arg_tup);
4232 if (! arg_tup) return -1;
4233 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004234 if (callable) {
4235 ob = Instance_New(callable, arg_tup);
4236 Py_DECREF(callable);
4237 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004242 PDATA_PUSH(self->stack, ob, -1);
4243 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004244}
Tim Peters84e87f32001-03-17 04:50:51 +00004245
Tim Peters4190fb82003-02-02 16:09:05 +00004246/* Just raises an error if we don't know the protocol specified. PROTO
4247 * is the first opcode for protocols >= 2.
4248 */
4249static int
4250load_proto(Unpicklerobject *self)
4251{
4252 int i;
4253 char *protobyte;
4254
4255 i = self->read_func(self, &protobyte, 1);
4256 if (i < 0)
4257 return -1;
4258
4259 i = calc_binint(protobyte, 1);
4260 /* No point checking for < 0, since calc_binint returns an unsigned
4261 * int when chewing on 1 byte.
4262 */
4263 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004264 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004265 return 0;
4266
4267 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4268 return -1;
4269}
4270
Guido van Rossum60456fd1997-04-09 17:36:32 +00004271static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004272load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273{
4274 PyObject *err = 0, *val = 0;
4275 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 self->num_marks = 0;
4278 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004281 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 switch (s[0]) {
4285 case NONE:
4286 if (load_none(self) < 0)
4287 break;
4288 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case BININT:
4291 if (load_binint(self) < 0)
4292 break;
4293 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 case BININT1:
4296 if (load_binint1(self) < 0)
4297 break;
4298 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 case BININT2:
4301 if (load_binint2(self) < 0)
4302 break;
4303 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004305 case INT:
4306 if (load_int(self) < 0)
4307 break;
4308 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310 case LONG:
4311 if (load_long(self) < 0)
4312 break;
4313 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004314
Tim Petersee1a53c2003-02-02 02:57:53 +00004315 case LONG1:
4316 if (load_counted_long(self, 1) < 0)
4317 break;
4318 continue;
4319
4320 case LONG4:
4321 if (load_counted_long(self, 4) < 0)
4322 break;
4323 continue;
4324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 case FLOAT:
4326 if (load_float(self) < 0)
4327 break;
4328 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 case BINFLOAT:
4331 if (load_binfloat(self) < 0)
4332 break;
4333 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 case BINSTRING:
4336 if (load_binstring(self) < 0)
4337 break;
4338 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 case SHORT_BINSTRING:
4341 if (load_short_binstring(self) < 0)
4342 break;
4343 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 case STRING:
4346 if (load_string(self) < 0)
4347 break;
4348 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004349
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004350#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 case UNICODE:
4352 if (load_unicode(self) < 0)
4353 break;
4354 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356 case BINUNICODE:
4357 if (load_binunicode(self) < 0)
4358 break;
4359 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004360#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004363 if (load_counted_tuple(self, 0) < 0)
4364 break;
4365 continue;
4366
4367 case TUPLE1:
4368 if (load_counted_tuple(self, 1) < 0)
4369 break;
4370 continue;
4371
4372 case TUPLE2:
4373 if (load_counted_tuple(self, 2) < 0)
4374 break;
4375 continue;
4376
4377 case TUPLE3:
4378 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 break;
4380 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case TUPLE:
4383 if (load_tuple(self) < 0)
4384 break;
4385 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case EMPTY_LIST:
4388 if (load_empty_list(self) < 0)
4389 break;
4390 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case LIST:
4393 if (load_list(self) < 0)
4394 break;
4395 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 case EMPTY_DICT:
4398 if (load_empty_dict(self) < 0)
4399 break;
4400 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 case DICT:
4403 if (load_dict(self) < 0)
4404 break;
4405 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 case OBJ:
4408 if (load_obj(self) < 0)
4409 break;
4410 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 case INST:
4413 if (load_inst(self) < 0)
4414 break;
4415 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004416
Tim Peterseab7db32003-02-13 18:24:14 +00004417 case NEWOBJ:
4418 if (load_newobj(self) < 0)
4419 break;
4420 continue;
4421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 case GLOBAL:
4423 if (load_global(self) < 0)
4424 break;
4425 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 case APPEND:
4428 if (load_append(self) < 0)
4429 break;
4430 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 case APPENDS:
4433 if (load_appends(self) < 0)
4434 break;
4435 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 case BUILD:
4438 if (load_build(self) < 0)
4439 break;
4440 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 case DUP:
4443 if (load_dup(self) < 0)
4444 break;
4445 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 case BINGET:
4448 if (load_binget(self) < 0)
4449 break;
4450 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 case LONG_BINGET:
4453 if (load_long_binget(self) < 0)
4454 break;
4455 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004457 case GET:
4458 if (load_get(self) < 0)
4459 break;
4460 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004461
Tim Peters2d629652003-02-04 05:06:17 +00004462 case EXT1:
4463 if (load_extension(self, 1) < 0)
4464 break;
4465 continue;
4466
4467 case EXT2:
4468 if (load_extension(self, 2) < 0)
4469 break;
4470 continue;
4471
4472 case EXT4:
4473 if (load_extension(self, 4) < 0)
4474 break;
4475 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 case MARK:
4477 if (load_mark(self) < 0)
4478 break;
4479 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004481 case BINPUT:
4482 if (load_binput(self) < 0)
4483 break;
4484 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 case LONG_BINPUT:
4487 if (load_long_binput(self) < 0)
4488 break;
4489 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 case PUT:
4492 if (load_put(self) < 0)
4493 break;
4494 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 case POP:
4497 if (load_pop(self) < 0)
4498 break;
4499 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501 case POP_MARK:
4502 if (load_pop_mark(self) < 0)
4503 break;
4504 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 case SETITEM:
4507 if (load_setitem(self) < 0)
4508 break;
4509 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004511 case SETITEMS:
4512 if (load_setitems(self) < 0)
4513 break;
4514 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 case STOP:
4517 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 case PERSID:
4520 if (load_persid(self) < 0)
4521 break;
4522 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 case BINPERSID:
4525 if (load_binpersid(self) < 0)
4526 break;
4527 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 case REDUCE:
4530 if (load_reduce(self) < 0)
4531 break;
4532 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Tim Peters4190fb82003-02-02 16:09:05 +00004534 case PROTO:
4535 if (load_proto(self) < 0)
4536 break;
4537 continue;
4538
Tim Peters3c67d792003-02-02 17:59:11 +00004539 case NEWTRUE:
4540 if (load_bool(self, Py_True) < 0)
4541 break;
4542 continue;
4543
4544 case NEWFALSE:
4545 if (load_bool(self, Py_False) < 0)
4546 break;
4547 continue;
4548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 case '\0':
4550 /* end of file */
4551 PyErr_SetNone(PyExc_EOFError);
4552 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004554 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004555 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 "invalid load key, '%s'.",
4557 "c", s[0]);
4558 return NULL;
4559 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 break;
4562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 if ((err = PyErr_Occurred())) {
4565 if (err == PyExc_EOFError) {
4566 PyErr_SetNone(PyExc_EOFError);
4567 }
4568 return NULL;
4569 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 PDATA_POP(self->stack, val);
4572 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004573}
Tim Peters84e87f32001-03-17 04:50:51 +00004574
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004576/* No-load functions to support noload, which is used to
4577 find persistent references. */
4578
4579static int
Tim Peterscba30e22003-02-01 06:24:36 +00004580noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581{
4582 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 if ((i = marker(self)) < 0) return -1;
4585 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004586}
4587
4588
4589static int
Tim Peterscba30e22003-02-01 06:24:36 +00004590noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591{
4592 int i;
4593 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004595 if ((i = marker(self)) < 0) return -1;
4596 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004597 if (self->readline_func(self, &s) < 0) return -1;
4598 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004599 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004601}
4602
4603static int
Tim Peterseab7db32003-02-13 18:24:14 +00004604noload_newobj(Unpicklerobject *self)
4605{
4606 PyObject *obj;
4607
4608 PDATA_POP(self->stack, obj); /* pop argtuple */
4609 if (obj == NULL) return -1;
4610 Py_DECREF(obj);
4611
4612 PDATA_POP(self->stack, obj); /* pop cls */
4613 if (obj == NULL) return -1;
4614 Py_DECREF(obj);
4615
4616 PDATA_APPEND(self->stack, Py_None, -1);
4617 return 0;
4618}
4619
4620static int
Tim Peterscba30e22003-02-01 06:24:36 +00004621noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622{
4623 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004624
Tim Peters0bc93f52003-02-02 18:29:33 +00004625 if (self->readline_func(self, &s) < 0) return -1;
4626 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627 PDATA_APPEND(self->stack, Py_None,-1);
4628 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004629}
4630
4631static int
Tim Peterscba30e22003-02-01 06:24:36 +00004632noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004635 if (self->stack->length < 2) return stackUnderflow();
4636 Pdata_clear(self->stack, self->stack->length-2);
4637 PDATA_APPEND(self->stack, Py_None,-1);
4638 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004639}
4640
4641static int
4642noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004643
Guido van Rossum053b8df1998-11-25 16:18:00 +00004644 if (self->stack->length < 1) return stackUnderflow();
4645 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004646 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004647}
4648
Tim Peters2d629652003-02-04 05:06:17 +00004649static int
4650noload_extension(Unpicklerobject *self, int nbytes)
4651{
4652 char *codebytes;
4653
4654 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4655 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4656 PDATA_APPEND(self->stack, Py_None, -1);
4657 return 0;
4658}
4659
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660
4661static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004662noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663{
4664 PyObject *err = 0, *val = 0;
4665 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 self->num_marks = 0;
4668 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004671 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004674 switch (s[0]) {
4675 case NONE:
4676 if (load_none(self) < 0)
4677 break;
4678 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 case BININT:
4681 if (load_binint(self) < 0)
4682 break;
4683 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 case BININT1:
4686 if (load_binint1(self) < 0)
4687 break;
4688 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 case BININT2:
4691 if (load_binint2(self) < 0)
4692 break;
4693 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 case INT:
4696 if (load_int(self) < 0)
4697 break;
4698 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 case LONG:
4701 if (load_long(self) < 0)
4702 break;
4703 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004704
Tim Peters4190fb82003-02-02 16:09:05 +00004705 case LONG1:
4706 if (load_counted_long(self, 1) < 0)
4707 break;
4708 continue;
4709
4710 case LONG4:
4711 if (load_counted_long(self, 4) < 0)
4712 break;
4713 continue;
4714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 case FLOAT:
4716 if (load_float(self) < 0)
4717 break;
4718 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 case BINFLOAT:
4721 if (load_binfloat(self) < 0)
4722 break;
4723 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 case BINSTRING:
4726 if (load_binstring(self) < 0)
4727 break;
4728 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004730 case SHORT_BINSTRING:
4731 if (load_short_binstring(self) < 0)
4732 break;
4733 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 case STRING:
4736 if (load_string(self) < 0)
4737 break;
4738 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004739
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004740#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 case UNICODE:
4742 if (load_unicode(self) < 0)
4743 break;
4744 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 case BINUNICODE:
4747 if (load_binunicode(self) < 0)
4748 break;
4749 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004750#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004753 if (load_counted_tuple(self, 0) < 0)
4754 break;
4755 continue;
4756
4757 case TUPLE1:
4758 if (load_counted_tuple(self, 1) < 0)
4759 break;
4760 continue;
4761
4762 case TUPLE2:
4763 if (load_counted_tuple(self, 2) < 0)
4764 break;
4765 continue;
4766
4767 case TUPLE3:
4768 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004769 break;
4770 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 case TUPLE:
4773 if (load_tuple(self) < 0)
4774 break;
4775 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 case EMPTY_LIST:
4778 if (load_empty_list(self) < 0)
4779 break;
4780 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 case LIST:
4783 if (load_list(self) < 0)
4784 break;
4785 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 case EMPTY_DICT:
4788 if (load_empty_dict(self) < 0)
4789 break;
4790 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 case DICT:
4793 if (load_dict(self) < 0)
4794 break;
4795 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004797 case OBJ:
4798 if (noload_obj(self) < 0)
4799 break;
4800 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802 case INST:
4803 if (noload_inst(self) < 0)
4804 break;
4805 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004806
Tim Peterseab7db32003-02-13 18:24:14 +00004807 case NEWOBJ:
4808 if (noload_newobj(self) < 0)
4809 break;
4810 continue;
4811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 case GLOBAL:
4813 if (noload_global(self) < 0)
4814 break;
4815 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 case APPEND:
4818 if (load_append(self) < 0)
4819 break;
4820 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822 case APPENDS:
4823 if (load_appends(self) < 0)
4824 break;
4825 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004827 case BUILD:
4828 if (noload_build(self) < 0)
4829 break;
4830 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 case DUP:
4833 if (load_dup(self) < 0)
4834 break;
4835 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 case BINGET:
4838 if (load_binget(self) < 0)
4839 break;
4840 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004842 case LONG_BINGET:
4843 if (load_long_binget(self) < 0)
4844 break;
4845 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004847 case GET:
4848 if (load_get(self) < 0)
4849 break;
4850 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004851
Tim Peters2d629652003-02-04 05:06:17 +00004852 case EXT1:
4853 if (noload_extension(self, 1) < 0)
4854 break;
4855 continue;
4856
4857 case EXT2:
4858 if (noload_extension(self, 2) < 0)
4859 break;
4860 continue;
4861
4862 case EXT4:
4863 if (noload_extension(self, 4) < 0)
4864 break;
4865 continue;
4866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case MARK:
4868 if (load_mark(self) < 0)
4869 break;
4870 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 case BINPUT:
4873 if (load_binput(self) < 0)
4874 break;
4875 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004877 case LONG_BINPUT:
4878 if (load_long_binput(self) < 0)
4879 break;
4880 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 case PUT:
4883 if (load_put(self) < 0)
4884 break;
4885 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004887 case POP:
4888 if (load_pop(self) < 0)
4889 break;
4890 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892 case POP_MARK:
4893 if (load_pop_mark(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 SETITEM:
4898 if (load_setitem(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 SETITEMS:
4903 if (load_setitems(self) < 0)
4904 break;
4905 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 case STOP:
4908 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004909
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 case PERSID:
4911 if (load_persid(self) < 0)
4912 break;
4913 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 case BINPERSID:
4916 if (load_binpersid(self) < 0)
4917 break;
4918 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004920 case REDUCE:
4921 if (noload_reduce(self) < 0)
4922 break;
4923 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004924
Tim Peters4190fb82003-02-02 16:09:05 +00004925 case PROTO:
4926 if (load_proto(self) < 0)
4927 break;
4928 continue;
4929
Tim Peters3c67d792003-02-02 17:59:11 +00004930 case NEWTRUE:
4931 if (load_bool(self, Py_True) < 0)
4932 break;
4933 continue;
4934
4935 case NEWFALSE:
4936 if (load_bool(self, Py_False) < 0)
4937 break;
4938 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004940 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 "invalid load key, '%s'.",
4942 "c", s[0]);
4943 return NULL;
4944 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 break;
4947 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 if ((err = PyErr_Occurred())) {
4950 if (err == PyExc_EOFError) {
4951 PyErr_SetNone(PyExc_EOFError);
4952 }
4953 return NULL;
4954 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 PDATA_POP(self->stack, val);
4957 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004958}
Tim Peters84e87f32001-03-17 04:50:51 +00004959
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004960
Guido van Rossum60456fd1997-04-09 17:36:32 +00004961static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004962Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004965}
4966
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004967static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004968Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004971}
4972
Guido van Rossum60456fd1997-04-09 17:36:32 +00004973
4974static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004975 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004976 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004977 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004978 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004979 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004980 "noload() -- not load a pickle, but go through most of the motions\n"
4981 "\n"
4982 "This function can be used to read past a pickle without instantiating\n"
4983 "any objects or importing any modules. It can also be used to find all\n"
4984 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004985 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004986 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004987 {NULL, NULL} /* sentinel */
4988};
4989
4990
4991static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004992newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993{
4994 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004995
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004996 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004997 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 self->file = NULL;
5000 self->arg = NULL;
5001 self->stack = (Pdata*)Pdata_New();
5002 self->pers_func = NULL;
5003 self->last_string = NULL;
5004 self->marks = NULL;
5005 self->num_marks = 0;
5006 self->marks_size = 0;
5007 self->buf_size = 0;
5008 self->read = NULL;
5009 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005010 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005011
Tim Peterscba30e22003-02-01 06:24:36 +00005012 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005014
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005015 if (!self->stack)
5016 goto err;
5017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005018 Py_INCREF(f);
5019 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 /* Set read, readline based on type of f */
5022 if (PyFile_Check(f)) {
5023 self->fp = PyFile_AsFile(f);
5024 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005025 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 "I/O operation on closed file");
5027 goto err;
5028 }
5029 self->read_func = read_file;
5030 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005031 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005032 else if (PycStringIO_InputCheck(f)) {
5033 self->fp = NULL;
5034 self->read_func = read_cStringIO;
5035 self->readline_func = readline_cStringIO;
5036 }
5037 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005039 self->fp = NULL;
5040 self->read_func = read_other;
5041 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005043 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5044 (self->read = PyObject_GetAttr(f, read_str)))) {
5045 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005046 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 "argument must have 'read' and "
5048 "'readline' attributes" );
5049 goto err;
5050 }
5051 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005052 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 err:
5057 Py_DECREF((PyObject *)self);
5058 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005059}
5060
5061
5062static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005063get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005065 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005066}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005067
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005068
Guido van Rossum60456fd1997-04-09 17:36:32 +00005069static void
Tim Peterscba30e22003-02-01 06:24:36 +00005070Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005072 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005073 Py_XDECREF(self->readline);
5074 Py_XDECREF(self->read);
5075 Py_XDECREF(self->file);
5076 Py_XDECREF(self->memo);
5077 Py_XDECREF(self->stack);
5078 Py_XDECREF(self->pers_func);
5079 Py_XDECREF(self->arg);
5080 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005081 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 if (self->marks) {
5084 free(self->marks);
5085 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 if (self->buf_size) {
5088 free(self->buf);
5089 }
Tim Peters84e87f32001-03-17 04:50:51 +00005090
Tim Peters3cfe7542003-05-21 21:29:48 +00005091 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005092}
5093
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005094static int
5095Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5096{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005097 Py_VISIT(self->readline);
5098 Py_VISIT(self->read);
5099 Py_VISIT(self->file);
5100 Py_VISIT(self->memo);
5101 Py_VISIT(self->stack);
5102 Py_VISIT(self->pers_func);
5103 Py_VISIT(self->arg);
5104 Py_VISIT(self->last_string);
5105 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005106 return 0;
5107}
5108
5109static int
5110Unpickler_clear(Unpicklerobject *self)
5111{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005112 Py_CLEAR(self->readline);
5113 Py_CLEAR(self->read);
5114 Py_CLEAR(self->file);
5115 Py_CLEAR(self->memo);
5116 Py_CLEAR(self->stack);
5117 Py_CLEAR(self->pers_func);
5118 Py_CLEAR(self->arg);
5119 Py_CLEAR(self->last_string);
5120 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005121 return 0;
5122}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005123
5124static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005125Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126{
5127 if (!strcmp(name, "persistent_load")) {
5128 if (!self->pers_func) {
5129 PyErr_SetString(PyExc_AttributeError, name);
5130 return NULL;
5131 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 Py_INCREF(self->pers_func);
5134 return self->pers_func;
5135 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005137 if (!strcmp(name, "find_global")) {
5138 if (!self->find_class) {
5139 PyErr_SetString(PyExc_AttributeError, name);
5140 return NULL;
5141 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005143 Py_INCREF(self->find_class);
5144 return self->find_class;
5145 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005147 if (!strcmp(name, "memo")) {
5148 if (!self->memo) {
5149 PyErr_SetString(PyExc_AttributeError, name);
5150 return NULL;
5151 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 Py_INCREF(self->memo);
5154 return self->memo;
5155 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005157 if (!strcmp(name, "UnpicklingError")) {
5158 Py_INCREF(UnpicklingError);
5159 return UnpicklingError;
5160 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005162 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005163}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005164
Guido van Rossum60456fd1997-04-09 17:36:32 +00005165
5166static int
Tim Peterscba30e22003-02-01 06:24:36 +00005167Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005170 if (!strcmp(name, "persistent_load")) {
5171 Py_XDECREF(self->pers_func);
5172 self->pers_func = value;
5173 Py_XINCREF(value);
5174 return 0;
5175 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005177 if (!strcmp(name, "find_global")) {
5178 Py_XDECREF(self->find_class);
5179 self->find_class = value;
5180 Py_XINCREF(value);
5181 return 0;
5182 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 if (! value) {
5185 PyErr_SetString(PyExc_TypeError,
5186 "attribute deletion is not supported");
5187 return -1;
5188 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005190 if (strcmp(name, "memo") == 0) {
5191 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005192 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 "memo must be a dictionary");
5194 return -1;
5195 }
5196 Py_XDECREF(self->memo);
5197 self->memo = value;
5198 Py_INCREF(value);
5199 return 0;
5200 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 PyErr_SetString(PyExc_AttributeError, name);
5203 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005204}
5205
Tim Peters5bd2a792003-02-01 16:45:06 +00005206/* ---------------------------------------------------------------------------
5207 * Module-level functions.
5208 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005209
Martin v. Löwis544f1192004-07-27 05:22:33 +00005210/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005211static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005212cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005213{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005214 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 PyObject *ob, *file, *res = NULL;
5216 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005217 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005218
Martin v. Löwis544f1192004-07-27 05:22:33 +00005219 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5220 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005222
Tim Peters5bd2a792003-02-01 16:45:06 +00005223 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005224 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005226 if (dump(pickler, ob) < 0)
5227 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005229 Py_INCREF(Py_None);
5230 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232 finally:
5233 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005236}
5237
5238
Martin v. Löwis544f1192004-07-27 05:22:33 +00005239/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005240static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005241cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005242{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005243 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 PyObject *ob, *file = 0, *res = NULL;
5245 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005246 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005247
Martin v. Löwis544f1192004-07-27 05:22:33 +00005248 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5249 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005250 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251
Tim Peterscba30e22003-02-01 06:24:36 +00005252 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005254
Tim Peters5bd2a792003-02-01 16:45:06 +00005255 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005256 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 if (dump(pickler, ob) < 0)
5259 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005261 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005263 finally:
5264 Py_XDECREF(pickler);
5265 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005267 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005268}
5269
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005270
Tim Peters5bd2a792003-02-01 16:45:06 +00005271/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005272static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005273cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274{
5275 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005276 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005277
Tim Peterscba30e22003-02-01 06:24:36 +00005278 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005279 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005281 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005283 finally:
5284 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005286 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005287}
5288
5289
Tim Peters5bd2a792003-02-01 16:45:06 +00005290/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005292cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005293{
5294 PyObject *ob, *file = 0, *res = NULL;
5295 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005296
Tim Peterscba30e22003-02-01 06:24:36 +00005297 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005299
Tim Peterscba30e22003-02-01 06:24:36 +00005300 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005301 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005302
Tim Peterscba30e22003-02-01 06:24:36 +00005303 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005304 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005306 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308 finally:
5309 Py_XDECREF(file);
5310 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005312 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005313}
5314
5315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005316PyDoc_STRVAR(Unpicklertype__doc__,
5317"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005318
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005319static PyTypeObject Unpicklertype = {
5320 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005321 0, /*ob_size*/
5322 "cPickle.Unpickler", /*tp_name*/
5323 sizeof(Unpicklerobject), /*tp_basicsize*/
5324 0,
5325 (destructor)Unpickler_dealloc, /* tp_dealloc */
5326 0, /* tp_print */
5327 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5328 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5329 0, /* tp_compare */
5330 0, /* tp_repr */
5331 0, /* tp_as_number */
5332 0, /* tp_as_sequence */
5333 0, /* tp_as_mapping */
5334 0, /* tp_hash */
5335 0, /* tp_call */
5336 0, /* tp_str */
5337 0, /* tp_getattro */
5338 0, /* tp_setattro */
5339 0, /* tp_as_buffer */
5340 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5341 Unpicklertype__doc__, /* tp_doc */
5342 (traverseproc)Unpickler_traverse, /* tp_traverse */
5343 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005344};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005345
Guido van Rossum60456fd1997-04-09 17:36:32 +00005346static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005347 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5348 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005349 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005350 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005351 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005352 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005353
Martin v. Löwis544f1192004-07-27 05:22:33 +00005354 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5355 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005356 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005357 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005358 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005359 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005360
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005361 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005362 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005363
Neal Norwitzb0493252002-03-31 14:44:22 +00005364 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005365 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005366
Martin v. Löwis544f1192004-07-27 05:22:33 +00005367 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5368 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005369 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005370 "This takes a file-like object for writing a pickle data stream.\n"
5371 "The optional proto argument tells the pickler to use the given\n"
5372 "protocol; supported protocols are 0, 1, 2. The default\n"
5373 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5374 "only protocol that can be written to a file opened in text\n"
5375 "mode and read back successfully. When using a protocol higher\n"
5376 "than 0, make sure the file is opened in binary mode, both when\n"
5377 "pickling and unpickling.)\n"
5378 "\n"
5379 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5380 "more efficient than protocol 1.\n"
5381 "\n"
5382 "Specifying a negative protocol version selects the highest\n"
5383 "protocol version supported. The higher the protocol used, the\n"
5384 "more recent the version of Python needed to read the pickle\n"
5385 "produced.\n"
5386 "\n"
5387 "The file parameter must have a write() method that accepts a single\n"
5388 "string argument. It can thus be an open file object, a StringIO\n"
5389 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005390 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005391
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005392 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005393 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5394
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005395 { NULL, NULL }
5396};
5397
Guido van Rossum60456fd1997-04-09 17:36:32 +00005398static int
Tim Peterscba30e22003-02-01 06:24:36 +00005399init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005400{
5401 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005402
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005403#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005404
Tim Peters3cfe7542003-05-21 21:29:48 +00005405 if (PyType_Ready(&Unpicklertype) < 0)
5406 return -1;
5407 if (PyType_Ready(&Picklertype) < 0)
5408 return -1;
5409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005410 INIT_STR(__class__);
5411 INIT_STR(__getinitargs__);
5412 INIT_STR(__dict__);
5413 INIT_STR(__getstate__);
5414 INIT_STR(__setstate__);
5415 INIT_STR(__name__);
5416 INIT_STR(__main__);
5417 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005418 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005419 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005420 INIT_STR(append);
5421 INIT_STR(read);
5422 INIT_STR(readline);
5423 INIT_STR(copy_reg);
5424 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005425
Tim Peterscba30e22003-02-01 06:24:36 +00005426 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005427 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005428
Tim Peters1f1b2d22003-02-01 02:16:37 +00005429 /* This is special because we want to use a different
5430 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005431 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005432 if (!dispatch_table) return -1;
5433
5434 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005435 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005436 if (!extension_registry) return -1;
5437
5438 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005439 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005440 if (!inverted_registry) return -1;
5441
5442 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005443 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005444 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005447
Tim Peters731098b2003-02-04 20:56:09 +00005448 if (!(empty_tuple = PyTuple_New(0)))
5449 return -1;
5450
5451 two_tuple = PyTuple_New(2);
5452 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005453 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005454 /* We use this temp container with no regard to refcounts, or to
5455 * keeping containees alive. Exempt from GC, because we don't
5456 * want anything looking at two_tuple() by magic.
5457 */
5458 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005460 /* Ugh */
5461 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5462 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5463 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 if (!( t=PyDict_New())) return -1;
5466 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005467 "def __str__(self):\n"
5468 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5469 Py_file_input,
5470 module_dict, t) )) return -1;
5471 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005474 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005477 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005478
Tim Peterscba30e22003-02-01 06:24:36 +00005479 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005481 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005484 if (!( t=PyDict_New())) return -1;
5485 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005486 "def __str__(self):\n"
5487 " a=self.args\n"
5488 " a=a and type(a[0]) or '(what)'\n"
5489 " return 'Cannot pickle %s objects' % a\n"
5490 , Py_file_input,
5491 module_dict, t) )) return -1;
5492 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005495 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005496 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005500 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005501 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005502 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005503
Martin v. Löwis658009a2002-09-16 17:26:24 +00005504 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5505 UnpicklingError, NULL)))
5506 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005508 if (PyDict_SetItemString(module_dict, "PickleError",
5509 PickleError) < 0)
5510 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005512 if (PyDict_SetItemString(module_dict, "PicklingError",
5513 PicklingError) < 0)
5514 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005516 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5517 UnpicklingError) < 0)
5518 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005520 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5521 UnpickleableError) < 0)
5522 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005524 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5525 BadPickleGet) < 0)
5526 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005528 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005530 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005531}
5532
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005533#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5534#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005535#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005536PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005537initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005538{
5539 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005540 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005541 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005542 PyObject *format_version;
5543 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005545 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005546 Unpicklertype.ob_type = &PyType_Type;
5547 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005549 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005550 * so we're forced to use a temporary dictionary. :(
5551 */
5552 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005553 if (!di) return;
5554 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005556 /* Create the module and add the functions */
5557 m = Py_InitModule4("cPickle", cPickle_methods,
5558 cPickle_module_documentation,
5559 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005560 if (m == NULL)
5561 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005563 /* Add some symbolic constants to the module */
5564 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005565 v = PyString_FromString(rev);
5566 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005567 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005569 /* Copy data from di. Waaa. */
5570 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5571 if (PyObject_SetItem(d, k, v) < 0) {
5572 Py_DECREF(di);
5573 return;
5574 }
5575 }
5576 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005577
Tim Peters8587b3c2003-02-13 15:44:41 +00005578 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5579 if (i < 0)
5580 return;
5581
Tim Peters5b7da392003-02-04 00:21:07 +00005582 /* These are purely informational; no code uses them. */
5583 /* File format version we write. */
5584 format_version = PyString_FromString("2.0");
5585 /* Format versions we can read. */
5586 compatible_formats = Py_BuildValue("[sssss]",
5587 "1.0", /* Original protocol 0 */
5588 "1.1", /* Protocol 0 + INST */
5589 "1.2", /* Original protocol 1 */
5590 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005591 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005592 PyDict_SetItemString(d, "format_version", format_version);
5593 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5594 Py_XDECREF(format_version);
5595 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005596}